代码之家  ›  专栏  ›  技术社区  ›  Dave Vogt

我如何合并多个提交,但忽略一个提交?

  •  74
  • Dave Vogt  · 技术社区  · 15 年前

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

    调试代码在它自己的提交中,因此我可以使用 git cherry-pick 在每次提交时都忽略这个提交。但那会很累的。

    是否有一些“逆向樱桃选择”可以做到这一点,或者一个交互式合并?

    5 回复  |  直到 7 年前
        1
  •  54
  •   Harry Vangberg    15 年前

    使用交互式钢筋:

    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
  •  68
  •   CB Bailey    15 年前

    不管其他SCM用它来表示什么, git , git revert 是一个倒樱桃采摘。

        3
  •  7
  •   Paul Pladijs    13 年前

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

    确保你的工作树是干净的。首先创建恢复的提交。然后合并到主控形状。然后,将foo分支的分支指针重置为已恢复提交的父级,使其返回原始状态。

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

        4
  •  2
  •   Yang Zhao    15 年前

    使用Interactive Rebase删除不需要的提交。

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

    git rebase -i master
    

    当您处于提交编辑模式时,从编辑器中删除包含调试提交、保存和退出的行。

    重新定位后,只需将foo合并到master:

    git checkout master
    git pull . foo-merge
    
        5
  •  0
  •   michaeljoseph    8 年前

    我在以下方面取得了成功:

    git rebase -p --onto SHA^ SHA
    

    在哪里? SHA 是要删除的提交。

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