变基操作详解 git rebase git pull --rebase <origin/master>

前言: 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase。 什么是“变基”,怎样使用“变基”,就我学习与大家做一下分享,参考。
金科玉律:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

一丶merge合并分叉

  • 开发任务分叉到两个不同分支,又各自提交了更新,如图:
    变基操作详解 git rebase git pull --rebase <origin/master>_第1张图片

  • 使用merge整合分叉历史,他会把两个分支的最新快照C3,C4和二者最近的共同祖先C2进行三方合并,合并的结果生成一个新的快照并提交。如图所示:变基操作详解 git rebase git pull --rebase <origin/master>_第2张图片

二丶rebase变基整合

  • 变基操作,提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次,可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样,如果所示:
    git checkout experiment
    git rebase master
    

变基操作详解 git rebase git pull --rebase <origin/master>_第3张图片

  • 回到master分支上,进行一次快速合并。(快速合并是指当master分支移动指针便可以达到最新分支),如果所示:

    git checkout master
    git merge experiment
    

    变基操作详解 git rebase git pull --rebase <origin/master>_第4张图片
    注意优势:

  • C4’ 指向的快照就和 merge三方合并中 C5 指向的快照一模一样。

  • 最终结果没有任何区别,但是变基使得提交历史更加整洁。

  • 查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的, 但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。

    应用: 目的是为了确保在向远程分支推送时能保持提交历史的整洁——例如向某个其他人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master 上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可

三丶变基例子图解

前提:对两个分支进行变基时,所生成的“重放”并不一定要在目标分支上应用,你也可以指定另外的一个分支进行应用

  1. 例子:创建了一个主题分支 server,为服务端添加了一些功能,提交了 C3 和 C4。 然后从 C3 上创建了主题分支 client,为客户端添加了一些功能,提交了 C8 和 C9。 最后,你回到 server 分支,又提交了 C10。如图:
    变基操作详解 git rebase git pull --rebase <origin/master>_第5张图片
  2. 将 client 中的修改合并到主分支并发布,但暂时并不想合并 server 中的修改。截取主题分支上的另一个主题分支,然后变基到其他分支
    #取出 client 分支,找出它从 server 分支分歧之后的补丁,
    # 然后把这些补丁在 master 分支上重放一遍,让 client 看起来
    #像直接基于 master 修改一样
    git rebase --onto master server client
    
    变基操作详解 git rebase git pull --rebase <origin/master>_第6张图片
  3. 快进合并master分支,使之包含来自client分支的修改
    git rcheckout master
    git merge client
    
  4. 将 server 分支中的修改也整合进来。 使用 git rebase < basebranch> < topicbranch> 命令可以直接将主题分支 (即本例中的 server)变基到目标分支(即 master)上。 这样做能省去你先切换到 server 分支,再对其执行变基命令的多个步骤。 如图 将 server 中的修改变基到 master 上 所示,server 中的代码被“续”到了 master 后面。之后再合并,然后删除分支。最终提交历史如图所示。
    git rebase master server
    git checkout master
    git merge server
    git branch -d client
    git branch -d server
    

变基操作详解 git rebase git pull --rebase <origin/master>_第7张图片
变基操作详解 git rebase git pull --rebase <origin/master>_第8张图片

四丶金科玉律

如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

  • 变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。 如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时,如果你用 git rebase 命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟。
  • 总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利
  • 如果要对已经push的commit使用变基的话,务必通知每个人执行git pull --rebase

你可能感兴趣的:(GIT,git)