背景和说明
为了以后重温git的知识有个mark。以下来自于网上每个文章的git学习,需要注意的是,本人只是将自己的理解记录下来,并不一定会照搬;热烈欢迎大家指正错误,小白一个,难免有错误。谢谢!!!
什么是git
Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目;
什么是版本控制系统
我的理解是:
在个人中:一个人完成一个项目,可能有多个修改的版本,而git就是管理对代码中的修改的,例如版本一为实现加法,版本二为实现加法+减法;那么版本控制系统存储了这两个实现的代码,随时可以回退到只有实现加法的代码,而不是需要自己手动去修改代码,并且更加简洁明了;
在团队中:一群人完成一个项目,同样有多个修改的地方,每个人对这个项目功能的修改都能够存储到,随时可以回退;并且有利于多人协助开发维护;
版本控制工具
版本控制系统,那肯定需要一个工具来实现,这就是版本控制工具;其实现版本控制工具的架构分为:集中式,分布式;
集中式版本控制工具:CVS、SVN(Subversion)、VSS……都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
分布式版本控制工具:Git、Mercurial、Bazaar、Darcs……像 Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
实际上,作为一名初学者来说,无法理解上面两者的区别。我查阅了不少文章,发现最大的区别在于是否必须要一个中心的服务器。总结如下
1.是否必须要*服务器;
2.每个人可见的代码是否含有完整的项目(包括历史记录等);
3.交互的方式是从一服务器分发到所有,还是每个个体都可以作为服务器;
git工作机制
git相关远程库
远程库又叫代码托管中心;基于网络区分如下:
局域网:GitLab
互联网:GitHub(外网)Gitee码云(国内网站)
git安装
下载地址:
https://git-scm.com/downloads
以下安装步骤参考了:
https://zhuanlan.zhihu.com/p/607970211
进入官网如下所示:
A
B
C
D
E
测试git是否安装
设置用户签名
为啥需要设置用户签名?
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看
到,以此确认本次提交是谁做的。并且Git 首次安装必须设置一下用户签名,否则无法提交代码。
需要注意的是:
这个用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。 # 设置用户签名
$ git config --global user.name 用户名
$ git config --global user.email 邮箱
本身已经设置了我,使用一下命令查看用户签名
# 查看用户签名
$ git config user.name
$ git config user.email
本地库的相关操作
当安装好git,并且设置好用户签名之后,我们就可以使用一个文件模拟为一个项目,进行对该项目的相关操作了。
初始化本地库
# 初始化本地库
$ git init
所谓初始化本地库,指的是git对让本地的某个目录拥有管理权。
这个时候就可以在这个目录下创建一个表示项目的文件了:
查看本地库状态
# 查看本地库状态
$ git status
输入以上命令即可以查看所在目录的本地项目的状态
添加到暂存区
# 添加到暂存区
$ git add 要添加到暂存区的文件名
当我们对文件进行了修改之后,可以将文件的修改添加到暂存区
提交到本地库
# 提交到本地库
$ git commit -m "日志信息" 文件名
当文件提交到本地库之后,文件就已经被修改了
撤销添加到暂存区
如果在前面的步骤中,对文件更改添加到暂存区反悔了,可以撤销更改,命令如下:
# 恢复或放弃对文件的更改,将文件恢复到之前最近一次更改前的状态
$ git restore 文件名
查看提交记录
# 显示所有提交过的版本信息,不包括已经被删除的
$ git log
# 显示所有的操作记录,包括提交,回退的操作,包括已经被删除的
$ git reflog
# 只会显示版本号和提交时的备注信息
$ git reflog --pretty=oneline
将文件多次修改并且提交到工作区,那么就会存在多个提交记录如下:
回到任一时期的版本
通过查看提交记录获取到版本号,可以回到任一时期的版本内容
# 回到指定版本号的时期
$ git reset --hard 版本号前七位
当然也可以只回退几个版本前
$ git reset --hard head #当前版本
$ git reset --hard HEAD^ #回退到上一个版本
$ git reset --hard HEAD^^ #回退到上上一个版本
$ git reset --hard HEAD~3 #回退到往上3个版本
$ git reset --hard HEAD~10 #回退到往上10个版本
注意这个HEAD是git中的指针,此处请查看官网,我也是一知半解
分支的相关操作
分支概述
官网对于分支的简介:官网分支
分支在项目中是对一个项目的不同功能的开发互不影响的,例如a分支是语音功能,b分支是游戏功能,他们可以同时开发,当项目最终要完成的时候就可以合并在一起互不相影响并且完成好了。
以下是chatgpt3.5版本对于分支的理解:
创建分支
# 创建某个分支(创建之后HEAD指针还是处于原先分支上)
$ git branch 要创建的分支名
# 新建并切换至新分支
$ git checkout -b 要创建的分支名
git checkout -b这个命令等价于下面这两个命令
# 创建某个分支(创建之后还是处于原先分支上)
$ git branch 要创建的分支名
# 切换至新分支
$ git checkout 创建的分支名
查看分支
# 查看本地所有分支
$ git branch
# 查看本地和远程所有分支
$ git branch -a
# 查看远程所有分支
$ git branch -r
# 列出所有本地分支及其关联的最新提交ID和提交说明。
$ git branch -v
切换分支
# 切换分支
$ git checkout 要切换的分支名
修改分支
# 为当前分支改名
$ git branch -m 新的分支名
# 将原分支名改为新的分支名(新的分支不存在)
$ git branch -m 原分支名 新的分支名
# 将原分支名改为新的分支名(强制执行分支改名操作)
$ git branch -M 原分支名 新的分支名
注意:使用-M参数的命令,如果新的分支名本身就有一样的分支名存在,那么这个命令会覆盖掉目标分支上的所有内容,包括未提交和未保存的修改。
删除分支
# 删除本地指定分支
$ git branch -d 要删除的分支名
$ git branch --delete 要删除的分支名
# 强制删除本地分支(忽略该分支是否已经被合并)
$ git branch -D 要删除的分支名
$ git branch --delete --force 要删除的分支名
# 删除远程指定分支
$ git push 远程版本库的名称或URL --delete 要删除的远程分支名
$ git push 远程版本库的名称或URL -d 要删除的远程分支名
以上涉及的分支增删改查操作,参考如下:
https://www.bookstack.cn/read/git-tutorial/docs-commands-git-branch.md
git branch用法总结,查看、新建、删除、重命名
git进行版本回退(文件恢复、恢复误提交、已提交)
chatgpt3.5
合并分支
# 将指定的分支合并到当前所在的分支中
$ git merge 要合并的分支名
# 与上一个命令的作用相同,但它会强制 Git 创建一个新的提交对象,
# 并将合并结果保存在该提交对象中。这样可以保留完整的分支历史记录,
# 方便后续的代码维护和撤销操作。
$ git merge --no-ff 要合并的分支名
# 这个命令不常用,将当前分支的修改“移动”到指定分支之上,并且使提交历史记录更加清晰。
$ git rebase 要合并的分支名
合并分支分为正常合并分支,和有冲突的合并分支。
正常合并分支:
合并冲突分支:
模拟冲突分支情况:
解决冲突分支:
上面图片演示的是不同分支的同一文件的同一位置内容不一样导致的冲突合并,其实还有其它的情况会出现,此处参考gpt3.5:
分支合并时会出现冲突的情况,是因为多个分支对同一个文件或同一段代码进行了不同的修改,Git 无法自动确定要接受哪种修改。这种情况下,就会产生冲突。
冲突通常发生在以下情况:1.同一文件的不同部分被同时修改:当两个分支都修改了同一个文件的相同区域,但修改的内容不同,Git 就无法自动合并它们的修改,因为无法判断应该保留哪个版本的修改。
2.删除与修改冲突:当一个分支删除了一个文件或某些代码,而另一个分支修改了该文件或代码,Git 无法确定是应该保留删除操作还是保留修改操作。
3.合并基础不连续:如果两个要合并的分支在它们的共同祖先之后,在相同的地方进行了修改,Git 无法找到一条明确的路径来合并这些修改。
当 Git 检测到冲突时,会在合并过程中停下来,并将包含冲突的文件标记为未解决状态。这时需要手动解决冲突,编辑文件以保留希望的更改,并删除不需要的部分。解决冲突后,需要将修改后的文件重新添加到暂存区,并提交合并的结果。
终止撤销合并分支
当在操作合并分支的时候,有可能会出现合并报错,此时可以采用终止这次合并,并且撤销此次合并的方式来重新合并。
# 中止合并
$ git merge --abort
# 撤销合并
$ git reset --merge
参考:
解决Git报错:error: You have not concluded your merge
git:You have not concluded your merge
远程库的相关操作
下面就该说git跟远程库交互的相关操作了。
github相关
网址是这个: https://github.com/
注册账号:
界面相关介绍
根据翻译来说,只能理解表层意思, 解释如下:
Repository(仓库):存放项目代码的地方,可以开源也可以私有
Issue(问题):问题的意思是,在Repository中的开源的项目代码,他人看到有bug或者疑惑,就可以提问问你
Star(星星):项目的点赞量,也可以理解成收藏,点击别人项目的star后相当于收藏
Fork(分叉):可理解分支。指对一个开源项目创建一个自己的仓库副本,可以在自己的账户下独立地修改和扩展源仓库的内容,而不会影响原始仓库。
Pull Request(拉取请求):如果你在 Fork 的仓库中对代码进行了修改并希望将修改合并到源仓库中,就可以创建一个 Pull Request。这样源仓库的维护者就可以查看你的修改,并决定是否接受并合并你的更改。
Watch(关注):当你关注一个仓库时,你将接收到该仓库的更新通知。这可以帮助你跟踪仓库的动态,包括新的提交、拉取请求、问题等。
Gist(代码片段):用于创建和分享代码片段的工具。你可以在 Gist 上创建一个包含代码和说明的文件,并将其公开或与他人共享。
参考
GitHub 详细教程
gpt3.5
创建远程库
此处创建一个git-demo的仓库跟前面本地库是一样的文件夹名字,且为公有,其他的选项也是默认没有的
创建之后显示如下界面:
给git配置远程库和别名
配置之前需要查看下有没有配置其他远程库,命令:
# 查看当前仓库关联的所有远程仓库的名称
$ git remote
# 查看当前所有远程地址别名
# 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
$ git remote -v
为git配置远程库并设置别名
# 将一个新的远程代码仓库添加到本地仓库
$ git remote add 别名 远程地址
上面是使用https链接配置的远程库,当然也是可以使用ssh链接配置,命令是一样的只是链接不一样而已
参考:Git 远程仓库(Github)配置、创建、连接、删除
推送本地分支到远程库
命令如下:
# 将本地分支推送到远程库
$ git push 远程库链接或者别名 要推送的本地分支名
更新远程库到本地库
其命令有三个,适用于不同的场景,命令如下:
# 获取最新代码,更新本地远程分支跟踪信息,但不自动进行合并操作
# 如果不指定要拉取的远程分支名,那么会更新全部
$ git fetch 远程库链接或者别名 要拉取的远程分支名
# 该命令会将上次执行git fetch命令拉取下来的最新内容合并到当前所在的分支中
$ git merge FETCH_HEAD
# 获取最新代码,更新本地远程分支跟踪信息,并合并到当前分支
$ git pull 远程库链接或者别名 要拉取的远程分支名
# 获取最新代码,更新本地远程分支跟踪信息,并合并到指定的分支
$ git pull 远程库链接或者别名 远程分支名:本地分支名
# 克隆整个远程仓库到本地,并自动进行一次完整的 git fetch 操作
$ git clone 远程库链接
# 克隆指定分支的远程仓库到本地:
$ git clone -b 指定分支名 远程库链接
需要注意的点如下:
1.git fetch 只会将远程分支的最新提交下载到本地,并更新远程分支的引用,不进行合并本地库代码操作,是比较谨慎的更新;2.git pull 会将从远程仓库获取最新的代码,并将其合并到当前分支或者指定的本地库分支,是快速的更新;
3.git pull = git fetch + git merge;
4.git clone 这个命令是从远程仓库创建一个全新的本地仓库。而git pull 和 git fetch 都是从已经存在的远程仓库获取代码。这是不同的概念,一个是从无到有,另一个是从有到更新,是容易混淆的。
参考:
https://www.cnblogs.com/runnerjack/p/9342362.html
https://juejin.cn/post/7182084934013321272
chatgpt3.5
使用git pull命令:
使用git fetch命令:
注意,使用git fetch这个命令会返回一个引用FETCH_HEAD,这个引用指向最新获取的代码的提交记录。
那么就可以查看提交记录,使用如下命令:
# 查看从远程仓库获取的最新代码的提交历史,并显示每个提交的具体变更内容
# 执行后进入 Git 的日志查看界面,按下键盘上的 Q 键(大写),即可返回到命令行界面。
$ git log -p FETCH_HEAD
邀请他人加入项目
git配置ssh登录github
在前面push本地分支到远程库中,我们需要登录github账号才能够push,如果每次push都要登录账号就会显得很麻烦,所以可以选择ssh登录的方式,这样就不需要频繁的登录账号进行push,当然并不是绝对的,毕竟push的应用场景并不是很多咯。
git生成秘钥的命令如下:
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
命令说明:
需要注意的点:这个地方的邮件地址最好是跟github注册地址一样,虽然只是注释的邮件地址,但是可以避免可能出现的权限和兼容性问题。ssh-keygen:用于生成 SSH 密钥。
-t rsa:指定生成 RSA 类型的密钥。
-b 4096:指定密钥的位数为 4096,提供更高的安全性(可选)。
-C “your_email@example.com”:指定注释,一般为你的电子邮件地址。
以下为步骤:
第一步:生成秘钥
第二步:将公钥放在github上
第三步:验证是否设置成功
输入:
ssh -T git@github.com
像上面我是第一次连接,所以需要输入个yes确认第一次连接。You’ve successfully authenticated出现表明设置成功
对于ssh验证的原理请参考:
Github配置ssh key的步骤(大白话+包含原理解释)
chatgpt3.5
在idea中操作git
配置 git 忽略文件
配置git忽略文件的原因:
配置 Git 忽略文件配置 Git 忽略文件是为了告诉 Git 哪些文件或目录在版本控制中应该被忽略,不纳入到 Git的跟踪和管理之下。这样可以避免将一些不必要的、临时的或敏感的文件无意间提交到版本库中,从而降低项目管理的复杂性和风险。确保版本控制系统只关注与项目开发和维护相关的文件,减少不必要的文件变动和冲突,提高版本管理的效率和可靠性。
忽略文件,涉及的:
忽略文件内容:
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
# .igconfig文件添加的内容:
[core]
excludesfile =git.ignore文件路径
配置方法如下:
关于git忽略文件详细内容,请参考:
Git忽略文件.gitignore详解
idea中配置git
idea中初始化git项目
使用idea添加暂存区和提交本地库
添加到暂存区操作如下:
如果git配置了忽略文件的话,那么一些设定的一些文件是不会添加到暂存区的,也就意味着其颜色还是原来idea显示的颜色,如我这里的:
在idea中当某个文件已经添加到暂存区,那么之后对该文件的修改,不需要再进行添加到暂存区这个步骤了,因为默认是已经添加到暂存区了, 更改文件之后只需要执行提交到本地库操作,这是跟之前只在git上操作的不同点。
提交到本地库操作如下:
方式一:
方式二:
由上得知:
git接管的项目在idea中,未添加到本地库的文件是红色的,添加到暂存区后的文件是蓝色的,提交到本地库的文件是正常的颜色的
idea中查看版本信息
idea中切换版本
idea中创建分支
方式一:
方式二:
idea中切换分支
切换之前,可以查看当前所在的分支:
切换分支:
idea中合并分支
合并正常的分支:a
b
合并有冲突的分支:
a
b
c
idea集成github
查看idea中是否有github插件
idea中设置github账号
方式一:直接登录
方式一大概率是不成功的,所以一般采用方式二。。。。。
方式二:口令登录
a
b
c
idea中推送本地项目到github
idea中推送本地代码到github
以上推送步骤是在测试教程中实现的,实际协同合作中,需要先pull也就是先拉取远程代码到本地,然后再push到远程库,以防远程库的修改跟本地库的修改有冲突而导致推送失败的问题
idea中拉取远程代码到本地
idea中克隆远程代码到本地
特别鸣谢
尚硅谷