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

问题描述 投票:0回答:2

这两种方法似乎都有相同的目的,即拥有干净的历史记录:

那么,如果我已经在功能分支上完成了变基,那么在合并回主分支时我还需要

--no-ff
吗?

更新:

在我看来,变基、快进和非快进合并之间存在混淆,基本上是此链接中的图表(图 3.28)http://git-scm.com/book/en/Git-Branching-Rebasing显示正常合并结果与此链接顶部答案中的 merge --no-ff 相同为什么 git 默认执行快进合并?

git git-merge git-rebase
2个回答
32
投票

这取决于您希望您的历史记录如何显示。

一个非常简单的例子:

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 个提交实际上是同一组工作的一部分。这使您可以准确地知道哪些工作涉及哪些功能。这使得回滚更改或在浏览历史记录时为自己提供上下文变得更加容易。

变基历史没有显示这种区别,因此无法看到任何工作分组。这使得看起来每个人都致力于掌握。

使用

--no-ff
获得的空合并提交还提供了一个有用的位置来挂起提交消息,而普通提交则无法让您轻松地说“此提交合并到功能 x 的工作中”,这又很有帮助为了历史


14
投票

通常,如果您合并某些功能分支,您希望使用

--no-ff
强制创建显式合并提交。

如果您只是在某个分支上工作,您通常希望避免合并可能由

git pull
产生的提交。因此,您使用
git rebase
git pull --rebase
not 创建合并提交并获得干净的历史记录。

© www.soinside.com 2019 - 2024. All rights reserved.