git rebase和merge --no-ff有什么区别?

25

两种方法似乎都旨在清除历史记录:

所以,如果我已经对一个特性分支进行了 rebase,当合并回主分支时,是否仍需要使用 --no-ff

更新:

看起来有些人混淆了变基(rebase)、快进(fast forward)和非快进(non fast forward)合并,基本上这个链接中的图示(图3.28) http://git-scm.com/book/zh/v2/Git-分支-变基 显示常规合并结果与此链接的顶部答案中的合并 --no-ff 结果相同 为什么 Git 默认使用快进合并(fast-forward merging)?


这个链接可能会有所帮助:https://dev59.com/z3E85IYBdhLWcg3wSxcv - Özgür Eroğlu
在这个链接http://git-scm.com/book/en/Git-Branching-Rebasing中,关于rebase、fast forward和non fast forward merging之间存在混淆。正常合并的结果(图3.28)与顶部答案的解释(参见图表)https://dev59.com/z3E85IYBdhLWcg3wSxcv相矛盾。 - James Lin
2个回答

27
这取决于你想要你的历史记录看起来如何。
一个非常简单的例子:

git merge --no-ff

*   33ad16c (HEAD, master) Merge branch 'feature-1'
|\  
| * e61c6a6 Various bug fixes
| * e15a356 Started feature
|/  
* 38b8ada Initial commit

Git 变基

* e61c6a6 (HEAD, master) Various bug fixes
* e15a356 Started feature
* 38b8ada Initial commit

这两个历史记录反映了完全相同的提交,但使用 --no-ff,第一个历史记录清楚地显示了其中2个提交实际上是同一组工作的一部分。这使您可以确切地知道哪些工作被纳入了哪些功能中。这使得在撤消更改或导航历史记录时更容易获得上下文。
rebase 历史记录没有显示这种区别,并且无法看到任何工作的分组。它使得看起来像每个人都在向主分支提交代码。
使用 --no-ff 获取的空合并提交还提供了一个有用的位置来放置提交消息,而普通提交则没有易于说“此提交合并了 feature-x 的工作”的地方,这对历史记录也是有帮助的。

无法看到任何工作分组... 当然,如果您正在使用它们(这具有其他好处),您可以使用票证编号标记相关的提交消息。 - joel

12

一般来说,如果你要合并一些功能分支,你希望使用 --no-ff强制 创建一个明确的合并提交。

如果你只是在某个分支上进行工作,通常希望 避免 由于 git pull 而产生的合并提交。因此,你会使用 git rebase 或者 git pull --rebase创建一个合并提交,并获得一个干净的历史记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接