有没有办法在git rebase中自动丢弃修订的提交?

时间:2020-07-06 01:38:38

标签: git rebase

以下情况是我在使用Git时不时发生的情况。我从两个分支的线性历史开始。师父当前指向C。分支A是我要我的同事合并为师父的分支,而分支B的未完成工作尚未公开。

 C
  \ 
   A - B

在代码审查期间,我的同事注意到分支A的最后一个提交中有一个错字。我不是为了修正错字而创建新的提交,而是修改了有问题的提交,然后将其合并到master中。大师现在指向A',这是纠正错字的提交。

C - A'
 \
   A - B

下一步是重新整理未完成的工作。我希望最终结果看起来像这样:

C - A'
     \
      B

但是,默认情况下,Git假定A和A'是完全不相关的提交,而是尝试执行此操作:

C - A'
     \
      A - B

这最终使我们想到了我的问题:

有没有办法让git自己弄清楚我们不需要在A中包含A,因为A'已经存在了?还是这种情况总是需要人工干预才能删除重复的提交?

2 个答案:

答案 0 :(得分:2)

这可以通过git rebase --skip来实现。

C - A'
     \
      B

当分支B重新基于master时,这将是您看到的-

error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

然后您可以执行git rebase --skip,这将跳过提交,并且git历史记录看起来很干净

答案 1 :(得分:2)

它并没有满足您的要求,但是在这种情况下,我已经习惯于始终使用feat.geometry。这使您可以:

  • 首先从待办事项列表中删除git rebase -i
  • 避免创建尚未成为A祖先的A'提交。您可以改以B的形式输入拼写错误:
    D
    然后,在运行C \ A - B - D 时,可以对待办事项列表重新排序,以使git rebase -i C成为对D的修正提交。然后,您将得到:
    A
    这是您想要的最终状态。 (如果您通过C \ A' - B 提交D,则在运行git commit --fixup A时,如果git rebase -i,则自动进行重新排序。)