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

git version-control git-checkout 摸头 | 2020-02-02 19:35:06


我对作为一组文件的一部分提交了几次的文件进行了一些更改,但现在希望将其上的更改重置/还原回以前的版本。
我已经做了一个
git log
和一个
git diff
来找到我需要的修订版,但是我不知道如何将文件恢复到以前的状态。





30 答案



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

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

git签出手册页提供了更多信息。
如果您想在
c5f567
之前还原到提交,请附加
~1
(与任意数字一起使用):
git checkout c5f567~1 -- file1/to/restore file2/to/restore

作为补充说明,我一直不喜欢这个命令,因为它既用于普通的事情(在分支之间更改),也用于不寻常的破坏性事情(丢弃工作目录中的更改)。

2020-02-02 19:35:18
mimiss


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

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

如果您进行了本地修改,则可能需要使用
--hard
选项。
管理的良好工作流航路点是使用标记来清晰地标记时间线中的点。我不太明白你的最后一句话,但你可能想把一个分支从上一个时间点分开。要执行此操作,请使用方便的签出命令:
git checkout 
git checkout -b

然后,当您准备合并这些更改时,可以根据您的主线重新设置该值:
git checkout 
git rebase master
git checkout master
git merge

2020-02-02 19:35:18
血包


如果方便的话,可以使用对git提交的任何引用,包括SHA-1。关键是命令如下:
git checkout [commit-ref] -- [filename]

2020-02-02 19:35:18
9307


git checkout -- foo

foo
重置为HEAD。您还可以:
git checkout HEAD^ foo

进行一次修订等

2020-02-02 19:35:18
大湿


要恢复到最常用的最后提交版本,您可以使用这个简单的命令。
git checkout HEAD file/to/restore

2020-02-02 19:35:18
奔跑呀


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

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

2020-02-02 19:35:18
谏山澪黑仪


如果您知道需要返回多少提交,可以使用:
git checkout master~5 image.png

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

2020-02-02 19:35:18
可喵复制


我想我已经从http://www cs students.stanford.edu/~blynn/gitmagic/ch02.html找到了它,有时候你只想回到过去,忘记某个时刻过去的每一个变化,因为它们都是错的。
从:
$ git log

开始,其中显示了最近提交的列表及其SHA1散列。
接下来,键入:
$ git reset --hard SHA1_HASH

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

2020-02-02 19:35:18
寒蝉鸣泣


这对我有效:
git checkout  file

然后提交更改:
git commit -a

2020-02-02 19:35:18
六千田园


你说“回滚”时必须小心。如果您以前在commit$a中有一个文件版本,然后在两个单独的commit$B和$C中做了两个更改(所以您看到的是文件的第三次迭代),如果您说“我想回滚到第一次”,您真的是指它吗?
如果您希望在第二次和第三次迭代中都消除更改,则非常简单:
$ git checkout $A file

然后提交结果。该命令询问“我想从commit$A记录的状态签出文件”。
另一方面,您的意思是去掉第二次迭代(即commit$B)带来的更改,同时保留commit$C对文件所做的更改,您需要还原$B
$ git revert $B

请注意,创建commit$B的人可能不是很严格,并且可能在同一次提交中提交了完全不相关的更改,并且此还原可能会接触到您看到的不符合要求的更改以外的文件,因此您可能希望在执行此操作后仔细检查结果。

2020-02-02 19:35:18
淡定的饕餮


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

2020-02-02 19:35:18
酷乐小M


以下是
rebase
的工作原理:
git checkout 
git rebase master
git checkout master
git merge


假设您有
---o----o----o----o  master
\---A----B

前两个命令…
commit
git checkout
gitrebasemaster
。。。查看要应用于
master
分支的更改分支。
rebase
命令接受来自
的提交(在
master
中找不到),并将其重新应用到
master
的头部。换句话说,在
中,第一次提交的父级不再是
master
历史中的前一次提交,而是
master
的当前头。这两个命令相同:
git rebase master 

由于“base”和“modify”分支都是显式的,因此可能更容易记住此命令。
。最终的历史结果是:
---o----o----o----o   master
\----A'----B'


最后两个命令…
git checkout master
git merge

。。。执行快进合并,将所有
更改应用到
master
。如果没有此步骤,rebase commit将不会添加到
master
。最终结果是:
---o----o----o----o----A'----B'  master, 

master
两者都引用了
B'
。此外,从这一点上可以安全地删除
引用。
git branch -d 

2020-02-02 19:35:18
小强强


第一次重置目标文件头
git reset HEAD path_to_file

第二次签出该文件
git checkout -- path_to_file

2020-02-02 19:35:18
苦瓜


git别名,awk和shell函数来解救!
git prevision  

其中
是要回滚文件的修订数,例如,要签出单个文件的前一个修订版
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
,并在文件的历史记录中选择适当的提交id,然后执行
git checkout
到指定的提交id文件。

基本上,在这种情况下,所有手动操作都会被一个漂亮、高效的git别名包起来-git prevision

2020-02-02 19:35:18
竹井久


我必须在这里插入EasyGit,这是一个包装器,可以让git更易于新手使用,而不会让经验丰富的用户感到困惑。它所做的一件事就是赋予
git revert
更多的含义。在这种情况下,您只需说:
eg revert foo/bar foo/baz

2020-02-02 19:35:18
aquabell


如果您希望将文件还原为以前的提交(并且您希望还原的文件已经提交),则可以使用
git checkout HEAD^1 path/to/file


git checkout HEAD~1 path/to/file

然后准备并提交“新”版本。
了解合并时提交可以有两个父级,您应该知道HEAD^1是第一个父级,HEAD~1是第二个父级。
如果树中只有一个父级,则这两种方法都有效。

2020-02-02 19:35:18
firego


从索引中;
添加
HEAD
指示Git在执行此操作之前将索引中的路径还原为其
HEAD
修订。

2020-02-02 19:35:18
BingoTony


这里有很多建议,大多数都是按照
git checkout $revision -- $file
的思路提出的。有两个模糊的替代方案:
git show $revision:$file > $file

而且,7]

2020-02-02 19:35:18
風祭雅


对我来说,没有一个答复是非常清楚的,因此我想补充我的答复,这似乎是非常容易的。
我有一个commit
abc1
并且在它之后,我对一个文件做了几次(或者一次修改)之后,我现在说我在文件中弄乱了一些东西,我想回到以前的commit
file.txt

1.
git checkout file.txt
:这将删除本地的更改,如果您不需要更改:这将使您的文件达到您想要的版本
3。
git commit -m "Restored file.txt to version abc1"
:这将提交您的恢复。
git push
:这将在步骤2和步骤3之间推动远程存储库上的所有内容明白发生了什么。通常,您应该会看到已经添加的
file.txt
,这就是为什么不需要
git add

2020-02-02 19:35:18
花祭果凜


从git v2.23.0开始,出现了一种新的git还原方法,该方法假定了
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

2020-02-02 19:35:18
banana23


要转到文件的上一个提交版本,请获取提交号,例如eb917a1
然后如果您只需要返回到上一个提交版本,则返回到文件的上一个提交状态
git checkout eb917a1 YourFileName

2020-02-02 19:35:18
xiaoQ


Git将文件还原为特定提交

Git checkout Last_Stable_commit_Number--fileName
2.Git将文件还原为特定分支
git checkout branchName_Which_Has_stable_Commit fileName

2020-02-02 19:35:18
ShitDemon


git checkout ref=124 commithash-filepath
e.g.
>[0>code/pre>

2020-02-02 19:35:18
Howard


这里的许多答案都声称使用
git reset ... 
git checkout ... 
但这样做,您将在您要还原的提交之后释放对提交的
的所有修改。
如果您只想从单个文件的一次提交还原更改,正如
git revert
只对一个文件(或者说是提交文件的一个子集)一样,我建议同时使用
git diff
git apply
这样(使用
=要还原的提交的散列):
git diff ^  path/to/file.ext | git apply -R

基本上,它将首先生成与要还原的更改相对应的修补程序,然后反向应用修补程序以删除这些更改。
当然,如果还原的行已由
HEAD
之间(冲突)的任何提交修改,则它将不起作用。

2020-02-02 19:35:18
minge


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

注意:不要忘记在最后一个版本之前键入散列。最后一个散列将指向当前位置(HEAD),而不会更改任何内容。

2020-02-02 19:35:18
点点


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

会撤消上次提交的操作,而上次提交似乎是这样做的。
Ian

2020-02-02 19:35:18
清少


您可以在4个步骤中完成此操作:
使用您要特别还原的文件还原整个提交-它将在您的分支上创建一个新的提交
该提交的软重置-删除该提交并将更改移动到工作区
手动选择要还原的文件并将其提交
删除工作区中的所有其他文件
您需要什么输入您的终端:
git revert 

git reset HEAD~1

git add 
&
git commit -m 'reverting file'

git checkout .

祝您好运

2020-02-02 19:35:18
咻咯


如果在上一次提交中提交了错误的文件,请遵循以下说明:
开放源代码树,更改为此提交

更改行并找到您的提交,即发送为提交的错误文件

您可以在该提交中看到您的更改列表
选择它,然后单击。。。按钮右侧。。。单击“反转文件”
然后您可以在左下角的“文件状态”选项卡上看到它,然后单击“取消保存”:

打开您的visual studio代码并通过提交已删除的文件进行还原
毕竟,您可以在源树中看到上次提交的结果

2020-02-02 19:35:18
红烧油库里


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

这非常方便。如果我们想将任何文件带到commit顶部的任何先前commit id,我们可以很容易地做到。

2020-02-02 19:35:18
里区游客


git revert 

将还原给定的提交。听起来好像你认为
git revert
只会影响最近的提交。
如果你想还原特定文件中的更改,并且提交的更改比该文件的更改还多,那么这并不能解决你的问题。

2020-02-02 19:35:18
闷骚男


World is powered by solitude
备案号:湘ICP备19012068号