我怎么能合并许多提交,但留下一个?

假设我有这个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理使用它来表示,在gitgit 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