使用git恢复到基于commit id的特定commit?


Reverting to a specific commit based on commit id with Git?

本问题已经有最佳答案,请猛点这里访问。

有了git log,我得到了迄今为止我所做的承诺清单。

1
2
3
4
5
6
7
8
9
10
11
12
13
commit f5c5cac0033439c17ebf905d4391dc0705dbd5f1
Author: prosseek
Date:   Fri Sep 3 14:36:59 2010 -0500

    Added and modified the files.

commit c14809fafb08b9e96ff2879999ba8c807d10fb07
Author: prosseek
Date:   Tue Aug 31 08:59:32 2010 -0500

    Just simple test for core.editor.

... etc ...
  • 如何将其恢复为特定的提交?例如,如果我想回到commit c14809fafb08b9e96ff2879999ba8c807d10fb07该怎么办?

  • 有没有其他/更好的方法可以使用Git返回特定的提交?例如,我可以为每个提交添加一些标签,以使其与标签一起返回吗?


你想把回购回那个状态吗?或者你只是想让你的本地回购看起来像那样?

如果你这样做了

1
git reset --hard c14809fa

它将使您的本地代码和本地历史就像提交时一样。但是如果你想把这个推给其他有着新历史的人,它就会失败。

如果你这样做了

1
git reset --soft c14809fa

它将使您的本地文件更改为原来的样子,但将您的历史记录等保持不变。

那么你到底想用这个重置做什么呢?

编辑-

您可以在回购协议中添加"标签"。然后回到标签上。但标签实际上只是通往sha1的捷径。

您可以将此标记为tag1..那么,一个git reset --soft c14809fagit reset --soft TAG1git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07都会做同样的事情。


我认为,BWawok的回答在某些方面是错误的:

if you do

1
git reset --soft c14809fa

It will make your local files changed to be like they were then, but leave your history etc. the same.

根据手册:git reset,"git reset--soft"…

does not touch the index file nor the working tree at all (but resets the head to , just like all modes do). This leaves all your changed files"Changes to be committed", as git status would put it.

因此,它将从分支中"删除"较新的提交。这意味着,在查看了旧代码之后,您不能再轻松地转到这个分支中最新的提交。所以它做了与bwawok所描述的相反的事情:本地文件没有被更改(它们看起来和"git reset--soft"之前完全一样),但是历史被修改(分支在指定的提交之后被截断)。

bwawok答案的命令可能是:

1
git checkout <commit>

你可以用这个来看看旧版本:我的代码昨天看起来怎么样?

(我知道,我应该把这句话写在对这个答案的评论中,但是stackoverflow不允许我这样做!我的名声太低了。)


你所追求的是…


如果要强制解决此问题,可以执行以下操作:

1
git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07

让你回到签入时你的Git克隆的样子