Git 添加中间提交以简化审查

Git 添加中间提交以简化审查,git,git-commit,Git,Git Commit,我进行了一次提交,其中包括以下更改: 将一大块文件main移动到新文件aux 然后,对aux的内容进行非常小的编辑 不幸的是,这使得提交很难在GitHub上查看,因为GitHub显示的差异就好像整个区块都被删除并重新插入一样。理想情况下,审阅者只查看内容移动后对aux所做的非常小的编辑 我想添加一个中间提交,以简化对该更改的审查。中间提交只是将main复制到aux,即aux是main的副本。然后,下一次提交将从main中删除移动的内容,并显示对aux的次要更改。这是一种很好的方法吗?如果是,我应

我进行了一次提交,其中包括以下更改:

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


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

这是可以做到的,但请注意,如果您已按听起来的方式发布提交,则不建议进行任何历史记录编辑。因此,有一些可能的程序。出于这些解释的目的,我假设更改发生在my_分支上。如果所讨论的分支是主分支,则其工作正常;我只需要假设一些东西来编写命令

简陋

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

改写历史

如果你能做到这一点,这将让你有一个更干净的历史。但这涉及到历史重写,如上所述,这可能会给任何回购协议的其他用户带来问题,而这些回购协议的变更已经推到了这些用户身上。请参阅git rebase文档:从上游rebase恢复

如果这不是问题,或者如果您发现恢复过程可以接受,则可以执行以下操作:

首先,在更改之前签出提交。我想那是

git checkout my_branch^
现在你处于超然状态。创建临时分支可能很好:

git checkout -b temp_branch
将main复制到aux并提交

接下来,您需要一个看起来像my_分支头的提交,但希望其父级是temp_分支头。如果aux是该提交中唯一更改的内容:

git checkout my_branch -- aux
git commit
git branch -f my_branch
如果提交中有其他更改,那么重新设置其父级可能会更容易。git filter branch的文档中有一个如何实现这一点的示例

当然,在这一点上,你可以清理temp_分支。如果my_分支已经发布,您可能必须强制推送它

git checkout my_branch
git push -f
这就是所有其他开发人员可能需要恢复的信号,如果他们也有对my_分支的引用

不改写历史

如果以上两种方法都不起作用,那么您可以尝试以下方法:首先,使用git revert返回到更改之前的位置。然后,分两个阶段重新应用提交

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

git checkout HEAD^ -- aux
因为HEAD是revert commit,所以HEAD^是其中包含更改的

如果提交有额外的更改,则执行braoder

git checkout HEAD^ -- .
也许可以,但出于偏执,我倾向于先对工作树进行rm-r。无论您尝试什么步骤,都可以验证您是否已使用

git diff HEAD^

所以现在你在历史中有了这种奇怪的来回,但是没有重写,也没有第二个分支参与简化验证。当然,您可能仍然需要分两步进行验证:首先显示HEAD^与之前的已验证状态相同,然后在HEAD^之间验证补丁。

是将移动作为单独的提交,还是移动内容,然后编辑,然后提交?关于你已经做的事情,不,很不幸,我把移动和编辑作为一个单一的提交。完美!重新租用确实是我所需要的。谢谢你的全面回答!