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

Dav*_*ogt 74 git merge

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

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

是否有一些"逆樱桃选择"这样做,或互动合并?

CB *_*ley 68

尽管其他SCM使用它的意思,但是git,它git revert是一个相反的樱桃选择.

  • @mikem:我认为,这是一个直观的反向选择.`revert`和`cherry-pick`都有一个`-n`选项,它不执行提交但是在缓存/索引/暂存区域中保留更改,因此命令非常相似. (11认同)
  • `git revert`确实记录了一个新的提交,并删除了相应的更改. (9认同)

Har*_*erg 53

使用交互式rebase:

git rebase -i SHA-OF-FIRST-COMMIT-IN-BRANCH
Run Code Online (Sandbox Code Playgroud)

这将在你的$ 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.
    #
Run Code Online (Sandbox Code Playgroud)

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

Successfully rebased and updated refs/heads/master.
Run Code Online (Sandbox Code Playgroud)

现在您可以将该分支合并到master.

更新:应该注意的是,改变历史rebase应该发生在私人分支上.如果该分支已向公众公开,请git revert按照其他回答者的建议使用.


Pau*_*ijs 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
Run Code Online (Sandbox Code Playgroud)

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

如果您不喜欢使用,git reset那么您可以创建一个临时分支,您可以在其中创建恢复的提交.最后,删除临时分支.