有没有办法在 git rebase 中自动丢弃修改后的提交?
Is there a way to automatically discard amended commits in a git rebase?
下面的情况是我在Git工作的时候偶尔会出现的情况。我从线性历史开始,有两个分支。 master目前指向C。分支A是我让同事合并到master的分支,分支B有未完成的工作我还没有完成public
C
\
A - B
在代码审查期间,我的同事注意到分支 A 中的最后一次提交中存在拼写错误。我没有创建新的提交来修复拼写错误,而是修改了有问题的提交并将其合并到 master 中。 Master 现在指向 A',这是更正拼写错误的提交。
C - A'
\
A - B
下一步是 rebase 未完成的工作。我希望最终结果如下所示:
C - A'
\
B
但是,默认情况下 Git 假设 A 和 A' 是完全不相关的提交,它会尝试这样做:
C - A'
\
A - B
这终于让我们想到了我的问题:
有没有办法让 git 自己弄清楚我们不需要在变基中包含 A 因为 A' 已经存在了?或者这是始终需要人工干预以删除重复提交的情况之一?
这可以通过 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 历史看起来干净
它不会按照您的要求进行操作,但在这些情况下,我已经习惯了始终使用 git rebase -i
。这允许您:
- 首先从待办事项列表中删除
A
。
- 避免创建还不是
B
祖先的 A'
提交。相反,您可以将错字修复提交为 D
:
C
\
A - B - D
然后当 运行 git rebase -i C
时,您可以重新排序待办事项列表,使 D
成为 A
的修复提交。然后你会得到:
C
\
A' - B
这是你想要的最终状态。 (如果您通过 git commit --fixup A
提交 D
,则当 运行 git rebase -i
if git.autosquash = true
时将自动重新排序。)
下面的情况是我在Git工作的时候偶尔会出现的情况。我从线性历史开始,有两个分支。 master目前指向C。分支A是我让同事合并到master的分支,分支B有未完成的工作我还没有完成public
C
\
A - B
在代码审查期间,我的同事注意到分支 A 中的最后一次提交中存在拼写错误。我没有创建新的提交来修复拼写错误,而是修改了有问题的提交并将其合并到 master 中。 Master 现在指向 A',这是更正拼写错误的提交。
C - A'
\
A - B
下一步是 rebase 未完成的工作。我希望最终结果如下所示:
C - A'
\
B
但是,默认情况下 Git 假设 A 和 A' 是完全不相关的提交,它会尝试这样做:
C - A'
\
A - B
这终于让我们想到了我的问题:
有没有办法让 git 自己弄清楚我们不需要在变基中包含 A 因为 A' 已经存在了?或者这是始终需要人工干预以删除重复提交的情况之一?
这可以通过 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 历史看起来干净
它不会按照您的要求进行操作,但在这些情况下,我已经习惯了始终使用 git rebase -i
。这允许您:
- 首先从待办事项列表中删除
A
。 - 避免创建还不是
B
祖先的A'
提交。相反,您可以将错字修复提交为D
:
然后当 运行C \ A - B - D
git rebase -i C
时,您可以重新排序待办事项列表,使D
成为A
的修复提交。然后你会得到:
这是你想要的最终状态。 (如果您通过C \ A' - B
git commit --fixup A
提交D
,则当 运行git rebase -i
ifgit.autosquash = true
时将自动重新排序。)