长话短说:
我想撤消合并但保留新的更改。我知道git reset --hard <hash>
将撤消提交,如果我这样做2次,我将撤消合并。但那么新的变化呢?提前谢谢。
答案 0 :(得分:1)
您可以使用git revert <<sha hash of merge commit>> -m 1
1表示要保留的合并提交对象的主线(或父级)。由于还原,父级2引入的任何文件更改都将被删除。主线分支上的其他提交所做的任何更改都不会受到影响。
git cat-file -p <<sha hash of merge commit>>
这将告诉你父母。如果在git revert命令中使用了1选项,则将使用输出中列出的第一个父级。
采用这种方法不会删除/重写您的历史记录,就像使用rebase方法一样。
如果您已共享代码,则应采用此方法。否则,您将面临其他开发人员在将来的提交中重新引入不需要的代码的风险。
重新分配共享代码还会为其他开发人员引入重复的提交对象。这是非常不满意的。
要回复的警告是,如果您希望稍后从原始合并中引入更改,则需要还原恢复。
答案 1 :(得分:0)
您可以使用rebase
:
git rebase -i HEAD~3
然后你会有像
这样的东西pick #hash3 Your commit 1 title
pick #hash2 Your commit 1 title
pick #hash1 Your commit 1 title
如果您要删除例如2次提交#hash1
和#hash2
,只需执行以下操作:
pick #hash3 Your commit 1 title
drop #hash2 Your commit 1 title
drop #hash1 Your commit 1 title
保存。
警告:
如果您在提交#hash3
之前进行了重新定位(这是最早的),并且如果您已经推送过,那么您必须使用强制标记push
git push -f
。如果其他人在同一个远程分支上工作,这可能会非常危险。如果您独自在回购或至少在分支机构上,请继续;)