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

Git 如何将文件重置或还原为特定版本?,git,version-control,git-checkout,Git,Version Control,Git Checkout,我对一个文件做了一些更改,该文件作为一组文件的一部分提交了几次,但现在希望将其上的更改重置/还原回以前的版本 我已经做了一个git日志和一个git diff来查找我需要的修订版,但是我不知道如何使文件恢复到以前的状态 git checkout -- foo 这将重置头部的foo。您还可以: git checkout HEAD^ foo 对于一个修订版本,等等。有趣的是,如果工作副本位于名为foo的目录中,git checkout foo将不起作用;但是,git checkout HEAD f

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

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

git checkout -- foo
这将重置头部的
foo
。您还可以:

git checkout HEAD^ foo

对于一个修订版本,等等。

有趣的是,如果工作副本位于名为
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

但是,请注意,
git checkout./foo
git 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
revision,然后再执行此操作。

假设所需提交的哈希值为
c5f567

git checkout c5f567 -- file1/to/restore file2/to/restore
手册页提供了更多信息

如果要在
c5f567
之前恢复到提交,请附加
~1
(其中1是要返回的提交次数,可以是任何内容):

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


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

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

我必须在这里插入,这是一个包装器,可以让git更容易被新手接受,而不会让经验丰富的用户感到困惑。它所做的事情之一就是。在这种情况下,您只需说:


foo/bar foo/baz

我想我是从……找到它的

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

首先:

$git log

这将显示最近提交的列表及其SHA1哈希

接下来,键入:

$git重置--硬SHA1\u散列


要将状态还原为给定的提交并永久删除记录中所有较新的提交,请执行以下操作。

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

git diff <commit hash> <filename>
然后,当您准备合并这些更改时,您可以根据主线重新设置基础:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
git签出
git重基主控器
切换到主分支
git合并
git还原
将还原给定的提交。听起来好像您认为git revert只会影响最近的提交


如果您想还原特定文件中的更改,并且提交更改的内容比该文件更改的内容多,那么这并不能解决您的问题。

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

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

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

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

$ git revert $B

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

以下是
重新设置基址
的工作原理:

由于“base”和“modify”分支都是显式的,因此可能更容易记住此命令

。最终的历史结果是:

master
都参考
B'
。此外,从这一点上可以安全地删除
参考

git branch -d <my branch>
git分支-d

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

git checkout master~5 image.png

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

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

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

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

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

这对我很有用:

git checkout <commit hash> file

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


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

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

cd <working copy>
git revert master
cd
git还原主控程序
将撤消似乎要执行的最后一次提交


Ian

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

git checkout HEAD file/to/restore

git校验参考号| commitHash--
git rebase master <my branch>
---o----o----o----o   master
                   \----A'----B'  <my branch>
git checkout master
git merge <my branch>
---o----o----o----o----A'----B'  master, <my branch>
git branch -d <my branch>
git checkout master~5 image.png
git checkout [commit-ref] [filename]
git checkout <commit hash> file
git commit -a
cd <working copy>
git revert master
git checkout HEAD file/to/restore
git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar
git checkout HEAD^1 path/to/file
git checkout HEAD~1 path/to/file
git checkout eb917a1 YourFileName
git reset HEAD YourFileName
git checkout YourFileName
git prevision <N> <filename>
git prevision -1 x/y/z.c
[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"
git show $revision:$file > $file
git show $revision:$file
git show $revision:$file | vim -R -
git archive $revision $file | tar -x0 > $file
git diff <sha>^ <sha> path/to/file.ext | git apply -R
git reset HEAD path_to_file
git checkout -- path_to_file
# git checkout <previous commit_id> <file_name>
# git commit --amend
git checkout Last_Stable_commit_Number -- fileName
git checkout branchName_Which_Has_stable_Commit fileName
git restore --source=c5f567 file1/to/restore file2/to/restore
git restore --source=c5f567~1 file1/to/restore file2/to/restore