以下情况是我在使用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'已经存在了?还是这种情况总是需要人工干预才能删除重复的提交?
答案 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
,则自动进行重新排序。)