添加中间提交以简化审查

Adding an intermediate commit to simplify review

我做了一个包含以下更改的提交:

不幸的是,这使得提交很难在 GitHub 上审查,因为 GitHub 显示差异就像整个块被删除并重新插入一样。理想情况下,审阅者只会查看内容移动后对 aux 所做的非常小的编辑。

我想添加一个中间提交来简化此更改的审查。中间提交将简单地复制 mainaux(即,aux 将是 main 的副本)。然后下一次提交将从 main 中删除移动的内容并展示对 aux 的微小更改。这是一个很好的方法吗?如果是这样,我应该如何创建这个中间提交?请注意,不幸的是我已经完成了更改,我不想重做整个过程。

这是可以做到的,但请注意,如果您已经发布了提交(听起来您已经发布了),那么不建议进行任何历史编辑。所以有一些可能的程序。出于这些解释的目的,我假设更改发生在分支 my_branch 上。 (如果有问题的分支是master,它工作正常;我只需要假设一些东西来编写命令。)

简单但笨拙

您可以返回到上一个提交,创建一个临时分支,然后在该分支上创建您的中间提交。然后告诉审阅者首先审查临时分支上的更改,然后将您的 my_branch 与临时分支进行比较。如果您的审阅者愿意这样做,那么它会为他们提供更简单的差异,而不会造成混乱。但也许它并没有以最好的方式保存历史。

历史重写

如果你能做到,这会让你的历史更清晰。但它涉及历史重写,如上所述,这可能会给任何已推送更改的回购协议的其他用户带来问题。请参阅有关 git rebase 的文档:从上游 rebase

中恢复

如果这不是问题,或者如果您发现恢复过程是可以接受的,那么您可以这样做:

首先,检查更改前的提交。我假设那是

git checkout my_branch^

现在你处于分离的状态。创建一个临时分支可能很好:

git checkout -b temp_branch

main复制到aux并提交。

接下来您想要一个看起来像 my_branch HEAD 的提交,但您希望它的父项是 temp_branch HEAD。如果 aux 是该提交中唯一更改的内容:

git checkout my_branch -- aux
git commit
git branch -f my_branch

如果提交中有其他更改,那么重新设置它的父级可能会更容易。在 git filter-branch (https://git-scm.com/docs/git-filter-branch)

的文档中有一个关于如何执行此操作的常用示例

当然这时候你可以清理temp_branch。您可能需要 "force push" my_branch(如果它已经发布)。

git checkout my_branch
git push -f

这就是所有其他开发人员可能需要恢复的信号,如果他们也有对 my_branch 的引用。

不重写历史

如果以上都行不通,那么你可以试试这个:首先,使用git revert回到改变之前。然后,分两个阶段重新应用提交。

同样,中间提交很容易进行(与重写情况相同)。如果对 mainaux 的更改是提交中的唯一更改,那么您可以再次从原始提交中提取 aux 以简化最终提交的创建。但是这次命令将是

git checkout HEAD^ -- aux

因为 HEAD 是还原提交所以 HEAD^ 是其中有更改的提交。

如果提交有额外的变化,那么一个braoder

git checkout HEAD^ -- .

可能会,但我倾向于 rm -r 工作树首先只是出于偏执狂。无论您尝试什么步骤,您都可以使用

验证您是否正确地重新创建了最终的树
git diff HEAD^

所以现在你有了这个奇怪的来回历史记录,但是没有重写,也没有 "second branch" 参与简化验证。当然你可能仍然需要分两步验证:首先证明 HEAD^ 等于之前的验证状态,然后验证从 HEAD^HEAD.

的补丁