如果使用commit
进行了更改,然后使用revert
还原,那么撤消该恢复的最佳方式是什么?
理想情况下,这应该通过新的提交来完成,以便不重写历史记录。
答案 0 :(得分:351)
git cherry-pick <original commit sha>
将制作原始提交的副本,实质上是重新应用提交
恢复恢复将执行相同的操作,提交更加简洁的提交消息:
git revert <commit sha of the revert>
这些方法中的任何一种都允许您git push
而不覆盖历史记录,因为它会在还原后创建新的提交。
键入commit sha时,通常只需要前5个或6个字符:
git cherry-pick 6bfabc
答案 1 :(得分:284)
如果您尚未推送此更改,git reset --hard HEAD^
否则,恢复还原完全没问题。
另一种方法是git checkout HEAD^^ -- .
然后git add -A && git commit
。
答案 2 :(得分:10)
还原提交与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'
这样,您可以追溯历史并弄清楚整个故事,即使那些不了解遗产的人也可以自己解决。而如果您
很明显,如果一次提交被还原并重新还原一次,则将变得非常混乱。
答案 3 :(得分:2)
对我来说这看起来很愚蠢。但我遇到了同样的情况,我确实恢复了恢复提交。我做了数字恢复,所以我必须为每个恢复提交恢复#。
现在我的提交历史看起来很奇怪。
这是一个宠物项目,所以没关系。但是对于现实生活中的项目,我会优先选择在最后一次提交之前将所有恢复的代码恢复到一次提交和更合理的评论中。
答案 4 :(得分:2)
或者你可以git checkout -b <new-branch>
和git cherry-pick <commit>
之前和git rebase
删除revert
提交。像以前一样发送拉请求。
答案 5 :(得分:2)
还原还原就能解决问题
例如,
If abcdef is your commit and ghijkl is the commit you have when you reverted the commit abcdef,
然后输入
git revert ghijkl
这将还原还原
答案 6 :(得分:1)
这是我的做法:
如果分支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
然后我向新分支提出了拉取请求。
答案 7 :(得分:0)
如果您不喜欢“还原恢复”的想法(特别是当这意味着丢失许多提交的历史信息时),您可以随时访问有关"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
答案 8 :(得分:0)
要取回提交后还原的未暂存和暂存的更改:
git reset HEAD@{1}
要恢复所有未暂存的删除,请执行以下操作:
git ls-files -d | xargs git checkout --
答案 9 :(得分:0)
我遇到一个问题,有人将其还原为master到我的分支,但是我需要能够再次合并它,但问题是该还原包括我的所有提交。 让我们看一下这种情况,我们是从M1创建功能分支的,然后在M3中合并功能分支,然后在RM3中还原它。
M1 -> M2 -> M3 -> M4- > RM3 -> M5
\. /
F1->F2 -
如何使F2能够合并到M5?
git checkout master
git checkout -b brach-before-revert
git reset --hard M4
git checkout master
git checkout -b new-feature-branch
git reset --hard M1
git merge --squash brach-before-revert
答案 10 :(得分:0)
在意外删除我所有文件的最初恐慌之后,我使用以下方法取回了我的数据
git reset HEAD@{1}
git fsck --lost-found
git show
git revert <sha that deleted the files>
答案 11 :(得分:0)
我看到响应包含命令 git reset --hard HEAD
,但没有任何警告。由于选项 --hard
,您应该小心使用该命令。它会重置您的索引和远程存储库,但大多数情况下,它还会重置您的本地存储库,并且所有尚未推送到远程的提交都将丢失,包括本地存储库和索引。永远不要使用该标志 --hard
除非您确定您还想重置从当前提交到您选择的哈希的所有本地工作。
如果无论如何你都弄错了,运行 git reflog
来检索你的 ~hash,然后运行 git reset --hard ~hash
来恢复你的文件。