使用 Git 将特定文件重置或恢复为特定修订版?
-
03-07-2019 - |
题
我对一个文件进行了一些更改,该文件已作为一组文件的一部分提交了几次,但现在想要将其更改重置/恢复到以前的版本。
我做了一个 git log
连同一个 git diff
找到我需要的修订,但只是不知道如何使文件恢复到过去的状态。
解决方案
假设您想要的提交哈希是c5f567
:
git checkout c5f567 -- file1/to/restore file2/to/restore
git checkout 手册页提供了更多信息。
如果您想在~1
之前恢复提交,请附加<=>(适用于任何数字):
git checkout c5f567~1 -- file1/to/restore file2/to/restore
作为旁注,我一直对这个命令感到不舒服,因为它用于普通事物(在分支之间切换)和不寻常的破坏性事物(丢弃工作目录中的变化)。
其他提示
您可以使用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>
你可以使用任何git提交的引用,包括SHA-1,如果这是最方便的。关键是命令看起来像这样:
git checkout [commit-ref] -- [filename]
git checkout -- foo
这会将foo
重置为HEAD。你也可以:
git checkout HEAD^ foo
返回一个修订版等
要恢复到最常需要的最后提交的版本,您可以使用这个更简单的命令。
git checkout HEAD file/to/restore
我刚才遇到了同样的问题,我发现这个答案最容易理解(commit-ref
是要返回的日志中更改的SHA值):
git checkout [commit-ref] [filename]
这会将旧版本放在您的工作目录中,如果您愿意,可以从那里提交。
如果您知道需要返回的提交数量,可以使用:
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
将状态恢复到给定的提交并永久删除记录中的所有新提交。
这对我有用:
git checkout <commit hash> file
然后提交更改:
git commit -a
当你说<!> quot; rollback <!>“时,你必须要小心。如果您曾经在提交$ A中有一个版本的文件,然后在两个单独的提交$ B和$ C中进行了两次更改(所以你看到的是文件的第三次迭代),如果你说< !>“我想回滚到第一个<!>”,你真的是这个意思吗?
如果你想要摆脱第二次和第三次迭代的变化,那很简单:
$ git checkout $A file
然后提交结果。该命令询问<!>“;我想从提交$ A <!>”记录的状态中检出文件。
另一方面,你的意思是摆脱引入的第二次迭代(即提交$ B)的变化,同时保持$ C对文件的提交,你想要还原$ B
$ git revert $B
请注意,创建提交$ B的人可能不是非常自律,并且可能在同一次提交中提交了完全无关的更改,并且此恢复可能会触及 file 以外的文件,您会看到有违规的更改,因此你可能想在这样做后仔细检查结果。
有趣的是,如果工作副本位于名为git checkout foo
的目录中,则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
以下是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
分支的更改分支。 <my branch>
命令接受来自B'
的提交(在<=>中找不到),并将它们重新应用到<=>的头部。换句话说,<=>中第一次提交的父级不再是<=>历史记录中的先前提交,而是<=>的当前头部。这两个命令与:
git rebase master <my branch>
可能更容易记住此命令,因为<!> quot; base <!> quot;和<!> quot; modify <!> quot;分支是明确的。
。最终的历史结果是:
---o----o----o----o master \----A'----B' <my branch>
最后两个命令......
git checkout master
git merge <my branch>
...执行快进合并以将所有<=>更改应用到<=>。如果没有此步骤,则不会将rebase提交添加到<=>。最终结果是:
---o----o----o----o----A'----B' master, <my branch>
<=>和<=>都引用<=>。此外,从这一点开始,删除<=>引用是安全的。
git branch -d <my branch>
首先重置目标文件头
git reset HEAD path_to_file
第二次检出该文件
git checkout -- path_to_file
git-aliases、awk 和 shell-functions 来救援!
git prevision <N> <filename>
在哪里 <N>
是要回滚的文件修订数量 <filename>
.
例如,要查看单个文件的前一个版本 x/y/z.c
, , 跑步
git prevision -1 x/y/z.c
git 预置如何工作?
将以下内容添加到您的 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-alias 中 - git 预测
我必须在这里插入 EasyGit ,这是一个让git更平易近人的包装器对新手没有混淆经验丰富的用户。其中一件事就是给予git revert
更多意义。在这种情况下,您只需说:
eg revert foo/bar foo/baz
如果您要将文件还原为先前的提交(以及要还原已提交的文件),可以使用
git checkout HEAD^1 path/to/file
或
git checkout HEAD~1 path/to/file
然后暂存并提交<!> quot; new <!>;版本
知道在合并的情况下提交可以有两个父项,你应该知道HEAD ^ 1是第一个父级,HEAD~1是第二个父级。
如果树中只有一个父项,则可以使用。
但请注意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将索引中的路径还原为它
<=>之前进行修订。
这里有很多建议,大多数都是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
对我来说,没有一个回复看起来很清楚,因此我想补充一下这看起来非常简单。
我有一个提交abc1
,之后我对文件file.txt
做了几次(或一次修改)。
现在说我弄乱了文件git checkout file.txt
中的某些内容,我想回到之前的提交git checkout abc1 file.txt
。
1。git commit -m "Restored file.txt to version abc1"
:如果你不需要,这将删除本地更改
2. git push
:这会将您的文件带到想要的版本
3. git status
:这将提交你的回归。
-
git add
:这将推送远程存储库中的所有内容
醇>
在第2步和第3步之间,您当然可以<=>了解正在发生的事情。通常你应该看到<=>已经添加了,这就是为什么不需要<=>。
要转到文件的先前提交版本,请获取提交编号,例如eb917a1 那么
git checkout eb917a1 YourFileName
如果您只需要返回上一个提交的版本
git reset HEAD YourFileName
git checkout YourFileName
这将简单地带您到文件的最后一个提交状态
git checkout ref | commitHash - filePath
e.g。
git checkout HEAD~5 -- foo.bar
or
git checkout 048ee28 -- foo.bar
使用git log
获取特定版本的哈希密钥,然后使用git checkout <hashkey>
注意:不要忘记在最后一个之前键入哈希。最后一个哈希点指向您当前的位置(HEAD)并且不做任何更改。
此处的许多答案都声称使用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>
和HEAD
(冲突)之间的任何提交修改了恢复的行,它将不起作用。
显然有人需要在git上写一本可理解的书,或者需要在文档中更好地解释git。面对同样的问题,我猜到了
cd <working copy>
git revert master
会撤消似乎做的最后一次提交。
伊恩
这是一个非常简单的步骤。签出文件到我们想要的提交ID,这里有一个提交ID,然后只是git commit修改,我们就完成了。
# git checkout <previous commit_id> <file_name>
# git commit --amend
这非常方便。如果我们想将任何文件带到提交顶部的任何先前提交ID,我们可以很容易地做到。
- Git将文件还原为特定提交 醇>
git checkout Last_Stable_commit_Number - fileName
2.Git将文件还原到特定分支
git checkout branchName_Which_Has_stable_Commit fileName
git revert <hash>
将还原给定的提交。听起来你认为git revert
只影响最近的提交。
如果您想恢复特定文件中的更改并且提交的更改次数超过该文件,则无法解决您的问题。
您可以通过 4 个步骤完成:
- 使用您想要专门恢复的文件恢复整个提交 - 它将在您的分支上创建一个新的提交
- 软重置该提交 - 删除提交并将更改移至工作区域
- 精心挑选要恢复的文件并提交它们
- 删除工作区中的所有其他文件
您需要在终端中输入什么:
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&&git commit -m 'reverting file'
git checkout .
祝你好运
这是我的方式。
a)在Android Studio中,打开文件。
b)git - <!> gt;显示历史记录,找到我想要恢复的先前提交。获取commit_id(即提交哈希)。
c)git checkout commit_id file_path