make git pull --rebase保留合并提交

时间:2012-08-08 11:44:09

标签: git version-control

git pull --rebase删除未压缩的合并提交。有没有办法让它保存下来?

说我的历史看起来像 -

A
| \ 
B  H
|  |
C  G
|  |
D  F
| /
E

A是合并提交。)

git pull --rebase成为 -

之后
H
|
G
|
F
|
X
|
B
|
C
|
D
|
E

X是我的历史记录中插入的新提交git pull --rebase。) - A已删除。

我知道您可以使用git rebase --preserve-merges使用git rebase保留它们,但我看不到使用git pull --rebase保留它们的方法。

4 个答案:

答案 0 :(得分:31)

或者(对于upcoming git 1.8.5 Q4 2013,现在以git 1.8.5,2013-11-27发布):

  

" git pull --rebase"总是选择做沼泽标准的扁平变形   您可以告诉它运行" rebase --preserve-merges"通过设置" pull.rebase"配置为" preserve"。

因此,一个简单的配置就足以确保您的pull --rebase确实保留合并:

git config pull.rebase preserve

有关详情,请参阅commit 66713ef3(感谢Stephen Haberman):

pull:允许pull在重新定位时保留合并

  

如果用户正在使用master,并已在其功能分支中合并,但现在必须" git pull"因为大师移动了,pull.rebase他们的功能分支将被夷为平地。

     

这是因为" git pull"目前还不知道rebase的保留合并标志,这会避免这种行为,因为它只会重放功能分支到新主服务器的合并提交,而不会重放功能分支中的每个单独提交。 / p>      

添加--rebase=preserve选项,该选项会将--preserve-merges传递给rebase。

     

同时添加' preserve'到pull.rebase配置设置的允许值。

答案 1 :(得分:17)

您可以在pullfetch

中拆分rebase
git fetch origin master
git rebase origin master --preserve-merges

答案 2 :(得分:8)

简单地:

git pull --rebase=preserve

来自the docs

  

设置为preserve时,将--preserve-merges选项的rebase传递给git rebase,以便本地创建的合并提交不会被展平。

答案 3 :(得分:0)

git v2.22.0 起,--preserve-merges 选项已被弃用,取而代之的是 --rebase-merges(与 --interactive option 结合使用)以在另一个基本提示之上重新应用提交git-rebase

git fetch origin master
git rebase --interactive --rebase-merges origin/master