使用Git恢复基于提交ID的特定提交?

时间:2010-09-03 19:49:46

标签: git

使用git log,我得到了目前为止提交的提交列表。

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的特定提交?例如,我可以将每个提交的一些标签放回标签吗?

4 个答案:

答案 0 :(得分:414)

您想将您的回购卷回滚到该状态吗?或者你只是希望你的本地回购看起来像那样?

如果你这样做

git reset --hard c14809fa

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

如果你这样做

git reset --soft c14809fa

它会使您的本地文件更改为当时的文件,但保留您的历史记录等。

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

编辑 -

您可以在回购邮件中添加“标签”,然后返回标签。但标签实际上只是sha1的快捷方式。

您可以将其标记为TAG1 ..然后git reset --soft c14809fagit reset --soft TAG1git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07都会做同样的事情。

答案 1 :(得分:154)

我认为,bwawok的答案在某些方面是错误的:

  

如果你这样做

git reset --soft c14809fa
     

它会使您的本地文件更改为当时的文件,但保留您的历史记录等。

根据manual: git-reset,“git reset --soft”......

  

根本不会触及索引文件或工作树(但是将头重置为< commit>,就像所有模式一样)。这将保留所有已更改的文件“要提交的更改”,因为git status会将其设置为。

因此它将从分支中“删除”更新的提交。这意味着,在查看旧代码之后,您无法再轻松地再次访问此分支中的最新提交。所以它与bwawok所描述的相反:本地文件没有改变(它们看起来与“git reset --soft”之前完全相同),但历史被修改(分支在指定的提交之后被截断)。

bwawok答案的命令可能是:

git checkout <commit>

您可以使用它来查看旧版本:我的代码昨天看起来如何?

(我知道,我应该在评论中加入这个答案,但stackoverflow不允许我这样做!我的声誉太低了。)

答案 2 :(得分:22)

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07就是你所追求的......

答案 3 :(得分:4)

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

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07

将您回复到签入时git克隆的样子