我如何合并许多提交,但留下一个?

时间:2009-10-26 13:13:44

标签: git merge

假设我有这个功能分支“foo”。现在我想将它合并回master,但我添加了一些我不想在master中调试的代码。

调试代码在它自己的提交中,所以我可以在每次提交时使用git cherry-pick并省略此提交。但那会很烦人。

是否有一些“逆樱桃选择”可以做到这一点,还是互动合并?

5 个答案:

答案 0 :(得分:68)

尽管其他SCM使用它意味着,在git中,git revert是一个相反的选择。

答案 1 :(得分:53)

使用交互式rebase:

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.
    #

所以你要做的只是删除包含调试提交的行,编写文件并关闭编辑器,然后git会告诉你一些事情:

Successfully rebased and updated refs/heads/master.

现在你可以将该分支合并到master。

更新:应该注意的是,使用rebase更改历史记录只应 在私有分支上发生。如果此分支已向公众公开,请使用其他回答者提议的git revert

答案 2 :(得分:7)

另一个想法是添加带有调试代码的恢复提交,并将其合并到主分支中。之后我们在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

确保您的工作树干净。首先创建恢复的提交。然后将其合并为master。然后将foo分支的分支指针重置为还原提交的父级,使其恢复到原始状态。

如果您不喜欢使用git reset,那么您可以创建一个临时分支来创建还原提交。最后删除临时分支。

答案 3 :(得分:2)

使用交互式rebase删除您不想要的提交。

在“foo”创建的新分支“foo-merge”上:

git rebase -i master

进入提交编辑模式后,从编辑器中删除包含调试提交,保存和退出的行。

在变基之后,只需将foo-merge拉入master:

git checkout master
git pull . foo-merge

答案 4 :(得分:0)

我成功了:

git rebase -p --onto SHA^ SHA

SHA是您要删除的提交。

通过http://sethrobertson.github.io/GitFixUm/fixup.html#remove_deep