使用 Git 根据提交 id 恢复到特定提交? [复制]
Posted
技术标签:
【中文标题】使用 Git 根据提交 id 恢复到特定提交? [复制]【英文标题】:Reverting to a specific commit based on commit id with Git? [duplicate] 【发布时间】: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 重置然后强制推送 【参考方案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 c14809fa
、git reset --soft TAG1
或 git 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 这个答案中,但是 *** 不允许我这样做!我的声誉太低了。)
【讨论】:
但git checkout
是只读的,因此您不能提交旧版本。
@Peter A:在“git reset --soft”和“git checkout”之后,我没有看到对我一直在处理的文件的更改。难道是因为我不在master分支?
您也可以在查看不同的提交后执行 'git checkout 以上是关于使用 Git 根据提交 id 恢复到特定提交? [复制]的主要内容,如果未能解决你的问题,请参考以下文章