如何“取消恢复”恢复的Git提交?

时间:2012-01-04 13:59:26

标签: git undo revert

如果使用commit进行了更改,然后使用revert还原,那么撤消该恢复的最佳方式是什么?

理想情况下,这应该通过新的提交来完成,以便不重写历史记录。

12 个答案:

答案 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'

这样,您可以追溯历史并弄清楚整个故事,即使那些不了解遗产的人也可以自己解决。而如果您 rebase 东西,则这些有价值的信息将会丢失(除非您将其包括在注释中)。

很明显,如果一次提交被还原并重新还原一次,则将变得非常混乱。

答案 3 :(得分:2)

对我来说这看起来很愚蠢。但我遇到了同样的情况,我确实恢复了恢复提交。我做了数字恢复,所以我必须为每个恢复提交恢复#。

现在我的提交历史看起来很奇怪。

weird history

这是一个宠物项目,所以没关系。但是对于现实生活中的项目,我会优先选择在最后一次提交之前将所有恢复的代码恢复到一次提交和更合理的评论中。

答案 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_HASHmy_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 来恢复你的文件。