【问题标题】:Reverting to a specific commit based on commit id with Git? [duplicate]使用 Git 根据提交 id 恢复到特定提交? [复制]
【发布时间】:2011-04-08 00:51:34
【问题描述】:

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

【问题讨论】:

  • 尽管这个问题实际上比它现在标记为重复的那个问题更老,但这个问题有更好的答案。 meta.stackexchange.com/questions/147643/…
  • 这是一个完美的例子,说明 git 是如何 f--k'd up 的(来自 bwawok 的回答):"... 那么如果你想把它推送给其他拥有新的历史,它会失败”。如果您无法将其签回远程存储库,那有什么好处???我对 Git 让简单操作变得如此困难感到非常惊讶。
  • @jww 我实际上已经阅读了一个小时关于如何返回上一个提交的内容,但我仍然不知道答案。你是绝对正确的,git 让事情变得比它应该的更复杂。
  • @robben 重置然后强制推送

标签: git


【解决方案1】:

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

【讨论】:

  • 不必输入整个 sha,只需一点点即可
  • @bwawok:但是选择和中键粘贴比输入缩写的 SHA1 更快!
  • git push origin mybranch 会导致原始仓库被还原吗?
  • @javadba 如果与前一个祖先“偏离”,则不是没有“--force”。
【解决方案2】:

你想将你的仓库回滚到那个状态,还是你只是想让你的本地仓库看起来像那样?

如果您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 都会做同样的事情。

【讨论】:

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

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

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07

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

【讨论】:

  • 什么情况下需要强制?
  • “签到时”是什么意思?模糊的。如果我这样做“git reset --hard X”是与提交 X 之前或提交 X 之后相同的仓库状态 ...
  • git reset --hard X。这将像提交 X 之前一样回滚存储库状态。它将使您的本地代码和本地历史记录与提交时一样。但是,如果您想将其推送到具有不同历史记录的本地主机或远程主机,它将失败。所以它将是您存储库的只读版本。
  • 如果说您签出以前从未签出的远程分支,并且当您执行git pull 时,它会强制您执行合并,而您想要的只是位于该分支的 HEAD 代码。
【解决方案4】:

我认为,bwawok 的回答在某些时候是错误的:

如果你这样做

git reset --soft c14809fa

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

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

根本不接触索引文件或工作树(但将头部重置为 ,就像所有模式一样)。正如 git status 所说,这会使您所有更改的文件都“提交更改”。

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

bwawok 回答的命令可能是:

git checkout <commit>

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

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

【讨论】:

  • git checkout 是只读的,因此您不能提交旧版本。
  • @Peter A:在“git reset --soft”和“git checkout”之后,我没有看到对我一直在处理的文件的更改。难道是因为我不在master分支?
  • 您也可以在查看不同的提交后执行 'git checkout ' 以恢复原始状态。
猜你喜欢
  • 2019-01-12
  • 2017-05-16
  • 2023-04-03
  • 1970-01-01
  • 2016-06-23
  • 2011-10-11
  • 2011-06-15
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多