添加中间提交以简化审查
Adding an intermediate commit to simplify review
我做了一个包含以下更改的提交:
- 将一大块文件
main
移动到新文件 aux
- 然后,对
aux
的内容进行非常小的编辑
不幸的是,这使得提交很难在 GitHub 上审查,因为 GitHub 显示差异就像整个块被删除并重新插入一样。理想情况下,审阅者只会查看内容移动后对 aux
所做的非常小的编辑。
我想添加一个中间提交来简化此更改的审查。中间提交将简单地复制 main
到 aux
(即,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
回到改变之前。然后,分两个阶段重新应用提交。
同样,中间提交很容易进行(与重写情况相同)。如果对 main
和 aux
的更改是提交中的唯一更改,那么您可以再次从原始提交中提取 aux
以简化最终提交的创建。但是这次命令将是
git checkout HEAD^ -- aux
因为 HEAD
是还原提交所以 HEAD^
是其中有更改的提交。
如果提交有额外的变化,那么一个braoder
git checkout HEAD^ -- .
可能会,但我倾向于 rm -r
工作树首先只是出于偏执狂。无论您尝试什么步骤,您都可以使用
验证您是否正确地重新创建了最终的树
git diff HEAD^
所以现在你有了这个奇怪的来回历史记录,但是没有重写,也没有 "second branch" 参与简化验证。当然你可能仍然需要分两步验证:首先证明 HEAD^
等于之前的验证状态,然后验证从 HEAD^
到 HEAD
.
的补丁
我做了一个包含以下更改的提交:
- 将一大块文件
main
移动到新文件aux
- 然后,对
aux
的内容进行非常小的编辑
不幸的是,这使得提交很难在 GitHub 上审查,因为 GitHub 显示差异就像整个块被删除并重新插入一样。理想情况下,审阅者只会查看内容移动后对 aux
所做的非常小的编辑。
我想添加一个中间提交来简化此更改的审查。中间提交将简单地复制 main
到 aux
(即,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
回到改变之前。然后,分两个阶段重新应用提交。
同样,中间提交很容易进行(与重写情况相同)。如果对 main
和 aux
的更改是提交中的唯一更改,那么您可以再次从原始提交中提取 aux
以简化最终提交的创建。但是这次命令将是
git checkout HEAD^ -- aux
因为 HEAD
是还原提交所以 HEAD^
是其中有更改的提交。
如果提交有额外的变化,那么一个braoder
git checkout HEAD^ -- .
可能会,但我倾向于 rm -r
工作树首先只是出于偏执狂。无论您尝试什么步骤,您都可以使用
git diff HEAD^
所以现在你有了这个奇怪的来回历史记录,但是没有重写,也没有 "second branch" 参与简化验证。当然你可能仍然需要分两步验证:首先证明 HEAD^
等于之前的验证状态,然后验证从 HEAD^
到 HEAD
.