初始效果:
- 提交:commit
git commit
效果:箭头指向从c2到了c1
- 新建一个分支:branch
git branch bugFix
效果:master下多了一个bugFix分支
- 此时我们试着使用commit提交一下当前分支
git branch bugFix
git commit
我们想要使用新建的bugFix分支,但是为什么把master提取了出来呢,因为之前新建bugFix的时候没有把当前分支定位到新建的bugFix上
- 我们可以使用checkout来把指针指向想要的分支
git branch bugFix
git checkout bugFix
git commit
当使用checkout定向到bugFix后,我们就可以使用commit来提交分支了
- 分支的合并一:merge
git branch bugFix
git checkout bugFix
git commit
git checkout master
git commit
git merge bugFix
要注意,我们在合并的时候分支一定是要检出到目标分支,然后指令输入我们需要合并的分支,如果我们指针恰好就在目标分支上,则无法进行合并(自己和自己无法合并):
- 分支的合并二:rebase
git branch bugFix
git checkout bugFix
git commit
git checkout master
git commit
git checkout bugFix
git rebase master
此时两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。咱们就可以用 git rebase 实现此目标(此时原来的c2分支没有消失,只是变透明了)
现在唯一的问题就是 master 还没有更新,下面咱们就来更新它吧……
git branch bugFix
git checkout bugFix
git commit
git checkout master
git commit
git checkout bugFix
git rebase master
git checkout master
git rebase bugFix
现在我们就得到了最新的master分支。由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。
- 分离:HEAD
HEAD是一个对当前检出记录的符号引用
git checkout c1
分离的head就是我们使用checkout的时候定位的是某个具体的提交记录而不是分支(个人理解和意义类似,只不过有时候HEAD可以使用命令行,而无法在命令行中体现)
head -> master -> C1变成head -> C1
- 相对引用:^、~
^是让 Git 寻找指定提交记录的父提交。(退一步)
git commit
git checkout master^
如果想在提交树上移动很多步的话,敲很多次^会很麻烦,这时就可以使用~可以在提交树上移动很多步
git commit
git commit
git commit
git checkout HEAD~4
有时候分支建立多了想要退回到之前的分支上时即可使用强制分支移动到目标位置
git branch -f bugFix HEAD~3
此处bugFix为想要退回的分支,之后直接使用HEAD~(想要退回的步数)即可退回
- 小练习
我们现在初始化一下初始效果
git branch bugFix
git commit
git checkout bugFix
git commit
git checkout master
git commit
git checkout bugFix
git commit
git commit
git branch -f bugFix HEAD~1
git checkout c2
目标效果:
如何实现呢,命令如下:
git checkout master
git rebase c6
接下来继续输入退步的命令行即可
git branch -f master HEAD~2
git branch -f bugFix HEAD~4
git checkout c1
- 撤销变更:reset、revert
reset 通过把分支记录回退几个提交记录来实现撤销改动。可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
我们先把节点提交一次
git commit
此时想要插销一步commit的话即可使用git reset
git commit
git reset HEAD~1
虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对多人一起使用的远程分支是无效的哦!为了撤销更改并分享给别人,我们需要使用 git revert。
同样提交一次commit初始分支节点,如果想要在公共分支上想要撤回则需要输入:
git commit
git revert HEAD
为何这段指令不仅没有撤销反而,在我们要撤销的提交记录后面居然多了一个新提交?
这是因为新提交记录 C2’ 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2’ 的状态与 C1 是相同的。