分支的变基git rebase
还有一种方法:你可以提取在 C4
中引入的补丁和修改,然后在 C3
的基础上应用一次。 在 Git 中,这种操作就叫做 变基。 你可以使用 rebase
命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。
它的原理是首先找到这两个分支(即当前分支 experiment
、变基操作的目标基底分支 master
)的最近共同祖先 C2
,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3
, 最后以此将之前另存为临时文件的修改依序应用
将 C4
中的修改变基到 C3
上,现在回到 master
分支,进行一次快进合并。
#创建切换到dev分支
$ git checkout -b dev
#修改111.txt文件,提交到仓库
vi 111.txt
$ git add 111.txt
$ git commit -m 22222
#切换到master分支,修改111.txt文件,提交
$ git checkout master
$ vi 111.txt
$ git add 111.txt
$ git commit -m 3333
#切换到dev分支,将dev分支变基到master分支上
$ git checkout dev
$ git rebase master
#如果有冲突需要解决冲突
#可以看到变基的时候会创建一个临时分支,将当前指针放在临时分支上
$ git branch
* (非分支,正变基 dev)
dev
master
#修改冲突
$ vi 111.txt
#添加到index,就是将当前冲突标记为已修改$ git add 111.txt
#不用提交,继续变基(当前还在临时分支上)
$ git rebase --continue
#变基成功后自动切换到当前分支
$ git branch
* dev
master
#切换到master分支,合并到dev分支
$ git checkout master
$ git merge dev
#查看提交日志
$ git log --oneline --graph
* cb09dcb 22222
* d30b184 3333
* 59bee64 init
#dev分支可以删除了
$ git branch -d dev
变基使得提交历史更加整洁。 你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁——例如向某个其他人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master
上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。
请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。