假设我有这个功能分支“ foo”。现在我想将其合并回master,但是我添加了一些我不想在master中使用的调试代码。
调试代码位于其自己的提交中,因此我可以git cherry-pick
在每个提交中使用该代码,而忽略该提交。但这会很累。
是否有做到这一点的“反向选择”,或进行交互式合并?
Answers:
使用交互式变基:
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
却是反向的“樱桃拾取”。
git revert
确实记录了删除了适当更改的新提交。
revert
并cherry-pick
也有-n
不执行提交,但树叶在缓存/索引/临时区域的变化,使这些命令是非常相似的选项。
git
所有内容都与快照之间的差异有关,而不是相关事件。我不知道。我一直在学习类似的功能,并希望会有所收获,但是它们似乎每次都起作用!
另一个想法是添加带有调试代码的还原提交,并将其合并到您的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
则可以创建一个临时分支,在其中创建还原的提交。最后,您删除临时分支。
我在以下方面取得了成功:
git rebase -p --onto SHA^ SHA
SHA
您要删除的提交在哪里。
通过http://sethrobertson.github.io/GitFixUm/fixup.html#remove_deep