添加中间提交以简化审核

时间:2017-04-12 20:18:32

标签: git git-commit

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

  • 将大量文件main移至新文件aux
  • 然后,对aux
  • 的内容进行非常小的修改

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

我想添加一个中间提交来简化审核此更改。中间提交只会将main复制到aux(即aux将是main的副本。然后,下一次提交会从main中移除已移动的内容,并对aux进行细微更改。这是一个很好的方法,如果是这样,我应该如何创建这个中间提交?请注意,遗憾的是我已经完成了更改,我不想重做整个过程。

1 个答案:

答案 0 :(得分:1)

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

简单但笨重

您可以返回上一次提交,创建临时分支,并在该分支上创建中间提交。然后告诉审阅者首先检查临时分支上的更改,然后将my_branch与临时分支区分开来。如果你的评论者会那样做,那么它就会给他们带来更简单的差异,而且没有混乱。但也许它并没有以最好的方式保存历史。

历史重写

如果你能做到这一点,这将为你提供一个更清晰的历史。但它涉及历史重写,如上所述,这可能会导致任何已推送更改的仓库的其他用户出现问题。请参阅git rebase文档re:从上游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-branchhttps://git-scm.com/docs/git-filter-branch)的文档中有一个如何执行此操作的示例示例

当然,此时您可以清理temp_branch。你可能不得不强行推动" 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^

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