鉴于使用commit
进行的更改,然后使用revert
恢复,那么撤消该恢复的最佳方法是什么?
理想情况下,这应该使用新的提交来完成,以便不重写历史记录。
如果你尚未推动这一改变,git reset --hard HEAD^
否则,恢复还原完全没问题。
另一种方式是git checkout HEAD^^ -- .
然后git add -A && git commit
。
git cherry-pick <original commit sha>
将制作原始提交的副本,实质上是重新应用提交
恢复还原将执行相同的操作,并提供更复杂的提交消息:
git revert <commit sha of the revert>
这些方法中的任何一种都将允许您在不覆盖历史记录的情况下使用git push
,因为它会在恢复之后创建新的提交。
键入commit sha时,通常只需要前5个或6个字符:
git cherry-pick 6bfabc
还原提交就像git中的任何其他提交一样。意思是,您可以将其还原,如:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
这显然只有在推动更改后才有意义,特别是当您无法强制推送到目标分支时(这对您的主分支来说是一个好主意)。如果没有推送更改,只需按照其他帖子进行挑选,还原或简单地删除还原提交。
在我们的团队中,我们有一个规则来使用Revert在主分支中提交的Revert注释,主要是为了保持历史记录清洁,以便您可以看到哪个提交还原了什么:
7963f4b2a9d Revert "Revert "OD-9033 parallel reporting configuration"
"This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
...
a0e5e86d3b6 Revert "OD-9055 paralel reporting configuration"
This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
...
Merge pull request parallel_reporting_dbs to master* commit
'648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'
通过这种方式,您可以追踪历史并找出整个故事,即使是那些不了解遗产的人也可以自己解决问题。然而,如果你挑选或改变东西,这些有价值的信息就会丢失(除非你将其包括在评论中)。
显然,如果一个提交还原并重新还原不止一次,那就会变得非常混乱。
或者你可以git checkout -b <new-branch>
和git cherry-pick <commit>
之前和git rebase
放弃revert
提交。像以前一样发送拉请求。
恢复恢复将成功
例如,
If abcdef is your commit and ghijkl is the commit you have when you reverted the commit abcdef,
然后输入,
git revert ghijkl
这将恢复还原
我是这样做的:
如果分支my_branchname
包含在已恢复的合并中。我想要保留my_branchname
:
我首先从git checkout -b my_new_branchname
做一个my_branchname
。
然后我做一个git reset --soft $COMMIT_HASH
,其中$COMMIT_HASH
是在第一次提交my_branchname
之前提交的提交哈希值(参见git log
)
然后我做了一个新的提交git commit -m "Add back reverted changes"
然后我推高了新的分支git push origin new_branchname
然后我对新分支发出拉取请求。
如果您不喜欢“恢复恢复”的想法(特别是当这意味着丢失许多提交的历史信息时),您可以随时访问有关"Reverting a faulty merge"的git文档。
鉴于以下起始情况
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E <-- fixed-up topic branch
(W是您合并M的初始恢复; D和E是您最初破坏的功能分支/提交的修复)
您现在可以简单地重放提交A到E,以便它们都不属于恢复的合并:
$ git checkout E
$ git rebase --no-ff P
您的分支的新副本现在可以再次合并到master
:
A'---B'---C'------------D'---E' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E
要恢复在提交后还原的未分级和暂存的更改:
git reset HEAD@{1}
要恢复所有未分级删除:
git ls-files -d | xargs git checkout --