我已经对作为一组文件的一部分提交了几次的文件进行了一些更改,但现在想要将其上的更改重置/还原到以前的版本.
我已经做了git log
一个git diff
找到我需要的修订版,但是根本不知道如何将文件恢复到以前的状态.
假设您想要的提交哈希是c5f567
:
git checkout c5f567 -- file1/to/restore file2/to/restore
在git的结帐手册页提供了更多的信息.
如果你想恢复之前的提交c5f567
,追加~1
(使用任何数字):
git checkout c5f567~1 -- file1/to/restore file2/to/restore
作为旁注,我总是对这个命令感到不舒服,因为它用于普通事物(在分支之间切换)和不寻常的破坏性事物(丢弃工作目录中的变化).
您可以使用diff命令快速查看对文件所做的更改:
git diff
然后,要将特定文件还原到该提交,请使用reset命令:
git reset
--hard
如果您进行了本地修改,则可能需要使用该选项.
管理航点的良好工作流程是使用标签在时间轴中清晰地标记点.我不太明白你的最后一句话,但你可能想要的是从前一个时间点分支出一个分支.为此,请使用方便的checkout命令:
git checkoutgit checkout -b
然后,当您准备合并这些更改时,可以针对主线对其进行重新绑定:
git checkoutgit rebase master git checkout master git merge
你可以使用任何对git commit的引用,包括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 checkoutfile
然后提交更改:
git commit -a
当你说"回滚"时你必须要小心.如果您曾经在提交$ A中有一个版本的文件,然后在两个单独的提交中进行了两次更改$ B和$ C(所以你看到的是文件的第三次迭代),如果你说"我想回到第一个",你真的是这个意思吗?
如果你想要摆脱第二次和第三次迭代的变化,那很简单:
$ git checkout $A file
然后你提交结果.该命令询问"我想从提交$ A记录的状态检出文件".
另一方面,你的意思是摆脱引入的第二次迭代(即提交$ B)的变化,同时保持$ C对文件做了什么,你想要还原$ B
$ git revert $B
请注意,创建提交$ B的人可能不是非常自律,并且可能在同一次提交中提交了完全无关的更改,并且此恢复可能会触及您看到有违规更改的文件以外的文件,因此您可能需要在执行后仔细检查结果所以.
有趣的是,如果工作副本位于名为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
这是如何rebase
工作:
git checkoutgit rebase master git checkout master git merge
假设你有
---o----o----o----o master \---A----B
前两个命令...提交git checkout git rebase master
...查看要应用于分支的更改master
分支.该rebase
命令接受来自
(未找到master
)的提交并将它们重新应用到头部master
.换句话说,第一次提交的父级
不再是master
历史记录中的先前提交,而是当前的提交master
.这两个命令与:
git rebase master
记住此命令可能更容易,因为"基本"和"修改"分支都是显式的.
.最终的历史结果是:
---o----o----o----o master \----A'----B'
最后两个命令......
git checkout master git merge
...执行快进合并以应用所有
更改master
.如果没有此步骤,则不会添加rebase提交master
.最终结果是:
---o----o----o----o----A'----B' master,
master
并且
都参考B'
.此外,从这一点来看,删除
引用是安全的.
git branch -d
首先重置目标文件头
git reset HEAD path_to_file
第二个结帐那个文件
git checkout -- path_to_file
救援的git-aliases,awk和shell-functions!
git prevision
其中
是要回滚文件的文件的修订数
.
例如,要x/y/z.c
运行,请检查单个文件的前一个修订版本
git prevision -1 x/y/z.c
将以下内容添加到您的 gitconfig
[alias] prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"
命令基本上
git log
在指定的文件上 执行a在文件的历史记录中选择适当的commit-id
执行
git checkout
指定文件的commit-id.
从本质上讲,所有人都会在这种情况下手动完成,
包含在一个美丽,高效的git-alias中 - git-prevision
我必须在这里插入EasyGit,这是一个包装器,使新手更容易接近git而不会混淆经验丰富的用户.它所做的一件事就是赋予git revert
它更多的意义.在这种情况下,您只需说:
eg revert foo/bar foo/baz
如果您要将文件还原为先前的提交(以及要还原已提交的文件),则可以使用
git checkout HEAD^1 path/to/file
要么
git checkout HEAD~1 path/to/file
然后只是暂存并提交"新"版本.
知道在合并的情况下提交可以有两个父项,你应该知道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 HEAD
在执行此操作之前将索引中的路径还原为其
修订版.
这里有很多建议,大多数都是这样的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
.
现在说我弄乱了文件中的某些东西file.txt
,我想回到之前的提交abc1
.
1 git checkout file.txt
.:如果您不需要,这将删除本地更改
2 . git checkout abc1 file.txt
:这会将您的文件带到您想要的版本
3 . git commit -m "Restored file.txt to version abc1"
:这将使你的回归.
git push
:这将推送远程存储库上的所有内容
当然,在第2步和第3步之间,您可以git status
了解正在发生的事情.通常你应该看到file.txt
已经添加的,这就是为什么不需要a git add
.
要转到文件的先前提交版本,请获取提交编号,然后输入eb917a1
git checkout eb917a1 YourFileName
如果您只需要返回上一个提交的版本
git reset HEAD YourFileName git checkout YourFileName
这将简单地将您带到文件的最后一个提交状态
git checkout ref | commitHash - filePath
例如
git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar
这里的许多答案声称使用git reset ...
或者git checkout ...
通过这样做,你将在
你想要恢复的提交之后松掉所有提交的修改.
如果你只想恢复单个文件上的一次提交的更改,就像git revert
只做一个文件(或者说是提交文件的一个子集)一样,我建议使用两者git diff
并且git apply
像那样(使用
=的哈希值)提交你想要还原):
git diff^ path/to/file.ext | git apply -R
基本上,它将首先生成与您要还原的更改相对应的修补程序,然后反向应用修补程序以删除这些更改.
当然,如果通过
和HEAD
(冲突)之间的任何提交修改了恢复的行,它将不起作用.
git将文件还原为特定提交
git checkout Last_Stable_commit_Number-文件名
2. Git将文件还原到特定分支
git checkout branchName_Which_Has_stable_Commit fileName
使用git log
以获得特定版本的哈希键,然后使用git checkout
注意:不要忘记在最后一个之前键入哈希.最后一个哈希点指向您当前的位置(HEAD)并且不做任何更改.
显然有人需要在git上写一本可理解的书,或者需要在文档中更好地解释git.面对同样的问题,我猜对了
cdgit revert master
会撤消似乎做的最后一次提交.
伊恩
从git v2.23.0开始,有一个新的git restore方法,该方法应该假定是其中的一部分git checkout
(即使已接受的答案git checkout
也很令人困惑)。在github博客上查看更改的要点。
此命令的默认行为是使用来自source
参数的内容(在您的情况下为提交哈希)恢复工作树的状态。
因此,根据Greg Hewgill的答案(假设commit hash为c5f567
),该命令将如下所示:
git restore --source=c5f567 file1/to/restore file2/to/restore
或者,如果您想还原到c5f567之前的一次提交的内容,请执行以下操作:
git restore --source=c5f567~1 file1/to/restore file2/to/restore
您可以通过4个步骤进行操作:
使用您要专门还原的文件还原整个提交-它将在您的分支上创建一个新的提交
提交的软复位-删除提交并将更改移动到工作区
手动选择文件以还原并提交
将所有其他文件放到工作区中
您需要在终端中输入什么:
git revert
git reset HEAD~1
git add
&& git commit -m 'reverting file'
git checkout .
祝好运
如果您在上次提交中提交了错误的文件,请遵循以下说明:
开源树,更改为此提交
更改行并找到错误文件作为提交发送的提交
您可以在该提交中看到更改列表
选择它,然后单击右侧的...按钮...单击反向文件
然后你可以在左下角的文件状态选项卡上看到它,然后点击unstage:
打开您的visual studio代码并通过提交已删除的文件来恢复
在它们之后,您可以在源树中的最后一次提交中看到结果
这是非常简单的步骤。签出文件到我们想要的提交ID,这里是一个提交ID,然后是git commit修改,我们就完成了。
# git checkout# git commit --amend
这非常方便。如果我们想将任何文件带到提交顶部的任何先前的提交ID,我们可以轻松做到。