我在功能分支上工作了几天。在这段时间里,我犯了很多错误并提交了很多不必要的代码更改,这些更改必须在下一次提交中恢复。
最后,我找到了最好的解决方案,现在我准备创建一个请求请求。 但是,我不希望每个人都能看到我对分支所做的愚蠢提交。 :-)
用最新的代码创建干净的PR但没有所有这些提交的最佳方法是什么?
我在终端中使用Git。
答案 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个,则意味着没有任何意义。)