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

use*_*050 15 git version-control

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

说我的历史看起来像 -

A
| \ 
B  H
|  |
C  G
|  |
D  F
| /
E
Run Code Online (Sandbox Code Playgroud)

(A作为合并提交.)

git pull --rebase它成为 -

H
|
G
|
F
|
X
|
B
|
C
|
D
|
E
Run Code Online (Sandbox Code Playgroud)

(X作为git pull --rebase我的历史中插入的新提交.) - A被删除.

我知道你可以使用它git rebase --preserve-merges来保存它们git rebase,但是我没有看到用它来保存它们的方法git pull --rebase.

Von*_*onC 32

或者(对于即将推出的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
Run Code Online (Sandbox Code Playgroud)

请参阅66713ef3以获取更多信息(感谢Stephen Haberman):

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

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

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

添加一个--rebase=preserve选项,它将传递--preserve-merges给rebase.

还要preservepull.rebase配置设置的允许值添加' ' .

  • 对于那些使用大量存储库的人来说,它可以在任何地方使用:`git config --global pull.rebase preserve` (5认同)

Mar*_*o F 17

你可以拆分pulla fetch和arebase

git fetch origin master
git rebase origin master --preserve-merges
Run Code Online (Sandbox Code Playgroud)

  • 当然.我应该想到这一点.谢谢 (2认同)

Wei*_*nde 8

只是:

git pull --rebase=preserve
Run Code Online (Sandbox Code Playgroud)

来自文档:

设置为preserve时,使用--preserve-merges传递的选项进行rebase,git rebase以便本地创建的合并提交不会被展平.