如何合并许多提交,但忽略其中一个提交?

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

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

是否有一些“反向选择”,这样做,或一个交互式合并?

38760 次浏览

使用交互式 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.

现在你可以合并到那个分支去掌握。

更新: 应该注意的是,改变历史与 rebase只有发生在私人分行。如果此分支已向公众公开,则按照其他应答者的建议使用 git revert

不管其他 SCM 使用它来表示什么,在 git中,git revert是一个反向的选择。

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

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

git rebase -i master

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

在重新定位之后,简单地将 foo-merge 拉入 master:

git checkout master
git pull . foo-merge

另一个想法是添加调试代码的恢复提交,并将其合并到主分支中。然后,我们删除 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,那么您可以创建一个临时分支,在其中创建恢复的提交。最后删除临时分支。

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

git rebase -p --onto SHA^ SHA

其中 SHA是要删除的提交。

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