使用git rebase编辑合并提交

vas*_*kch 53 git rebase

在我提交的Git中,例如.A - B - C我想编辑B提交,我

  • git rebase -i <A-commit-hash>,
  • 在列表中我editBcommit 前写命令,
  • B提交后,git rebase会立即停止,因此我可以修复任何我想要的东西git commit --amend,
  • 然后我继续使用git rebase --continue.

据我所知,这是如何做到这一点的最佳实践.使用这种方法,我可以编辑过去的任何提交(只要它还没有被推送到远程分支),而且使用-p标志我甚至可以保留合并.这太棒了.

我目前的问题是:我在合并提交中的一行上做了一个错误(拼写错误)(当合并两个分支时解决冲突).

我想解决它,但我不知道如何git rebase停止合并提交.该git rebase -p -i <blah>列表忽略了合并提交,所以我不能edit在它前面写命令并git rebase停在那里让我编辑它.

有什么帮助吗?我只想在合并提交中修复此行,同时保留它之后的所有提交(和合并).

谢谢.

Ric*_*sen 79

当涉及合并时,Git不容易进行交互式rebase.该-p选项在-i内部使用该机制,因此将两者混合起来并不起作用.

然而,git rebase这只是一种自动化的方式来做很多樱桃选择.您可以通过手动挑选来复制其行为,以获得对该过程的更多控制.它不太方便,更容易出现人为错误,但可能.

这是我建议的方法:

  1. 用于在合并git rebase进入提交(合并的子代)
  2. 用于git reset --hard HEAD^手动进入合并
  3. 用于git commit --amend修复合并
  4. 用于git cherry-pick在合并后返回提交
  5. 使用git rebase --continue

以下是具体步骤:

  1. 请注意要修改的合并提交的SHA1 ID.为了讨论,假设它是deadbeef.
  2. 在要修改的合并提交(合并提交的子项)之后,请注意提交的SHA1 ID.假设它是facef00d.
  3. git rebase -i deadbeef.
  4. 选择facef00d进行编辑.
  5. 当rebase返回到编辑提示时facef00d,运行git reset --hard HEAD^.你现在应该在deadbeef(git rev-parse HEAD应该打印deadbeef).
  6. 进行编辑以修复不正确的合并冲突并用于git add暂存它们.
  7. 运行git commit --amend以将阶段修复与不良合并提交融合.结果现在将具有不同的SHA1(不是deadbeef).
  8. 运行git cherry-pick facef00d以将更改应用于facef00d固定合并提交.
  9. 运行git rebase --continue来完成.

  • 尼斯.我不是指过程,而是描述.:d (4认同)
  • 所以基本上我用`git rebase`来到`facef00d`,然后我到'deadbeef` _manually_,修复我需要的东西,然后回到`facef00d`来完成变基.我在谷歌上搜索了几个小时,一无所获.谢谢! (2认同)
  • @vsechnech:没错.我喜欢你的高级描述,所以我修改了我的答案以包含它. (2认同)
  • 太好了!请注意,注意SHA1值的一种简单方法是在它们上创建临时分支或标记. (2认同)
  • @Cuadue:如果有未提交的工作,`rebase`拒绝运行,因此如果您遵循此过程,则不存在破坏未提交工作的风险. (2认同)

Ram*_*man 6

现在有了--rebase-mergesGit 2.22 及更高版本中可用的选项,这变得容易多了。此选项保留合并拓扑,并与交互式变基一起使用。

它看起来像这样,假设B是要修改的合并提交:

label onto

... some branch definitions ...

reset onto
merge -C B branch-name # Merge branch 'B' into whatever
pick C
Run Code Online (Sandbox Code Playgroud)

您现在可以在和之间插入一个b(或break):mergepick

merge -C B branch-name # Merge branch 'xyz' into whatever
break
pick C
Run Code Online (Sandbox Code Playgroud)

在中断commit --amend合并,然后继续变基。

这也适用于修复提交。例如,假设带有合并修复程序的提交是D. 您可以在合并提交后立即将修复提交 D 移动到:

merge -C B branch-name # Merge branch 'xyz' into whatever
fixup D
pick C
Run Code Online (Sandbox Code Playgroud)

请参阅git-merge 手册页的变基合并部分。