我怎么能合并许多提交,但留下一个?
假设我有这个function分支“foo”。 现在我想把它合并回主,但我已经添加了一些debugging代码,我不想在主。
debugging代码在它自己的提交中,所以我可以在每次提交时使用git cherry-pick
,而忽略这个提交。 但是这将是相当烦人的。
有没有这样做的“逆转樱桃”,或交互式合并?
使用交互式底图:
git rebase -i SHA-OF-FIRST-COMMIT-IN-BRANCH
这将在你的$ EDITOR中打开这样的东西:
pick 8ac4783 folders and folders pick cf8b1f5 minor refactor pick 762b37a Lots of improvement. Folders adn shit. pick 3fae6e1 Be ready to tableview pick b174dc0 replace folder collection view w/ table view pick ef1b65b more finish pick ecc407f responder chain and whatnot pick 080a847 play/pause video pick 6719000 wip: movie fader pick c5f2933 presentation window fade transition # Rebase e6f77c8..c5f2933 onto e6f77c8 # # Commands: # p, pick = use commit # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
所以你所做的只是删除包含debugging提交的行,编写文件并closures编辑器,git会告诉你一些事情:
Successfully rebased and updated refs/heads/master.
现在,您可以将该分支合并为主。
更新:应该指出的是,改变历史与rebase
只应发生在私人部门。 如果这个分支已经暴露给公众,请使用其他回答者提出的git revert
。
尽pipe其他供应链pipe理使用它来表示,在git
, git revert
是一个逆向select。
另一个想法是添加一个debugging代码的还原提交,并将其合并到您的主分支。 之后,我们删除foo分支中的额外提交。
git checkout foo git revert COMMIT_REF_WITH_DEBUG_CODE git checkout master git merge foo git checkout foo git reset --hard HEAD~1
确保你的工作树是干净的。 首先创build恢复的提交。 然后合并到主。 之后,将foo分支的分支指针重置为已还原的提交的父级,以使其恢复到原始状态。
如果你不喜欢使用git reset
那么你可以创build一个临时分支来创build恢复的提交。 最后你删除临时分支。
使用交互式重build来移除您不需要的提交。
在从“foo”创build的新分支“foo-merge”上:
git rebase -i master
一旦处于提交编辑模式,删除包含debugging提交的行,保存并退出编辑器。
重新绑定后,只需将foo-merge合并到master:
git checkout master git pull . foo-merge
我已经成功:
git rebase -p --onto SHA^ SHA
SHA
是您想要删除的提交。
通过http://sethrobertson.github.io/GitFixUm/fixup.html#remove_deep