【问题标题】:Make git pull --rebase preserve merge commits使 git pull --rebase 保留合并提交
【发布时间】:2012-08-08 11:44:08
【问题描述】:

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 来保存它们的方法。

【问题讨论】:

  • 您的意思是要保留修订图的结构? (否则,我不确定 A 应该是什么。)
  • 是的—A 只是合并提交,“将分支 foo 合并到 bar
  • git 1.8.5 将引入一种简洁的方法来保留 pull --rebase 上的合并:请参阅 my answer below
  • 我不明白,为什么这会重新定位本地历史,即使根本没有远程更改,也就是我已经拥有了一切,但想确定一下。想法?

标签: git version-control


【解决方案1】:

更新:正如我在“What exactly does Git's "rebase --preserve-merges" do (and why?)”中介绍的那样,从 Git 2.18(2018 年第二季度)开始,您会更喜欢 new option --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 年原始答案:

或者(对于upcoming git 1.8.5 Q4 2013,现在在 git 1.8.5 中交付,2013-11-27):

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

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

git config pull.rebase preserve

更多信息请见commit 66713ef3(感谢Stephen Haberman):

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

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

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

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

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

【讨论】:

  • 对于那些使用大量存储库的人来说,它可以在任何地方使用:git config --global pull.rebase preserve
【解决方案2】:

您可以将pull 拆分为fetchrebase

git fetch origin master
git rebase origin master --preserve-merges

【讨论】:

  • 对于git-fetch(1) 命令,较新版本的Git 实际上需要这种语法:git fetch origin master
  • 使用--rebase-merges,(--preserve-merges 已弃用)
【解决方案3】:

简单地说:

git pull --rebase=preserve

来自the docs

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

【讨论】:

【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2017-12-25
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多