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

如何在特定的提交哈希(我通过#0#1确定)将修改后的文件恢复到其先前的版本?

2732795 次浏览
git checkout -- foo

这会将foo重置为HEAD。您还可以:

git checkout HEAD^ foo

一次修改,等等。

有趣的是,如果工作副本位于名为foo的目录中,git checkout foo将不起作用;然而,git checkout HEAD foogit checkout ./foo都会:

$ pwd/Users/aaron/Documents/work/foo$ git checkout fooD   fooAlready on "foo"$ git checkout ./foo$ git checkout HEAD foo

注意,git checkout ./foogit checkout HEAD ./foo完全不是同一件事;例子:

$ echo A > foo$ git add foo$ git commit -m 'A' fooCreated commit a1f085f: A1 files changed, 1 insertions(+), 0 deletions(-)create mode 100644 foo$ echo B >> foo$ git add foo$ echo C >> foo$ cat fooABC$ git checkout ./foo$ cat fooAB$ git checkout HEAD ./foo$ cat fooA

(第二个add在索引中暂存文件,但它确实没有获得)

Git checkout ./foo表示从索引恢复路径./foo;添加HEAD指示Git将索引中的路径恢复为其HEAD之前的修改。

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

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

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

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

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

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


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

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

我必须在这里插入EasyGit,这是一个包装器,可以让新手更容易接近git,而不会让经验丰富的用户感到困惑。它做的一件事是赋予#0更多含义。在这种情况下,你只需说:

eg revert foo/bar foo/baz

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

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

开始:

$ git log

它向您显示最近提交的列表及其SHA1哈希值。

接下来,键入:

$ git reset --hard SHA1_HASH

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

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

git diff <commit hash> <filename>

然后使用重置命令将特定文件恢复到该提交:

git reset <commit hash> <filename>

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

管理航点的一个好的工作流程是使用标签来干净地标记时间线中的点。我不太明白你的最后一句话,但你可能想要的是从前一个时间点发散一个分支。为此,使用方便的签出命令:

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

然后,当您准备合并这些更改时,您可以根据主线重新调整它:

git checkout <my branch>git rebase mastergit checkout mastergit merge <my branch>
git revert <hash>

将恢复给定的提交。听起来您认为git revert只影响最近的提交。

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

当你说“回滚”时,你必须小心。如果你曾经在提交$A中有一个文件版本,然后在两个单独的提交$B和$C中进行了两次更改(所以你看到的是文件的第三次迭代),如果你说“我想回滚到第一次”,你真的是认真的吗?

如果你想摆脱第二次和第三次迭代的变化,这很简单:

$ git checkout $A file

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

另一方面,你的意思是摆脱第二次迭代(即提交$B)带来的更改,同时保留提交$C对文件所做的事情,你会想要恢复$B

$ git revert $B

请注意,创建提交$B的人可能不是很有纪律,可能在同一提交中提交了完全不相关的更改,并且此恢复可能会触及文件以外的文件,您会看到违规的更改,因此您可能希望在这样做之后仔细检查结果。

以下是rebase的工作原理:

git checkout <my branch>git rebase mastergit checkout mastergit merge <my branch>

假设你有

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

前两个命令…提交git签出git rebase master

…查看要应用于master分支的更改分支。rebase命令从<my branch>获取提交(在master中找不到)并将其重新应用到master的头部。换句话说,<my branch>中第一次提交的父级不再是master历史记录中的先前提交,而是master的当前头部。这两个命令与:

git rebase master <my branch>

记住这个命令可能更容易,因为“base”和“修改”分支都是明确的。

.最终的历史结果是:

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

最后两个命令…

git checkout mastergit merge <my branch>

…执行快进合并以将所有<my branch>更改应用到master上。如果没有这一步,rebase提交不会添加到master。最终结果是:

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

master<my branch>都引用了B'。此外,从这一点开始,删除<my branch>引用是安全的。

git branch -d <my branch>

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

git checkout master~5 image.png

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

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

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

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

git checkout [commit-ref] [filename]

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

这对我有效:

git checkout <commit hash> file

然后提交更改:

git commit -a

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

注意:不要忘记在最后一个哈希之前输入哈希。最后一个哈希指向您的当前位置(HEAD)并且不会改变任何内容。

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

cd <working copy>git revert master

将撤消似乎要做的最后一次提交。

伊恩

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

git checkout HEAD file/to/restore

#删除文件路径git check out ref

e. g.

git checkout HEAD~5 -- foo.barorgit checkout 048ee28 -- foo.bar

如果您想将文件恢复到先前的提交(以及您要恢复的文件已提交),您可以使用

git checkout HEAD^1 path/to/file

git checkout HEAD~1 path/to/file

然后只是阶段和提交“新”版本。

了解到在合并的情况下提交可以有两个父级,您应该知道HEAD^1是第一个父级,HEAD~1是第二个父级。

如果树中只有一个父级,则两者都可以工作。

为了转到文件的上一个提交版本,获取提交编号,例如eb917a1然后

git checkout eb917a1 YourFileName

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

git reset HEAD YourFileNamegit checkout YourFileName

这将简单地带您到文件的最后提交状态

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

git prevision <N> <filename>

其中<N>是文件<filename>要回滚的文件的修订版数。
例如,要签出单个文件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并
  • 对指定文件的提交ID执行git checkout

基本上,在这种情况下手动执行的所有操作,
用一个漂亮、高效的git-alias封装-git-prevision

这里有很多建议,大多数都与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

这里的许多答案声称使用git reset ... <file>git checkout ... <file>,但这样做,您将在想要恢复的提交之后丢失对<file>提交的所有修改。

如果你想只在一个文件上恢复一次提交的更改,就像git revert只对一个文件(或者说提交文件的一个子集)所做的那样,我建议同时使用git diffgit apply<sha>=你想要恢复的提交的哈希):

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

基本上,它将首先生成与要恢复的更改对应的补丁,然后反向应用补丁以删除这些更改。

当然,如果恢复的行被<sha1>HEAD之间的任何提交(冲突)修改,它将不起作用。

这是我的方式。

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

b)git->Show History,找到我要恢复到的上一个提交。获取commit_id(即提交哈希)。

c)git checkout commit_id file_path

对我来说,没有一个答案似乎真的很清楚,因此我想添加我的答案,这似乎非常容易。

我有一个提交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":这将提交您的回归。

  1. git push:这将推送远程存储库上的所有内容

在第2步和第3步之间,你当然可以做git status来理解发生了什么。通常你应该看到file.txt已经添加了,这就是为什么不需要git add

目标文件的第一个重置头

git reset HEAD path_to_file

第二次检查该文件

git checkout -- path_to_file

如果您使用的是Git扩展,并且您只想恢复到文件的父提交,您可以选择包含要恢复的更改的提交,然后在详细信息窗格中选择“Diff”选项卡,右键单击要恢复的文件,然后“将文件重置为”……,然后“A”(父)

你可以通过4个步骤做到这一点:

  1. 使用您要特别恢复的文件恢复整个提交-它将在您的分支上创建一个新的提交
  2. 软重置提交-删除提交并将更改移动到工作区域
  3. 手工挑选要恢复并提交的文件
  4. 将所有其他文件放入您的工作区域

您需要在终端中输入什么

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert>&
  4. git checkout .

祝你好运

如果您在上次提交中提交了错误的文件,请按照说明进行操作:

  1. 开源树,改成这个提交

开源树

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

在此处输入图片描述

  1. 您可以在该提交中看到您的更改列表源代码树中的文件列表
  2. 选择它,然后单击…按钮右侧…单击反向文件
  3. 然后您可以在左下角的文件状态选项卡上看到它然后点击取消阶段:

文件状态选项卡

  1. 打开您的Visual Studio代码并通过提交已删除的文件来恢复
  2. 之后,您可以在源代码树中看到最后一次提交的结果

在此处输入图片描述

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

# git checkout <previous commit_id> <file_name># git commit --amend

这非常方便。如果我们想将任何文件带到提交顶部的任何先前提交ID,我们可以轻松做到。

  1. Git将文件恢复为特定提交
git checkout Last_Stable_commit_Number -- fileName

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

git checkout branchName_Which_Has_stable_Commit fileName

从git v2.23.0开始,有一个新的git恢复方法,它应该假设git checkout负责的部分内容(即使接受的答案也提到git checkout很混乱)。参见github博客的更改亮点。

此命令的默认行为是使用来自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
  • 运行以下执行软重置的命令,更改将到达您的本地。
git reset --soft HEAD^1
  • 查看您之前提交的文件的状态你的地方,然后做出改变。
 git status
  • 进行更改后提交并推送文件

  • 错误提交文件的前一次提交历史记录将不会被删除显示

在从原点拉取之前总是有修剪(可选步骤)

 git remote prune origin

对于文件“a.txt”、“b.txt”、“c.txt”:

  1. git revert -n <commit>(例如git revert -n HEAD恢复上次提交)。这将准备(但不是提交!)并阶段所有更改以撤消特定提交

  2. git reset。这将取消所有反向更改,以便您可以手动添加要更改的文件。

  3. git add a.txt b.txt c.txt。这会将您要撤消更改的文件添加到您的新提交中。

  4. git commit -m 'Undo <commit> for a.txt, b.txt, c.txt'.提交实际更改

  5. git reset --hard.删除任何你不想撤销的东西。

git log --oneline  // you see commits, find commit hash to which you want resetgit diff y0urhash src/main/.../../YourFile.java   // to see differencegit reset y0urhash src/main/.../../YourFile.java   // revert to y0urhash commitgit status                                        // check files to commitgit commit -m "your commit message"git push origin