Git笔记(九)-- GIT 高级话题

153 阅读2分钟

GIT 可视化学习网址:oschina.gitee.io/learn-git-b…

多分支 rebase

哥们儿,我们准备了很多分支!咱们把这些分支 rebase 到 master 上吧。

但是你的领导给你提了点要求 —— 他们希望得到有序的提交历史,也就是我们最终的结果应该是 C6' 在 C7' 上面, C5' 在 C6' 上面,依此类推。 可以用多次rebase。 如图:

image.png
执行:

git rebase master bugFix

git rebase bugFix side

git rebase side another

git rebase another master

结果:
image.png

选择父提交记录

操作符 ^ 与 ~ 符一样,后面也可以跟一个数字。

但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个父提交。还记得前面提到过的一个合并提交有两个父提交吧,所以遇到这样的节点时该选择哪条路径就不是很清晰了。

Git 默认选择合并提交的“第一个”父提交,在操作符 ^ 后跟一个数字可以改变这一默认行为。

这里有一个合并提交记录。如果不加数字修改符直接检出 master^,会回到第一个父提交记录。

(在我们的图示中,第一个父提交记录是指合并提交记录正上方的那个提交记录。 ) 如图:

image.png
执行代码

git checkout master^

结果:

image.png
这正是我们都已经习惯的方法。 现在来试试选择另一个父提交…… 执行:

git checkout master^2

结果:

image.png
看见了吧?我们回到了另外一个父提交上。 使用 ^ 和 ~ 可以自由地在提交树中移动,非常给力: 如图: image.png

git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2

结果:
image.png
更厉害的是,这些操作符还支持链式操作!试一下这个:

git checkout HEAD~^2~2

和前面的结果一样,但只用了一条命令。

纠缠不清的分支

哇塞大神!这关我们要来点不同的!

现在我们的 master 分支是比 onetwo 和 three 要多几个提交。出于某种原因,我们需要把 master 分支上最近的几次提交做不同的调整后,分别添加到各个的分支上。one 需要重新排序并删除 C5two 仅需要重排排序,而 three 只需要提交一次。 如图:

image.png
执行:

git checkout one

git cherry-pick C4 C3 C2

git checkout two

git cherry-pick C5 C4 C3 C2

$ git branch -f three C2

结果:

image.png