我做了一个包含以下更改的提交:
main
移至新文件aux
aux
不幸的是,这使得很难在GitHub上查看提交,因为GitHub显示差异,好像整个块被删除并重新插入一样。理想情况下,审阅者只会查看内容移动后对aux
所做的非常小的修改。
我想添加一个中间提交来简化审核此更改。中间提交只会将main
复制到aux
(即aux
将是main
的副本。然后,下一次提交会从main
中移除已移动的内容,并对aux
进行细微更改。这是一个很好的方法,如果是这样,我应该如何创建这个中间提交?请注意,遗憾的是我已经完成了更改,我不想重做整个过程。
答案 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-branch
(https://git-scm.com/docs/git-filter-branch)的文档中有一个如何执行此操作的示例示例
当然,此时您可以清理temp_branch
。你可能不得不强行推动" my_branch
(如果已经发布)。
git checkout my_branch
git push -f
这就是所有其他开发者可能需要恢复的信号,如果他们也引用了my_branch
。
没有历史记录重写
如果上述两种方法都不起作用,那么您可以尝试这样做:首先,在更改之前使用git revert
返回。然后,分两个阶段重新应用提交。
同样,中间提交很容易制作(与重写情况相同)。如果对main
和aux
的更改是提交中的唯一更改,那么您可以再次从原始提交中提取aux
以简化创建最终提交。但这次命令将是
git checkout HEAD^ -- aux
因为HEAD
是还原提交,所以HEAD^
是其中包含更改的提交。
如果提交有其他更改,则为braoder
git checkout HEAD^ -- .
可能会这样做,但我倾向于rm -r
工作树首先出于偏执狂。无论您尝试何种步骤,都可以验证是否已使用
git diff HEAD^
所以现在你在历史上有这种奇怪的来回,但是没有重写,也没有"第二个分支"参与简化验证。当然,您可能仍需要分两步验证:首先显示HEAD^
等于之前的验证状态,然后验证补丁从HEAD^
到HEAD
。