使用Git恢复基于commit 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的具体提交? 例如,我可以把每个提交的标签拿回标签吗?

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

如果你这样做

 git reset --hard c14809fa 

这将使你的本地代码和本地历史就像在这个提交。 但是如果你想把这件事推给有新历史的人,那就会失败。

如果你这样做

 git reset --soft c14809fa 

它会使你的本地文件变得像他们那样,但离开你的历史等等。

那么你想要做什么这个重置?

编辑 –

您可以添加“标签”到您的回购..然后回到标签。 但是标签实际上只是sha1的一个捷径。

你可以把这个标记为TAG1 ..然后git reset --soft c14809fagit reset --soft TAG1 ,或者git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07都会做同样的事情。

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

如果你这样做

 git reset --soft c14809fa 

它会使你的本地文件变得像他们那样,但离开你的历史等等。

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

不会碰到索引文件,也不会碰到工作树(但像所有模式一样,将头重置为<commit>)。 这将保留所有更改的文件“更改为提交”,因为git状态会将其放入。

所以它会从分支中“删除”更新的提交。 这意味着,在查看旧代码之后,您不能再轻易地再次访问此分支中的最新提交。 所以它和bwawok描述的相反:本地文件没有改变(它们看起来和之前的“git reset –soft”一模一样),但是历史被修改了(在指定的提交之后,分支被截断了)。

bwawok的答案可能是:

 git checkout <commit> 

你可以用它来窥探旧版本:我的代码昨天是怎么看的?

(我知道,我应该把这个注释给这个答案,但是stackoverflow不允许我这样做!我的声望太低了。)

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07是你之后…

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

 git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07 

回到你的git克隆在签入时的样子