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

1 rebase


git rebase master
它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用

image.png

2 变基的风险

要用它得遵守一条准则:
不要对在你的仓库外有副本的分支执行变基。

sourcetree 提示
image.png
**

3 变基-合并远程分支

手动 先 git fetch,再 git rebase origin/master
自动 git pull —rebase

变基 vs. 合并

至此,你已在实战中学习了变基和合并的用法,你一定会想问,到底哪种方式更好。 在回答这个问题之前,让我们退后一步,想讨论一下提交历史到底意味着什么。
有一种观点认为,仓库的提交历史即是 记录实际发生过什么。 它是针对历史的文档,本身就有价值,不能乱改。 从这个角度看来,改变提交历史是一种亵渎,你使用谎言掩盖了实际发生过的事情。 如果由合并产生的提交历史是一团糟怎么办? 既然事实就是如此,那么这些痕迹就应该被保留下来,让后人能够查阅。
另一种观点则正好相反,他们认为提交历史是 项目过程中发生的事。 没人会出版一本书的第一版草稿,软件维护手册也是需要反复修订才能方便使用。 持这一观点的人会使用 rebase 及 filter-branch 等工具来编写故事,怎么方便后来的读者就怎么写。
现在,让我们回到之前的问题上来,到底合并还是变基好?希望你能明白,这并没有一个简单的答案。 Git 是一个非常强大的工具,它允许你对提交历史做许多事情,但每个团队、每个项目对此的需求并不相同。 既然你已经分别学习了两者的用法,相信你能够根据实际情况作出明智的选择。
总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。

更多参考

使用git rebase合并多次commit
Git Rebase原理以及黄金准则详解
你们仍未掌握那天所学的 git 知识
vue Git commits历史是如何做到如此清爽的?

4 rebase 误操作后处理

本来想rebase关联的远程分支,但是命令打错了 git rebase origin branch1,导致以远程master为基准操作。
命令应该是git reabse origin/branch1,,,操作错误以后千万不能往远程push

4.1 git reflog 查看操作记录

image.png

HEAD@{17} 是我rebase操作前的最后一次提交
HEAD@{16} : reabse :checkout origin 是rebase的操作,很清楚,以origin/master 为基准开发变基

4.2 git reset —hard

执行 git reset —hard HEAD@{17}
image.png

image.png

现在回到变基前的版本了,nice
然后再git rebase origin/branch1正确变基

参考这片文章