如何将文件重置或还原到特定版本?

我对文件进行了一些更改,该文件已作为一组文件的一部分提交了几次,但现在想将其更改重置 / 还原为以前的版本。

我已经做了一个git log和一个git diff来找到我需要的修订,但是却不知道如何使文件回到过去的状态。

答案

假设所需的提交哈希为c5f567

git checkout c5f567 -- file1/to/restore file2/to/restore

git checkout手册页提供了更多信息。

如果要还原到c5f567之前的提交,请附加~1 (适用于任何数字):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

附带说明一下,对于该命令,我一直感到不舒服,因为它既用于普通事物(在分支之间切换)又用于异常,破坏性事物(丢弃工作目录中的更改)。

您可以使用 diff 命令快速查看对文件所做的更改:

git diff <commit hash> <filename>

然后要将特定文件还原到该提交,请使用 reset 命令:

git reset <commit hash> <filename>

如果您进行了本地修改,则可能需要使用--hard选项。

管理航点的一个很好的工作流程是使用标签在时间轴中标记清楚。我不太理解您的最后一句话,但是您可能想要的是将分支与上一个时间点分开。为此,请使用方便的 checkout 命令:

git checkout <commit hash>
git checkout -b <new branch name>

准备合并这些更改时,可以根据主线将其重新设置为基础:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

您可以使用对 git commit 的任何引用,如果最方便的话,可以包括 SHA-1。关键是该命令如下所示:

git checkout [commit-ref] -- [filename]

git checkout -- foo

这会将foo重置为 HEAD。你也可以:

git checkout HEAD^ foo

一回修订等

要恢复到最常用的最后提交版本,可以使用此更简单的命令。

git checkout HEAD file/to/restore

刚才我遇到了同样的问题,我发现这个答案最容易理解( commit-ref是您想返回的日志更改的 SHA 值):

git checkout [commit-ref] [filename]

这会将旧版本放在您的工作目录中,如果需要,可以从那里提交。

如果您知道需要返回多少次提交,则可以使用:

git checkout master~5 image.png

假设您在master分支上,并且想要的版本是 5 commits。

我想我已经找到了它。... 来自http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

有时您只是想回去,忘记经过某个特定点的所有更改,因为它们都是错误的。

从... 开始:

$ git log

其中显示了最近提交及其 SHA1 哈希的列表。

接下来,键入:

$ git reset --hard SHA1_HASH

将状态恢复为给定的提交,并从记录中永久删除所有较新的提交。

这为我工作:

git checkout <commit hash> file

然后提交更改:

git commit -a

说 “回滚” 时必须小心。如果您以前在 $ A 提交中拥有文件的一个版本,然后又在 $ B 和 $ C 的两个单独提交中进行了两次更改(那么您看到的是文件的第三次迭代),并且如果您说 “我想回滚到第一个”,您是真的吗?

如果要摆脱第二次和第三次迭代的更改,这非常简单:

$ git checkout $A file

然后提交结果。命令询问 “我要从提交 $ A 记录的状态中检出文件”。

另一方面,您的意思是摆脱第二次迭代(即提交 $ B)带来的更改,同时保留提交 $ C 对文件所做的操作,您希望恢复 $ B

$ git revert $B

请注意,无论谁创建的提交 $ B 可能都没有受到严格的纪律,并且可能在同一提交中提交了完全不相关的更改,并且此还原可能会涉及您看到有问题的更改以外的文件 ,因此您可能需要在执行后仔细检查结果所以。