17

git pull --rebase删除未推送的合并提交。有没有办法让它保存它们?

假设我的历史看起来像——</p>

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

A作为合并提交。)

之后git pull --rebase就变成了——</p>

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

(作为插入到我的历史记录X中的新提交。)— <code>A 被删除。git pull --rebase

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

4

4 回答 4

34

更新:正如我在“ Git 究竟做了什么” rebase --preserve-merges“做什么(以及为什么?) ”中所述,自 Git 2.18(2018 年第二季度)以来,您更喜欢新选项--rebase-merges而不是旧选项--preserve-merge

自那时候起:

所以:

git rebase --interactive --rebase-merges origin/master 
# or
git config pull.rebase merges
git rebase --interactive origin/master (would use rebase-merges)

2013年的原始答案:

或者(对于即将到来的 git 1.8.5 Q4 2013,现在在 git 1.8.5, 2013-11-27 中交付):

" git pull --rebase" 总是选择做沼泽标准的扁平化变基。您可以通过将“ ”配置设置为“”
来告诉它运行“ ”。rebase --preserve-mergespull.rebasepreserve

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

git config pull.rebase preserve

有关更多信息,请参见提交 66713ef3(感谢Stephen Haberman):

拉:允许拉在变基时保留合并

如果用户在 master 上工作,并且已经合并到他们的特性分支中,但现在必须“ git pull”因为 master 移动了,pull.rebase他们的特性分支将被扁平化为 master。

这是因为“ git pull”当前不知道 rebase 的保留合并标志,这将避免这种行为,因为它只会将功能分支的合并提交重播到新的 master 上,而不是重播功能分支中的每个单独的提交。

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

还将“”添加到配置设置preserve的允许值。pull.rebase

于 2013-09-12T05:35:39.743 回答
18

你可以把你分成pull一个fetch和一个rebase

git fetch origin master
git rebase origin master --preserve-merges
于 2012-08-08T11:48:07.410 回答
9

简单地:

git pull --rebase=preserve

文档

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

于 2016-07-27T17:10:23.910 回答
0

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

git fetch origin master
git rebase --interactive --rebase-merges origin/master 
于 2021-04-12T14:45:57.223 回答