关于版本控制:使用git将特定文件重置或还原为特定版本?

Reset or revert a specific file to a specific revision using Git?

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

我已经做了一个git log和一个git diff来查找我需要的修订,但不知道如何将文件恢复到以前的状态。


假设您想要的提交的散列值是c5f567

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

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

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

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

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


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

1
git diff <commit hash> <filename>

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

1
git reset <commit hash> <filename>

如果您有局部修改,可能需要使用--hard选项。

管理航点的一个好工作流程是使用标记在时间线上清晰地标记点。我不太明白你的最后一句话,但你可能想要的是把一个分支从前一个时间点分开。要执行此操作,请使用便捷的签出命令:

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

然后,当您准备合并这些更改时,可以将其重新设置为与主线相对应:

1
2
3
4
git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>


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

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


1
git checkout -- foo

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

1
git checkout HEAD^ foo

一次修订等。


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

1
git checkout HEAD file/to/restore


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

1
git checkout [commit-ref] [filename]

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


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

1
git checkout master~5 image.png

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


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

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

开始:

$ git log

它向您显示最近提交的列表以及它们的sha1散列。

下一步,类型:

$ git reset --hard SHA1_HASH

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


这对我很有用:

1
git checkout <commit hash> file

然后提交更改:

1
git commit -a


当你说"回滚"时必须小心。如果您以前在commit$a中有一个文件版本,然后在两个单独的commit$b和$c中进行了两次更改(那么您看到的是文件的第三次迭代),如果您说"我想回滚到第一次",您真的是这么想的吗?

如果您想消除第二次和第三次迭代中的更改,那么非常简单:

1
$ git checkout $A file

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

另一方面,您的意思是消除第二次迭代(即commit$b)带来的更改,同时保留commit$c对文件所做的操作,您希望恢复$b

1
$ git revert $B

请注意,创建commit$b的人可能没有受到严格的约束,并且可能在同一个commit中进行了完全不相关的更改,并且此还原可能接触到文件以外的其他文件,因此您可能希望在执行此操作后仔细检查结果。


有趣的是,如果工作副本位于名为foo的目录中,"git checkout foo"将不起作用;但是,"git checkout head foo"和"git checkout./foo"都将:

1
2
3
4
5
6
7
$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on"foo"
$ git checkout ./foo
$ git checkout HEAD foo


以下是rebase的工作原理:

1
2
3
4
git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

假设你有

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

前两个命令…犯罪GIT校验Git钢筋主控形状

…查看要应用于master分支的更改分支。rebase命令接受的承诺(在master中没有发现),并将其重新应用到master的头上。换言之,中第一个提交的父级不再是master历史中的前一个提交,而是master的当前负责人。这两个命令相同:

1
git rebase master <my branch>

因为"base"和"modify"分支都是显式的,所以记住这个命令可能更容易。

. 最后的历史结果是:

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

最后两个命令…

1
2
git checkout master
git merge <my branch>

…进行快进合并,将所有更改应用到master上。如果不执行此步骤,则不会将rebase commit添加到master中。最终结果是:

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

master都参考B'。此外,从这一点上删除参考是安全的。

1
git branch -d <my branch>

目标文件的第一个重置头

1
git reset HEAD path_to_file

第二次签出该文件

1
git checkout -- path_to_file


git-aliases, awk and shell-functions to the rescue!

1
git prevision <N> <filename>

其中,是文件要回滚的文件修订数。例如,要签出单个文件x/y/z.c的前一个立即修订版,请运行

1
git prevision -1 x/y/z.c

Git预防如何工作?

将以下内容添加到您的EDOCX1[24]

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

The command basically

  • performs a git log on the specified file and
  • picks the appropriate commit-id in the history of the file and
  • executes a git checkout to the commit-id for the specified file.

基本上,在这种情况下,所有的手动操作,包裹在一个美丽、高效的Git别名中-Git prevision


我必须在这里插入EasyGit,它是一个包装器,可以使Git对新手更容易接近,而不会混淆经验丰富的用户。它所做的一件事就是赋予git revert更多的含义。在这种情况下,您只需说:

eg revert foo/bar foo/baz


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

1
git checkout HEAD^1 path/to/file

1
git checkout HEAD~1 path/to/file

然后准备好并提交"新"版本。

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

如果树中只有一个父级,这两种方法都可以。


但是,请注意,git checkout ./foogit checkout HEAD ./foo不是完全相同的事情;举例来说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ 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修订。


这里有很多建议,大部分是沿着git checkout $revision -- $file的路线。一些模糊的选择:

1
git show $revision:$file > $file

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

1
git show $revision:$file

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

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

更奇怪的是:

1
git archive $revision $file | tar -x0 > $file


对我来说,没有一个答复是非常清楚的,因此我想加上我的,这似乎是非常容易的。

我有一个承诺abc1,在它之后,我对一个文件file.txt做了几个(或一个修改)。

现在假设我在文件file.txt中弄错了什么,我想回到以前的承诺abc1

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

2.git checkout abc1 file.txt这会把你的文件带到你想要的版本。

3.江户十一〔16〕号:这将使你复归。

  • git push:这将推动远程存储库上的所有内容
  • 在第2步和第3步之间,您当然可以执行git status来了解发生了什么。通常你应该看到file.txt已经添加,这就是为什么不需要git add的原因。


    要转到文件的前一个提交版本,请获取提交编号,例如eb917a1然后

    1
    git checkout eb917a1 YourFileName

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

    1
    2
    git reset HEAD YourFileName
    git checkout YourFileName

    这只会将您带到文件的最后一个提交状态


    git checkout ref_commithash--文件路径

    例如

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

    使用git log获取特定版本的散列密钥,然后使用git checkout

    注意:不要忘记在最后一个哈希之前键入哈希。最后一个散列点指向您当前的位置(头),不更改任何内容。


    这里的许多答案都声称使用了git reset ... git checkout ... ,但是这样做会使您在想要恢复的提交之后对所做的所有修改都变松。

    如果您只想在单个文件上从一个提交中恢复更改,就像git revert只对一个文件(或者说提交文件的一个子集)那样,我建议使用git diffgit apply两种方法(表示您要恢复的提交的散列值):

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

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

    当然,如果恢复的行被HEAD之间的任何承诺所修改(冲突),则不起作用。


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

    1
    2
    cd <working copy>
    git revert master

    将撤消上一次似乎已完成的提交。

    伊恩


    如果在上一次提交中提交了错误的文件,请按照以下说明操作:

  • 打开源代码树,更改为此提交
  • open source tree

  • 更改行,并发现提交错误的文件作为提交发送
  • enter image description here

  • 您可以在提交中看到更改的列表。list of files in the source tree
  • 选择它,然后单击…按钮右侧…单击"反向文件"
  • 然后您可以在左下角的"文件状态"选项卡上看到它。然后单击取消页面:
  • file status tab

  • 打开Visual Studio代码并通过提交删除的文件还原
  • 毕竟,您可以在源代码树中看到上次提交的结果。
  • enter image description here


    1
    git revert <hash>

    将还原给定的提交。听起来你好像认为git revert只影响最近的承诺。

    这并不能解决您的问题,如果您希望恢复特定文件中的更改,并且提交的更改超过了该文件。


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

  • 用您要特别还原的文件还原整个提交-它将在您的分支上创建一个新的提交
  • 软重置提交-删除提交并将更改移动到工作区
  • 手动选取要还原的文件并提交它们
  • 删除工作区中的所有其他文件
  • 您需要在终端中键入的内容:

  • git revert
  • git reset HEAD~1
  • git add git commit -m 'reverting file'
  • git checkout .
  • 祝你好运


  • Git将文件还原为特定的提交
  • git checkout Last_Stable_commit_Number -- fileName

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

    1
    git checkout branchName_Which_Has_stable_Commit fileName


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

    1
    2
    # git checkout [cc] <file_name>
    # git commit --amend

    这很方便。如果我们想在提交顶部将任何文件带到任何先前的提交ID,我们可以很容易地做到。


    这是我的路。

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

    b)git->show history,查找要恢复到的上一次提交。获取提交ID(即提交哈希)。

    c)git checkout commit_id file_path


    如果您使用的是git扩展名,并且只希望还原为文件的父提交,则可以选择包含要还原的更改的提交,然后在"详细信息"窗格中选择"diff"选项卡,右键单击要还原的文件,然后将文件重置为"…",然后选择"a"(父文件)。