如何合并许多提交,但不进行合并?


74

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

调试代码位于其自己的提交中,因此我可以git cherry-pick在每个提交中使用该代码,而忽略该提交。但这会很累。

是否有做到这一点的“反向选择”,或进行交互式合并?

Answers:


53

使用交互式变基:

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.

现在,您可以在该分支中合并以掌握。

更新:应该注意,更改历史记录rebase应在私有分支上进行。如果该分支已经公开,则使用其他答复者建议的方法。git revert


很好..并且有一种很好的方法可以获取SHA-OF-FIRST-COMMIT-IN-BRANCH吗?
Dave Vogt


68

尽管其他SCM用它来表示,但在gitgit revert却是反向的“樱桃拾取”。


9
git revert确实记录了删除了适当更改的新提交。
Mike Mazur

11
@mikem:我认为这是反向摘樱桃的直观含义。双方revertcherry-pick也有-n不执行提交,但树叶在缓存/索引/临时区域的变化,使这些命令是非常相似的选项。
CB Bailey 2009年

简短而甜美-鼓励您尝试一下,认为“不可能如此简单!我会告诉他!” ......然后它这么简单。即使对于我刚开始采摘但只是正常提交​​(哎呀?)的代码,它似乎也有效,我认为这是有道理的,因为最终git所有内容都与快照之间的差异有关,而不是相关事件。我不知道。我一直在学习类似的功能,并希望会有所收获,但是它们似乎每次都起作用!
underscore_d

7

另一个想法是添加带有调试代码的还原提交,并将其合并到您的master分支中。之后,我们在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则可以创建一个临时分支,在其中创建还原的提交。最后,您删除临时分支。


2

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

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

git rebase -i master

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

重新设置基础后,只需将foo-merge拉入master:

git checkout master
git pull . foo-merge

1
当您不被允许发表评论时,会有些困难。FWIW,在决定我的与众不同之前,我确实对您的回答投了赞成票,然后将其归档。
杨钊

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.