使用Git根据提交id恢复到特定的提交?

使用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返回特定的提交?例如,我是否可以为每个commit添加一些标签以使其与标签一起返回?

981771 次浏览

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07是你想要的…

您是希望将回购回滚到该状态,还是希望本地回购看起来像这样?

如果你reset --hard,它将使你的本地代码和本地历史记录与上次提交时一样。但如果你想把这个推给另一个有新历史的人,它会失败:

git reset --hard c14809fa

如果你reset --soft,它会将你的HEAD移到它们所在的位置,但保留你的本地文件等:

git reset --soft c14809fa

那么这次重置你到底想做什么?

编辑-

你可以添加&;标签&;为了你的回购…然后回到标签。但是标签实际上只是sha1的快捷方式。

你可以把它标记为TAG1..那么git reset --soft c14809fagit reset --soft TAG1git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07都将做同样的事情。

如果你想强制这个问题,你可以这样做:

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07

将您送回您的git克隆在签入时的样子

我认为,bwawok的答案在某种程度上是错误的:

如果有的话

git reset --soft c14809fa

它将使您的本地文件更改为当时的样子,但保留您的历史记录等相同。

根据手动:git-reset,“git reset -soft”…

根本不触及索引文件和工作树(但将头部重置为<commit>,就像所有模式一样)。这将使所有更改过的文件都变成“要提交的更改”,就像git状态所显示的那样。

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

bwawok回答的命令可能是:

git checkout <commit>

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

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