使用Git将特定文件重置或还原到特定版本?

时间:2008-10-18 23:34:03

标签: git version-control git-checkout

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

我已经git loggit diff一起找到了我需要的修订版,但是根本不知道如何将文件恢复到以前的状态。

32 个答案:

答案 0 :(得分:5393)

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

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

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

如果您想在c5f567之前恢复提交,请附加~1(适用于任何数字):

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

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

答案 1 :(得分:558)

您可以使用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>

答案 2 :(得分:332)

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

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

答案 3 :(得分:262)

git checkout -- foo

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

git checkout HEAD^ foo

返回一个修订版等

答案 4 :(得分:117)

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

git checkout HEAD file/to/restore

答案 5 :(得分:103)

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

git checkout [commit-ref] [filename]

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

答案 6 :(得分:89)

如果您知道需要返回的提交数量,可以使用:

git checkout master~5 image.png

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

答案 7 :(得分:80)

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

有时候你只想回去忘记每一次过去的变化,因为他们都错了。

开始于:

$ git log

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

接下来,输入:

$ git reset --hard SHA1_HASH

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

答案 8 :(得分:61)

这对我有用:

git checkout <commit hash> file

然后提交更改:

git commit -a

答案 9 :(得分:54)

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

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

$ git checkout $A file

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

另一方面,你的意思是摆脱引入的第二次迭代(即提交$ B)的变化,同时保持$ C对文件的提交,你想要还原$ B

$ git revert $B

请注意,创建提交$ B的人可能不是非常自律,并且可能在同一次提交中提交了完全无关的更改,并且此恢复可能会触及 file 以外的文件,您会看到有违规的更改,因此你可能想在这样做后仔细检查结果。

答案 10 :(得分:36)

有趣的是,如果工作副本位于名为foo的目录中,'git checkout foo'将无效;然而,“git checkout HEAD foo”和“git checkout ./foo”都会:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo

答案 11 :(得分:32)

以下是rebase的工作原理:

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

假设你有

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

前两个命令...... 承诺     git checkout     git rebase master

...查看要应用于master分支的更改分支。 rebase命令接受来自<my branch>的提交(master中未找到的提交)并将其重新应用于master的头部。换句话说,<my branch>中第一次提交的父级不再是master历史记录中的先前提交,而是master的当前头部。这两个命令与:

相同
git rebase master <my branch>

可能更容易记住此命令,因为“基本”和“修改”分支都是显式的。

。最终的历史结果是:

---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>

答案 12 :(得分:22)

首先重置目标文件头

git reset HEAD path_to_file

第二次检出该文件

git checkout -- path_to_file

答案 13 :(得分:20)

我必须在这里插入EasyGit,这是一个包装器,可以让新手更容易接近git而不会混淆经验丰富的用户。它所做的一件事是give more meanings to git revert。在这种情况下,您只需说:

eg revert foo/bar foo/baz

答案 14 :(得分:20)

如果您要将文件还原为先前的提交(以及要还原已提交的文件),可以使用

git checkout HEAD^1 path/to/file

git checkout HEAD~1 path/to/file

然后暂停并提交“新”版本。

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

如果树中只有一个父项,则可以使用。

答案 15 :(得分: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修订。

答案 16 :(得分:15)

这里有很多建议,大多数都是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

答案 17 :(得分:11)

要转到文件的先前提交版本,请获取提交编号,例如eb917a1 那么

git checkout eb917a1 YourFileName

如果您只需要返回上一个提交的版本

git reset HEAD YourFileName
git checkout YourFileName

这将简单地带您到文件的最后一个提交状态

答案 18 :(得分:11)

从git v2.23.0开始,有一个新的git restore方法应该假定git checkout负责的一部分(即使接受的答案也提到git checkout令人困惑) 。请查看github blog上的更改要点。

此命令的默认行为是恢复工作树的状态,其内容来自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

答案 19 :(得分:11)

对我来说,没有一个回复看起来很清楚,因此我想补充一下这看起来非常简单。

我有一个提交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. 在第2步和第3步之间,您当然可以git status了解发生了什么。通常您会看到file.txt已添加,这就是为什么不需要git add

答案 20 :(得分:10)

git checkout ref | commitHash - filePath

e.g。

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar

答案 21 :(得分:8)

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

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

答案 22 :(得分:8)

此处的许多答案声称使用git reset ... <file>git checkout ... <file>,但通过这样做,您将放弃在要恢复的提交后提交的<file>上的所有修改。

如果您只想恢复单个文件上的一次提交更改,就像git revert只会执行一个文件(或者说是提交文件的子集),我建议同时使用git diff 1}}和git apply之类的(<sha> =要恢复的提交的哈希值):

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

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

当然,如果<sha1>HEAD(冲突)之间的任何提交修改了已恢复的行,它将无效。

答案 23 :(得分:7)

显然有人需要在git上写一本可理解的书,或者需要在文档中更好地解释git。面对同样的问题,我猜到了

cd <working copy>
git revert master

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

伊恩

答案 24 :(得分:6)

如果您在上一次提交中提交了错误的文件,请遵循以下说明:

  1. 开源树,更改为此提交

open source tree

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

enter image description here

  1. 您可以看到该提交中的更改列表 list of files in the source tree
  2. 选择它,然后单击右侧的按钮...单击反向文件
  3. 然后您可以在左下角的文件状态标签上看到它 然后点击取消登台:

file status tab

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

enter image description here

答案 25 :(得分:5)

  1. 将Git还原到特定提交
  

git checkout Last_Stable_commit_Number-fileName

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

git checkout branchName_Which_Has_stable_Commit fileName

答案 26 :(得分:4)

git revert <hash>

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

如果您想恢复特定文件中的更改并且提交的更改次数超过该文件,则无法解决您的问题。

答案 27 :(得分:4)

您可以分4个步骤完成:

  1. 使用您要专门还原的文件还原整个提交 - 它将在您的分支上创建新提交
  2. 提交的软重置 - 删除提交并将更改移至工作区
  3. 手工挑选文件以还原并提交
  4. 删除工作区中的所有其他文件
  5. 您需要在终端中输入

    1. git revert <commit_hash>
    2. git reset HEAD~1
    3. git add <file_i_want_to_revert>&amp;&amp; git commit -m 'reverting file'
    4. git checkout .
    5. 祝你好运

答案 28 :(得分:3)

这是一个非常简单的步骤。将文件检出到我们想要的提交ID,这里是一个提交ID,然后是git commit修改,我们就完成了。

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

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

答案 29 :(得分:1)

如果你正在使用Git Extensions并且你只想恢复到该文件的父提交,你可以选择包含你要恢复的更改的提交,然后选择&#39; Diff&#39 ;在详细信息窗格中的选项卡上,右键单击要还原的文件,然后将文件重置为&#39; ....,然后&#39; A&#39; (父母)

答案 30 :(得分:1)

这是我的方式。

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

b)git - &gt;显示历史记录,找到我想要恢复的先前提交。获取commit_id(即提交哈希)。

c)git checkout commit_id file_path

答案 31 :(得分:0)

  • 运行以下命令进行软重置,更改就会出现在您的本地。
git reset --soft HEAD^1
  • 查看您之前提交的文件的状态 本地,然后进行更改。
 git status
  • 进行更改后提交并推送文件

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