假设我有这个功能分支“foo”。现在我想将它合并回master,但我添加了一些我不想在master中调试的代码。
调试代码在它自己的提交中,所以我可以在每次提交时使用git cherry-pick
并省略此提交。但那会很烦人。
是否有一些“逆樱桃选择”可以做到这一点,还是互动合并?
答案 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