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

pro*_*eek 302 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 ...
Run Code Online (Sandbox Code Playgroud)
  • 如何将其还原为特定提交?例如,如果我想回去,我该怎么办commit c14809fafb08b9e96ff2879999ba8c807d10fb07

  • 有没有其他/更好的方法回到Git的特定提交?例如,我可以将每个提交的一些标签放回标签中吗?

bwa*_*wok 484

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

如果你这样做

git reset --hard c14809fa
Run Code Online (Sandbox Code Playgroud)

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

如果你这样做

git reset --soft c14809fa
Run Code Online (Sandbox Code Playgroud)

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

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

编辑 -

您可以在您的仓库中添加"标签"..然后返回标签.但标签实际上只是sha1的快捷方式.

您可以标记该为TAG1 ..然后git reset --soft c14809fa,git reset --soft TAG1git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07将所有做同样的事情.

  • 彼得在下面的回答比这更有意义 (12认同)
  • 澄清一下:"git reset --soft"不会使历史记录保持不变,因为它会删除一次重置后完成的所有提交条目,并将这些较新提交的文件标记为"要提交的更改".我想这取决于你如何定义"历史".句子"但保留你的历史等等." 让我解释这个答案,好像命令根本没有影响任何提交,它确实如此.请参阅Peter A关于如何在提交恢复后保持提交完成的答案. (5认同)
  • 每当我遇到麻烦时,我都来到同一个地方.谢谢!!:d (4认同)
  • 我需要回滚到那种状态。但是很高兴知道我可以选择“看起来像这样”。谢谢你让我知道。顺便说一句,默认选项是什么?硬还是软? (2认同)
  • @prosseek默认实际上是混合的。--mixed重置索引,但不重置工作树(即,已更改的文件将保留但未标记为提交),并报告未更新的内容。这是默认操作。参见http://www.kernel.org/pub/software/scm/git/docs/git-reset.html (2认同)
  • 这有效,但后来我需要“git Push --force”来代替我正常的“git Push”。 (2认同)

Pet*_*r A 163

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

如果你这样做

git reset --soft c14809fa
Run Code Online (Sandbox Code Playgroud)

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

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

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

因此它将从分支中"删除"更新的提交.这意味着,在查看旧代码后,您无法再轻松地再次访问此分支中的最新提交.因此,它由bwawok描述的opposide:本地文件不被改变(它们看起来像以前一样"混帐重置--soft"),但历史上被修改(分公司指定截断后提交).

bwawok答案的命令可能是:

git checkout <commit>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 一个伟大的人,到目前为止,声誉低下:) (3认同)
  • 但是`git checkout` 是只读的,因此你不能提交旧版本。 (2认同)
  • @Peter A:在“git reset --soft”和“git checkout”之后,我没有看到我一直在处理的文件发生变化。难道是因为我不在master分支? (2认同)
  • 此外,您还可以在查看不同的提交后执行“git checkout &lt;YOUR_BRANCH&gt;”以恢复原始状态。 (2认同)

Doc*_*hes 25

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

  • @bwawok:但是选择和中间点击粘贴的速度要快于输入缩写的SHA1! (40认同)
  • 请问`git push origin mybranch`会导致原始回购被还原吗? (9认同)
  • 不必输入整个 sha,只需一点点即可 (2认同)
  • @javadba如果与前一个祖先存在偏差,则不能没有“--force”。 (2认同)

小智 5

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

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07
Run Code Online (Sandbox Code Playgroud)

让您回到签到时git克隆的样子

  • 在什么情况下您需要强制? (2认同)
  • “签到时”是什么意思?暧昧。如果我执行“ git reset --hard X”是与提交X之前或提交X之后相同的回购状态... (2认同)
  • git reset --hardX。这将像提交X之前一样回滚存储库状态。这将使您的本地代码和本地历史记录与该提交时相同。但是,如果您要将其推送到具有不同历史记录的本地主机或远程主机,则它将失败。因此它将是您存储库的只读版本。 (2认同)