在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase。

整合分支最容易的方法是 merge 命令。它会把两个分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)进行三方合并,合并的结果是生成一个新的快照(并提交)。
可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上再应用一次。在 Git 中,这种操作就叫做变基。可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上。
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。(译注:写明了 commit id,以便理解,下同)

现在回到 master 分支,进行一次快进合并。
$ git checkout master
$ git merge experiment

这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的,但它们看上去就像是先后串行的一样,提交历史是一条直线没有分叉。
一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁
变基示例

$ git rebase --onto master server client
以上命令的意思是:“取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然
后把它们在 master 分支上重演一遍”。

$ git merge client

$ git rebase master server

$ git checkout master
$ git merge server
至此,client 和 server 分支中的修改都已经整合到主分支里去了,可删除这两个分支,最终提交历史会
变成图最终的提交历史 中的样子:
$ git branch -d client
$ git branch -d server

不要对在你的仓库外有副本的分支执行变基。
本文详细介绍了在Git中如何使用merge和rebase命令整合不同分支的修改。merge通过三方合并保持分支历史,而rebase则通过重演提交历史使分支线性化。尽管结果相同,但rebase提供了更整洁的提交历史。文中还给出了变基和快进合并的具体操作步骤,并强调了不应对已推送到公共仓库的分支执行变基。

被折叠的 条评论
为什么被折叠?



