清理 Git 中的分支历史记录



我正在研究一个功能分支好几天。在这段时间里,我犯了很多错误,犯了很多不必要的代码更改,我不得不在下一次提交时恢复这些更改。

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

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

我在终端中使用 Git。

你可以运行一个交互式的 git rebase:

git rebase -i HEAD~N

其中 N 是历史记录中您希望对其采取行动的最后一次提交数(例如修改提交消息、删除提交等(。

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

如果您从未推送过分支,那么您可以进行交互式变基以"压缩"不需要的提交,而不会出现任何问题。 如果您曾经推动过分支,那么进行变基将需要您"强制推送"分支,这可能是也可能不是问题。

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

如果其他用户的克隆中可能有分支的副本,则强制推送可能会成为问题,特别是如果他们可能基于该分支进行工作。 在这种情况下,您必须与其他用户协调;有关详细信息,请参阅"从上游变基中恢复"下的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 列表"的文本编辑器,该列表提供变基说明。 每行表示一个提交。 对于要删除的每个提交,请在列表中找到该提交,然后将 NEXT COMMIT 行的第一个单词更改为 squash。

例如,如果待办事项列表显示

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,那么这意味着什么。

最新更新