5220

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

我已经完成了 agit log和 agit diff以找到我需要的修订版,但只是不知道如何将文件恢复到过去的以前状态。

4

34 回答 34

7099

假设您想要的提交的哈希是c5f567

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

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

如果您想恢复之前的提交c5f567,请追加~1(其中 1 是您想要返回的提交次数,可以是任何值):

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

作为旁注,我一直对这个命令感到不舒服,因为它既用于普通事物(在分支之间更改),也用于不寻常的破坏性事物(丢弃工作目录中的更改)。


还有一个新git restore命令专门用于恢复已修改的工作副本文件。如果您的 git 足够新,您可以使用此命令,但文档附带警告:

此命令是实验性的。行为可能会改变。

于 2008-10-18T23:39:35.210 回答
685

您可以使用 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>
于 2008-12-17T06:59:33.757 回答
406

您可以使用对 git 提交的任何引用,如果最方便的话,包括 SHA-1。关键是命令看起来像这样:

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

于 2009-04-07T21:48:35.297 回答
334
git checkout -- foo

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

git checkout HEAD^ foo

一次修订,等等。

于 2008-08-29T20:56:12.433 回答
137

并且要恢复到最常需要的最后提交的版本,您可以使用这个更简单的命令。

git checkout HEAD file/to/restore
于 2012-01-14T06:15:35.983 回答
112

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

git checkout [commit-ref] [filename]

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

于 2009-05-27T17:52:22.760 回答
97

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

git checkout master~5 image.png

这假设您在master分支上,并且您想要的版本是 5 次提交。

于 2009-04-07T14:03:18.987 回答
86

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

有时你只想回到过去,忘记过去的每一个变化,因为它们都是错误的。

从...开始:

$ git log

它向您显示了最近提交的列表,以及它们的 SHA1 哈希值。

接下来,键入:

$ git reset --hard SHA1_HASH

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

于 2008-12-17T06:53:25.157 回答
78

从 git v2.23.0 开始,有一个新的git restore方法应该承担部分git checkout责任(即使是接受的答案也提到这git checkout很令人困惑)。请参阅github 博客上的更改亮点。

此命令的默认行为是使用来自source参数的内容(在您的情况下将是提交哈希)恢复工作树的状态。

因此,根据 Greg Hewgill 的回答(假设提交哈希为c5f567),命令将如下所示:

git restore --source=c5f567 file1/to/restore file2/to/restore

或者如果你想恢复到 c5f567 之前的一次提交的内容:

git restore --source=c5f567~1 file1/to/restore file2/to/restore
于 2019-08-27T14:08:37.713 回答
68

这对我有用:

git checkout <commit hash> file

然后提交更改:

git commit -a
于 2011-08-25T22:12:22.210 回答
57

当你说“回滚”时,你必须小心。如果您曾经在提交 $A 中有一个文件版本,然后在两个单独的提交 $B 和 $C 中进行了两次更改(所以您看到的是文件的第三次迭代),如果您说“我想回滚到第一个”,你真的是这个意思吗?

如果你想摆脱第二次和第三次迭代的变化,这很简单:

$ git checkout $A file

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

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

$ git revert $B

请注意,创建提交 $B 的人可能不是很自律,并且可能在同一次提交中提交了完全不相关的更改,并且此还原可能会触及文件以外的文件,而不是您看到有问题的更改,因此您可能需要在执行后仔细检查结果所以。

于 2009-01-11T08:13:39.717 回答
41

有趣git checkout foo的是,如果工作副本位于名为foo; 但是,两者都git checkout HEAD foogit checkout ./foo

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo
于 2008-08-29T21:26:35.510 回答
35
  1. Git 将文件还原为特定的提交
git checkout Last_Stable_commit_Number -- fileName

2.Git 将文件还原到特定分支

git checkout branchName_Which_Has_stable_Commit fileName
于 2019-02-06T09:30:30.383 回答
33

工作原理如下rebase

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

假设你有

---o----o----o----o  master
    \---A----B       <my branch>

前两个命令 ... commit git checkout git rebase master

...查看要应用于分支的更改的master分支。该rebase命令从<my branch>(在 中找不到master)获取提交并将它们重新应用到master. 换句话说,第一个 commit 的 parent<my branch>不再是master历史中的先前 commit,而是master. 这两个命令是一样的:

git rebase master <my branch>

记住这个命令可能更容易,因为“base”和“modify”分支都是明确的。

. 最终的历史结果是:

---o----o----o----o   master
                   \----A'----B'  <my branch>

最后两个命令...

git checkout master
git merge <my branch>

...进行快进合并以将所有<my branch>更改应用到master. 如果没有这一步,rebase 提交不会被添加到master. 最终结果是:

---o----o----o----o----A'----B'  master, <my branch>

master并且<my branch>两者都参考B'。此外,从这一点开始,删除<my branch>引用是安全的。

git branch -d <my branch>
于 2009-02-24T09:43:49.043 回答
26

目标文件的第一个重置头

git reset HEAD path_to_file

第二次签出该文件

git checkout -- path_to_file
于 2017-04-04T10:25:08.093 回答
23

如果您想将文件恢复到以前的提交(以及要恢复的文件已经提交),您可以使用

git checkout HEAD^1 path/to/file

或者

git checkout HEAD~1 path/to/file

然后只需暂存并提交“新”版本。

有了在合并的情况下提交可以有两个父级的知识,您应该知道 HEAD^1 是第一个父级,而 HEAD~1 是第二个父级。

如果树中只有一个父级,则任何一个都可以。

于 2014-01-11T00:29:50.133 回答
21

git-aliases、awk 和 shell 函数来救援!

git prevision <N> <filename>

其中<N>是要回滚的文件的修订数 file <filename>
例如,要检出单个文件的上一个版本x/y/z.c,运行

git prevision -1 x/y/z.c

git prevision 是如何工作的?

将以下内容添加到您的gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

该命令基本上

  • git log对指定的文件执行 a并且
  • 在文件的历史记录中选择适当的提交 ID 并
  • git checkout对指定文件的 commit-id执行 a 。

从本质上讲,在这种情况下,所有手动操作都
包含在一个漂亮、高效的 git-alias 中 - git-prevision

于 2015-05-01T01:46:58.340 回答
21

这里有很多建议,大部分都是这样的git checkout $revision -- $file。几个不起眼的选择:

git show $revision:$file > $file

而且,我经常使用它来临时查看特定版本:

git show $revision:$file

或者

git show $revision:$file | vim -R -

(OBS:如果是工作的相对路径,$file需要加上前缀)./git show $revision:$file

更奇怪的是:

git archive $revision $file | tar -x0 > $file
于 2016-01-07T22:19:45.773 回答
20

我必须在这里插入EasyGit,它是一个包装器,可以让 git 对新手更容易上手,而不会让经验丰富的用户感到困惑。它所做的其中一件事是赋予git revert. 在这种情况下,您只需说:

eg revert foo/bar foo/baz

于 2008-10-19T00:16:01.937 回答
18

但是请注意,这git checkout ./foogit checkout HEAD ./foo 并不完全相同。一个例子:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(第二add阶段文件在索引中,但它没有被提交。)

Git checkout ./foo./foo表示从索引恢复路径;添加HEAD指示 Git 在执行此操作之前将索引中的该路径恢复为其 HEAD修订版。

于 2008-08-31T11:54:16.977 回答
15

对我来说,没有一个答复似乎很清楚,因此我想添加我的,这似乎超级简单。

我有一个提交abc1,之后我对一个文件做了几次(或一次修改)file.txt

现在说我在文件中搞砸了一些东西,file.txt我想回到以前的提交abc1

1. git checkout file.txt:如果您不需要它们,这将删除本地更改

2 git checkout abc1 file.txt.:这会将您的文件带到您想要的版本

3. git commit -m "Restored file.txt to version abc1":这将提交您的回复。

  1. git push:这会将所有内容推送到远程存储库

在第 2 步和第 3 步之间,您当然可以git status了解发生了什么。通常你应该看到file.txt已经添加的,这就是为什么不需要git add.

于 2017-03-22T21:33:50.970 回答
12

这里的许多答案声称使用git reset ... <file>,或者git checkout ... <file>但是这样做,您将在<file>您想要恢复的提交之后放弃提交的所有修改。

如果您只想恢复对单个文件的一次提交的更改,就像git revert只对一个文件(或说提交文件的一个子集)所做的那样,我建议同时使用这两种git diff方式git apply(使用<sha>= 的哈希提交你想恢复):

git diff <sha>^ <sha> path/to/file.ext | git apply -R

基本上,它将首先生成与您要还原的更改相对应的补丁,然后反向应用补丁以删除这些更改。

当然,如果恢复的行已被<sha1>and之间的任何提交修改HEAD(冲突),则它将不起作用。

于 2016-12-07T14:43:49.573 回答
11

为了转到文件的先前提交版本,获取提交号,然后说 eb917a1

git checkout eb917a1 YourFileName

如果您只需要返回到上次提交的版本

git reset HEAD YourFileName
git checkout YourFileName

这只会带您进入文件的最后提交状态

于 2014-02-25T14:01:20.027 回答
11

这是一个非常简单的步骤。将文件签出到我们想要的提交 id,这里之前是一个提交 id,然后只需 git commit amend 就完成了。

# git checkout <previous commit_id> <file_name>
# git commit --amend

这非常方便。如果我们想将任何文件带到提交顶部的任何先前提交 id,我们可以轻松做到。

于 2019-01-24T17:21:50.020 回答
10

git checkout ref|commitHash -- 文件路径

例如

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar
于 2013-09-26T17:04:32.513 回答
9

您可以通过 4 个步骤完成:

  1. 使用您要专门还原的文件还原整个提交 - 它将在您的分支上创建一个新提交
  2. 提交的软重置 - 删除提交并将更改移动到工作区
  3. 手动选择要还原并提交的文件
  4. 删除工作区中的所有其他文件

您需要在终端中输入的内容

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert>&&git commit -m 'reverting file'
  4. git checkout .

祝你好运

于 2018-05-08T10:26:21.180 回答
8

用于git log获取特定版本的哈希键,然后使用git checkout <hashkey>

注意:不要忘记在最后一个之前键入哈希。最后一个哈希指向您当前的位置(HEAD)并且没有任何改变。

于 2011-12-05T20:09:51.223 回答
7

显然有人需要写一本关于 git 的通俗易懂的书,或者需要在文档中更好地解释 git。面对同样的问题,我猜想

cd <working copy>
git revert master

将撤消似乎要做的最后一次提交。

伊恩

于 2011-12-16T03:03:25.957 回答
5
git revert <hash>

将还原给定的提交。听起来您认为git revert只会影响最近的提交。

这并不能解决您的问题,如果您想恢复特定文件中的更改并且该提交更改的内容多于该文件。

于 2008-12-17T18:56:14.260 回答
5

如果您在最后一次提交中提交了错误的文件,请按照说明进行操作:

  1. 开源树,改到这个提交

开源树

  1. 更改行并找到错误文件作为提交发送的提交

在此处输入图像描述

  1. 您可以在该提交中看到您的更改列表 源树中的文件列表
  2. 选择它然后单击...按钮右侧...单击反向文件
  3. 然后您可以在左下角的文件状态选项卡上看到它,然后单击取消暂存:

文件状态选项卡

  1. 打开您的 Visual Studio 代码并通过提交已删除的文件来恢复
  2. 毕竟,您可以在源代码树中看到最后一次提交的结果

在此处输入图像描述

于 2018-08-23T09:53:27.673 回答
3

这是我的方式。

a) 在 Android Studio 中,打开文件。

b) git -> Show History,找到我想要恢复的上一个提交。获取 commit_id(即提交哈希)。

C)git checkout commit_id file_path

于 2017-03-13T08:10:57.963 回答
2

如果您正在使用 Git 扩展并且只想恢复到文件的父提交,则可以选择包含要恢复的更改的提交,然后在详细信息窗格中选择“差异”选项卡,右键单击您要还原的文件,然后是“将文件重置为” ....,然后是“A”(父级)

于 2017-09-26T01:48:14.703 回答
-2

对于文件“a.txt”、“b.txt”、“c.txt”:

  1. git revert -n <commit>(例如git revert -n HEAD恢复上次提交)。这将准备(但不提交!)并暂存所有更改以撤消特定提交

  2. git reset. 这将取消暂存所有反向更改,以便您可以手动添加要更改回来的文件。

  3. git add a.txt b.txt c.txt. 这会将您要撤消更改的文件添加到新提交中。

  4. git commit -m 'Undo <commit> for a.txt, b.txt, c.txt'. 提交实际更改

  5. git reset --hard. 摆脱你不想撤消的任何事情。

于 2021-09-18T18:34:11.643 回答
-5
  • 运行以下执行软重置的命令,更改将出现在您的本地。
git reset --soft HEAD^1
  • 查看您之前提交到本地的文件的状态,然后进行更改。
 git status
  • 进行更改后提交并推送文件

  • 不会显示错误提交文件的先前提交历史记录

在从原点拉出之前总是有修剪(可选步骤)

 git remote prune origin

于 2021-04-15T08:01:52.910 回答