给定已使用进行更改,commit
然后使用还原的更改,revert
撤消该还原的最佳方法是什么?
理想情况下,应该使用新的提交完成此操作,以免重写历史记录。
给定已使用进行更改,commit
然后使用还原的更改,revert
撤消该还原的最佳方法是什么?
理想情况下,应该使用新的提交完成此操作,以免重写历史记录。
Answers:
如果您尚未推动更改, git reset --hard HEAD^
否则,还原还原就可以了。
另一种方法是git checkout HEAD^^ -- .
,然后git add -A && git commit
。
git cherry-pick
或替代情况下,似乎是git revert
还原还原的最直接方法。
Otherwise, reverting the revert is perfectly fine.
,然后解释git checkout HEAD^^ -- .
正在做什么。
git add -A
...除非您要将每个文件都添加到版本控制中,这很可能不是您想要的。
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
显然,只有在推送更改后才有意义,尤其是当您无法强制将其推送到目标分支时(这对于您的master分支是个好主意)。如果尚未推送更改,请按照其他帖子的说明进行选择,还原或仅删除还原提交。
在我们的团队中,我们有一条规则,对在主分支中提交的“还原”提交使用“ 还原 ”,主要是为了保持历史记录的清洁,以便您可以看到哪个提交还原了以下内容:
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'
这样,您就可以追溯历史并弄清楚整个故事,即使那些不了解遗产的人也可以自己解决。而如果您随意挑选或重新编排内容,则这些有价值的信息将会丢失(除非您将其包括在注释中)。
显然,如果一次提交的还原和重新还原不止一次,则将变得非常混乱。
还原还原即可解决问题
例如,
如果abcdef
是您的提交,并且ghijkl
是还原提交时拥有的提交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
如果您不喜欢“还原还原”的想法(尤其是当这意味着丢失许多提交的历史记录信息时),则可以随时访问有关“还原错误的合并”的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 --