很多时候我正在开发一个应用程序,我会添加日志记录语句,有时候如果它有助于调试,die()
断言等等。在本地测试,我不需要对git做任何贡献。当我想通过我的功能分支中的提交将其转移到临时环境时,我必须使用一堆调试类型代码提交它们。最后,当我准备将分支合并到一个发布分支时,我很乐意将这些大量的提交几乎清理/编译成一个提交,就好像调试语句不在那里,因为我最后提交了一个清理它们。
一旦我完成了我的功能分支,是否有可能重写git历史记录以将所有这些提交合并到一个干净的提交中?
只要您没有发布您的更改(git push
),您就可以使用git rebase
安全地重写历史记录
你可以git rebase -i <commit>~1
commit
是你想要开始清理的第一个提交,并且在交互模式下,你可以squash
提交以某种方式将它们合并为一个大提交。你可以在这里找到关于这个主题的好文档:7.6 Git Tools - Rewriting History
此外,take a look into this,是我做的一个小钩子,以防止调试语句被提交,也许你发现它很有用。
编辑:我看到你提到你需要将你的更改移动到临时区域。如果这意味着推动,那么重写历史可能会有问题,除非没有其他人提取您的更改。重写历史记录会改变您的提交“sha”,因此团队的其他成员可能会以重复提交或许多冲突结束。
另一方面,如果你推到某个地方,但只有你正在使用那个暂存区域,那么你可以在本地重写你的历史记录并再次使用git push -f
。它将使用您的本地更改更新分支。
希望这可以帮助!
我发现以下方法最灵活:
git reset commit-id
将分支的提交历史记录一直放回到使用ID commit-id
的提交,同时保留您的文件更改为未提交。git gui
这样的GUI工具,您甚至可以从文件中选择和提交单独的行。以下是有关程序的详细指南:https://github.com/jleben/code-review-prep-guide/blob/master/guide.md
我知道它已经过时了,你现在可能已经解决了,只想添加我的2cents。
正如我理解git并自己做的那样,最干净的选择似乎是交互式rebase(正如@paulo bu所提到的那样,但是当你第一次将你的staging分支合并到你的发布分支中时,你可以毫无问题地进行rebase,只要它没有被推了。
例如,一旦提交了所有内容:
staging$ git checkout release
release$ git merge staging
release$ git rebase -i
release$ git push
当然,这有点简化,但没有任何可能发生的冲突..
在合并之前,如果你有同事在release
工作,那么获得所有上游变化可能会很有趣。但是之后也可能发生..
关于重新定位https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase的深度文章