清理Git中的分支历史

时间:2019-09-24 14:34:23

标签: git

我在功能分支上工作了几天。在这段时间里,我犯了很多错误并提交了很多不必要的代码更改,这些更改必须在下一次提交中恢复。

最后,我找到了最好的解决方案,现在我准备创建一个请求请求。 但是,我不希望每个人都能看到我对分支所做的愚蠢提交。 :-)

用最新的代码创建干净的PR但没有所有这些提交的最佳方法是什么?

我在终端中使用Git。

2 个答案:

答案 0 :(得分:4)

您可以运行交互式git rebase:

git rebase -i HEAD~N

其中N是您希望对其进行操作的历史记录中的最后提交次数(例如,修改提交消息,删除提交等)。

此命令允许您从一系列操作中进行选择,以应用于每次提交(最多N次提交)。 您可以找到有关可用操作here的更多信息。

答案 1 :(得分:2)

如果您从未推送过分支,则可以进行交互式重新配置,以“压缩”不需要的提交,而不会出现任何问题。如果您曾经推送过分支,那么进行变基将需要您然后“强制推送”分支,这可能会或可能不会成为问题。

如果将遥控器配置为不允许推送,则强制推送是一个问题。如果出现这种情况,您无能为力。

如果其他用户可能在其克隆中有该分支的副本,则强制推送可能是一个问题,特别是如果他们可能基于该分支进行工作。在这种情况下,您必须与其他用户进行协调。有关更多信息,请参见“从上游基准库恢复”下的git rebase文档。https://git-scm.com/docs/git-rebase

因此,如果以上内容阻止您进行基础调整,那么您将无能为力,而只需要将“不希望别人看到错误”的虚荣心摆在一边。 (但是再说一次,如果您曾经推过分支,那么其他人已经可以看到您所做的一切了。)

因此,如果您要进行变基:

假设您是从master创建功能分支的,您可以说

git rebase -i master feature

如果您还希望将分支移动到当前的主提示(集成对master的更改),或

git rebase -i $(git merge-base master feature) feature

根据分支所在的位置保留重写的分支。

这将显示一个带有“ TODO列表”的文本编辑器,该文本编辑器提供了重新设置其说明的基础。每行代表一次提交。对于要删除的每个提交,请在列表中找到该提交,然后将FOLLOWING COMMIT的行的第一个单词更改为squash。

例如,如果TODO列表显示

pick 1111111 a good commit
pick 2222222 a bad commit
pick 3333333 revert the bad commit
pick 4444444 another good commit

而您只想保留1111111和4444444,则可以编辑列表以说

pick 1111111 a good commit
pick 2222222 a bad commit
squash 3333333 revert the bad commit
squash 4444444 another good commit

这会将3合并到它之前的提交中(2),然后将4合并到它之前的提交中(合并2和3的结果),所以剩下的是1和4。(从2和3的变化仍然包含在内,但是如果3个真正还原2个,则意味着没有任何意义。)