it-swarm.cn

如何将混帐存储库还原为以前的提交

如何从当前状态恢复为在某个提交时创建的快照?

如果我做git log,那么我得到以下输出:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

如何从11月3日恢复提交,即提交0d1d7fc

6795
Crazy Serb

这很大程度上取决于“恢复”的含义。

暂时切换到其他提交

如果你想暂时回到它,傻瓜,然后回到你所在的位置,你所要做的就是检查所需的提交:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

或者,如果你想在那里做提交,那么在你做的时候继续做一个新的分支:

git checkout -b old-state 0d1d7fc32

要回到原来的位置,只需查看您再次访问的分支机构。 (如果你做了更改,就像转换分支一样,你必须在适当的时候处理它们。你可以重置它们扔掉它们;你可以藏匿,结账,存放pop以带走它们;你可以提交如果你想在那里有一个分支,他们到那里的一个分支。)

硬删除未发布的提交

另一方面,如果你想真正摆脱自那时以来所做的一切,那么有两种可能性。一,如果您尚未发布任何这些提交,只需重置:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

如果你搞砸了,你已经抛弃了你当地的变化,但你至少可以通过再次重置来回到原来的位置。

使用新提交撤消已发布的提交

另一方面,如果您已发布作品,则可能不希望重置分支,因为这有效地重写了历史记录。在这种情况下,您确实可以还原提交。使用Git,revert有一个非常具体的含义:使用反向补丁创建一个提交以取消它。这样您就不会重写任何历史记录。

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

git-revert联机帮助页 实际上在其描述中涵盖了很多内容。另一个有用的链接是 这个git-scm.com部分讨论了git-revert

如果您决定不想还原,则可以还原还原(如此处所述)或重置为还原之前(请参阅上一节)。

在这种情况下,您可能会发现此答案很有用:
如何将HEAD移回以前的位置? (独立头)

8690
Cascabel

将工作副本还原为最近的提交

要恢复到先前的提交,请忽略任何更改:

git reset --hard HEAD

其中HEAD是当前分支中的最后一次提交

将工作副本还原为较旧的提交

要恢复到比最近提交更早的提交:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

Credits转到类似的Stack Overflow问题,在Git中通过SHA哈希恢复提交?

1451
boulder_ruby

这里有很多复杂而危险的答案,但实际上很简单:

git revert --no-commit 0766c053..HEAD
git commit

这将从HEAD恢复到提交哈希的所有内容,这意味着它将在工作树中重新创建提交状态 就好像 每次提交以来都已经退回。然后,您可以提交当前树,它将创建一个全新的提交,基本上等同于您“恢复”的提交。

--no-commit标志允许git立即恢复所有提交 - 否则,系统会提示您为该范围内的每个提交发送一条消息,并使用不必要的新提交乱丢您的历史记录。)

这是回滚到以前状态的安全且简单的方法。没有历史被破坏,因此它可以用于已经公开的提交。

1433
Yarin

我和其他人的最佳选择是Git重置选项:

git reset --hard <commidId> && git clean -f

这对我来说是最好的选择!它简单,快速,有效!


注意: 如评论中所述,如果您与拥有旧提交副本的其他人共享您的分支,则不会这样做

同样来自评论,如果你想要一个较少的'ballzy'方法,你可以使用

git clean -i

182
Pogrindis

在回答之前,让我们添加一些背景,解释这个HEAD是什么。

First of all what is HEAD?

HEAD只是对当前分支上当前提交(最新)的引用。在任何给定时间只能有一个HEAD(不包括git worktree)。

HEAD的内容存储在.git/HEAD中,它包含当前提交的40字节SHA-1。


detached HEAD

如果您没有进行最新提交 - 意味着HEAD指向历史记录中的先前提交,则称为detached HEAD

Enter image description here

在命令行上它看起来像这样 - SHA-1而不是分支名称,因为HEAD没有指向当前分支的尖端:

Enter image description here


关于如何从分离的HEAD中恢复的几个选项:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

这将检查指向所需提交的新分支。此命令将签出到给定的提交。

此时,您可以创建一个分支,并从这一点开始工作:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

您也可以始终使用refloggit reflog将显示更新HEAD的任何更改,并且检出所需的reflog条目会将HEAD设置回此提交。

每次修改HEAD时,reflog中都会有一个新条目

git reflog
git checkout [email protected]{...}

这将使您回到所需的提交

Enter image description here


git reset HEAD --hard <commit_id>

“移动”你的头回到所需的提交。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • 注意:( 自Git 2.7 )你也可以使用git rebase --no-autostash

此架构说明了哪个命令执行的操作。正如您所看到的那样reset && checkout修改HEAD

Enter image description here

143
CodeWizard

如果要“取消提交”,擦除最后一次提交消息,并将修改后的文件放回到分段中,则可以使用以下命令:

git reset --soft HEAD~1
  • --soft表示未提交的文件应保留为与--hard相对的工作文件,这将丢弃它们。
  • HEAD~1是最后一次提交。如果要回滚3次提交,可以使用HEAD~3。如果要回滚到特定的修订版号,也可以使用SHA哈希进行回滚。

在您提交错误的内容并且想要撤消上次提交的情况下,这是一个非常有用的命令。

来源: http://nakkaya.com/2009/09/24/git-delete-last-commit/

124
Stephen Ostermiller

我已经尝试了很多方法来恢复Git中的本地更改,如果你只想恢复到最新的提交状态,这似乎是最好的。

git add . && git checkout master -f

简短的介绍:

  • 它不会像git revert那样创建任何提交。
  • 它不会像git checkout <commithashcode>那样分离HEAD。
  • 它将覆盖所有本地更改并删除自分支中最后一次提交以来所有添加的文件。
  • 它仅适用于分支名称,因此您只能以这种方式恢复分支中的最新提交。

我找到了一种更方便,更简单的方法来实现上述结果:

git add . && git reset --hard HEAD

其中HEAD指向当前分支的最新提交。

它与boulder_Ruby建议的代码相同,但我在git add .之前添加了git reset --hard HEAD来擦除自上次提交以来创建的所有新文件,因为这是大多数人在恢复到最新提交时所期望的。

105
Roman Minenok

您可以通过以下两个命令执行此操作:

git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f

它将删除您之前的Git提交。

如果您想保留更改,您还可以使用:

git reset --soft [previous Commit SHA id here]

然后它将保存您的更改。

94
kiran boghra

好的, 回到git中的上一次提交很容易......

恢复 不保留 更改:

git reset --hard <commit>

恢复 保持 更改:

git reset --soft <commit>

解释: 使用git reset,你可以重置为一个特定的状态,如上所述,它通常使用提交哈希。

但正如您所看到的区别在于使用两个标志--soft--hard,默认git reset使用--soft标志,但这是一个很好的做法总是使用标志,我解释每个标志:


- 柔软的

所解释的默认标志,不需要提供它,不会更改工作树,但添加准备提交的所有更改文件,因此您将返回到提交状态,更改为文件将变为未分级。


- 硬

小心这个标志,它重置工作树和跟踪文件的所有更改,一切都将消失!


我还创建了下面的图像,可能发生在使用git的现实生活中:

git reset to a commit

63
Alireza

除了这个确切的组合,这里没有任何东西对我有用:

git reset --hard <commit_hash>
git Push Origin <branch_name> --force

这里的关键是强制Push,没有额外的提交/提交消息等。

59
serdarsenay

假设您在名为~/commits-to-revert.txt的文本文件中有以下提交(我使用了git log --pretty=oneline来获取它们)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

创建一个 Bash Shell脚本来还原它们中的每一个:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

这会将所有内容还原回以前的状态,包括文件和目录创建以及删除,将其提交到您的分支并保留历史记录,但是您将其还原为相同的文件结构。为什么Git没有git revert --to <hash>超出我的范围。

57
Lance Caraccioli

Jefromi解决方案的额外替代品

Jefromi的解决方案 绝对是最好的解决方案,你绝对应该使用它们。但是,为了完整起见,我还想展示这些其他替代解决方案,这些解决方案也可用于恢复提交(在某种意义上,你 创建一个新的提交,撤消先前提交中的更改 ,像git revert那样做。

要清楚,这些替代品不是恢复提交的最好方法Jefromi的解决方案是 ,但我只想指出你也可以使用这些其他方法实现与git revert相同的功能。

备选方案1:硬重置和软重置

这是Charles Bailey解决方案的一个稍微修改过的版本 在Git中通过SHA哈希恢复提交?

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft [email protected]{1}

# Commit the changes
git commit -m "Revert to <commit>"

这基本上是通过使用软重置将使先前提交的状态在索引/暂存区域中暂存的事实来实现的,然后您可以提交该区域。

备选方案2:删除当前树并替换为新树

这个解决方案来自svick的解决方案 Checkout旧提交并使其成为新提交

git rm -r .
git checkout <commit> .
git commit

与替代#1类似,这将再现当前工作副本中<commit>的状态。首先必须执行git rm,因为git checkout不会删除自<commit>以来添加的文件。

56
user456814

假设你正在谈论master和相应的分支(也就是说,这可能是你所关注的任何工作分支):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git Push -f Origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

我在博文中找到了答案(现在不再存在)

请注意,这是重置并强制更改为远程,因此如果团队中的其他人已经拉过git,则会导致问题。你正在摧毁改变历史,这是人们首先使用git的一个重要原因。

最好使用还原(参见其他答案)而不是重置。如果你是一个单人团队,那么它可能并不重要。

55
markreyes

这是一个 更简单 返回到先前提交的方式(并使其处于非公开状态,无论你喜欢什么,都可以使用它):

git reset HEAD~1

所以,不需要提交ID等等:)

51
Paul Walczewski

完成所有更改后,当您按下所有这些命令时,可能必须使用:

git Push -f ...

而且不仅是git Push

34
sivi

有一个命令(不是核心Git的一部分,但它在 git-extras package中)专门用于恢复和暂存旧提交:

git back

根据 手册页 ,它也可以这样使用:

# Remove the latest three commits
git back 3
33
Shadow Man

您可以自己完成所有这些初始步骤并推回到git repo。

  1. 使用git pull --all命令从Bitbucket中提取最新版本的存储库。

  2. 从终端运行带-n 4的git log命令。 -n之后的数字确定从本地历史记录中最近一次提交开始的日志中的提交数。

    $ git log -n 4

  3. 使用git reset --hard HEAD~N重置存储库历史记录的头部,其中N是您想要返回的提交数。在以下示例中,head将被设置为一次提交,以及存储库历史记录中的最后一次提交:

  4. 使用git Push --force将更改推送到git repo以强制推送更改。

如果您希望git存储库到先前的提交

git pull --all
git reset --hard HEAD~1
git Push --force
29
Nanhe Kumar

恢复到 最近 commit并忽略所有本地更改:

git reset --hard HEAD
27

选择所需的提交,然后进行检查

git show HEAD
git show HEAD~1
git show HEAD~2 

直到你得到所需的提交。要使HEAD指向那个,请执行

git reset --hard HEAD~1

git reset --hard HEAD~2或其他什么。

26
tonythomas01

这是直接重置为最近提交的另一种方法

git stash
git stash clear

它直接清除自上次提交以来您所做的所有更改。

PS:它有一点问题;它还会删除您最近存储的所有存储更改。在大多数情况下,我猜这应该不重要。

20
Point Networks

要将上次提交的更改保留为HEAD并移至上一次提交,请执行以下操作:

git reset <SHA>

如果从上一次提交HEAD不需要更改并且只丢弃所有更改,请执行以下操作:

git reset --hard <SHA>
20
Vishnu Atrai

为了完全清除编码器目录中的一些意外更改,我们使用了:

git add -A .
git reset --hard HEAD

只是git reset --hard HEAD将摆脱修改,但它不会摆脱“新”文件。在他们的情况下,他们意外地随机拖动了一个重要的文件夹,所有这些文件被Git视为新文件,所以reset --hard没有修复它。通过预先运行git add -A .,它使用git显式跟踪它们,以便通过重置来消除它们。

20
Chris Moschini

我相信有些人可能会想要知道如何回滚他们在他们的主人身上做出的改变 - 即抛弃一切并返回Origin/master,在这种情况下,执行此操作:

git reset --hard Origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-Origin-master

19
nevster

Revert是回滚提交的命令。

git revert <commit1> <commit2> 

样本:

git revert 2h3h23233

它能够从HEAD获取范围,如下所示。这里1表示“还原最后一次提交”。

git revert HEAD~1..HEAD

然后做git Push

16
Sireesh Yarlagadda

恢复最近的提交:

git reset --hard HEAD

HEAD只是对当前分支上当前提交(最新)的引用。在任何给定时间只能有一个HEAD

恢复旧版提交:恢复旧版本的最快方法是使用reset命令:

# Resets index to former commit
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

# Updates working copy to reflect the new commit
git reset --hard

这会将HEAD分支回滚到指定的版本。此版本之后的所有提交都被有效撤消;你的项目与那个时间点完全一样。

Reset命令附带了几个选项,其中一个更有趣的是--soft标志。如果您使用它而不是--hard,Git将保留那些“撤消”提交中的所有更改作为本地修改。

恢复 新本地分支 中的修订

如上所述,在HEAD分支上使用reset命令是一个非常激烈的操作:它将删除在指定修订之后的任何提交(在此分支上)。如果你确定这是你想要的,一切都很好。

但是,如果您希望保持当前的HEAD分支不受影响,还有更安全方式。由于“分支”在Git中非常便宜和容易,我们可以轻松地创建一个从旧版本开始的新分支:

git checkout -b old-project-state 0ad5a7a6

通常,checkout命令用于仅切换分支。但是,提供-b参数,您还可以让它创建一个新分支(在此示例中名为 old-project-state )。如果您不希望它从当前的HEAD版本开始,您还需要提供一个提交哈希 - 我们要恢复的旧项目修订版。

您现在有一个名为 old-project-state 的新分支,它反映了项目的旧版本 - 无需触及甚至删除任何其他提交或分支。

16
Lyes CHIOUKH

如果情况是 紧急一个 ,你只想做一个提问者在 quick和dirty way中提出的问题,假设你的项目在“我的项目”目录下:

  1. 复制整个目录并将其称为其他内容,例如“我的项目 - 复制”

  2. 做:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

然后,您的系统上有两个版本...您可以检查或复制或修改先前提交中感兴趣的文件或其他任何内容。你可以完全放弃“我的项目 - 复制”下的文件,如果你已经确定新的工作无处可去......

很明显,如果你想继续执行项目状态而不实际丢弃工作,因为这个检索到的提交是重新命名你的目录:删除包含检索到的提交的项目(或给它一个临时名称)并重命名你的“我的项目 - 将“目录复制回”我的项目“。然后可能很快就会做另一次提交。

Git是一个出色的创作,但你不能只是“随时拿起它”:也试图解释它的人 经常 假设其他VCS [版本控制系统]的先验知识并且深入研究太快太太深了,并犯下其他罪行,比如使用可互换的术语“退房” - 有时似乎几乎可以让初学者迷惑。

为了节省很多压力,你必须要读一本关于Git的书 - 我建议 “用Git进行版本控制” 。如果你说“必须”时你可以信任我(或者更确切地说是我的伤疤),那么你可能会这样做NOW。 Git的大部分复杂性来自分支然后重新合并。但是从你的问题来看, 没有理由为什么人们应该用科学来炫耀你

特别是如果,例如,这是一个绝望的情况,你是Git的新手!

PS:另一个想法:将(现在)将Git存储库(“repo”)保存在除工作文件之外的目录中实际上非常简单。这意味着您不必使用上述快速和脏的解决方案来复制整个Git存储库。请参阅Fryer的回答,使用--separate-git-dir here 警告 ,但是:如果你有一个你没有复制的“单独目录”存储库,并且你进行了硬复位,那么重置提交之后的所有版本将永远丢失,除非你有,你绝对应该,经常备份你的存储库,最好是在其他地方备份到云端(例如 Google Drive )。

13
mike rodent

尝试重置为所需的提交 -

git reset <COMMIT_ID>

(检查COMMIT_ID使用git log

这会将所有已更改的文件重置为未添加状态。

现在你可以checkout所有未添加的文件了

git checkout .

检查git log以验证您的更改。

_ update _

如果您的仓库中有 一个且只有 提交,请尝试

git update-ref -d HEAD

13
optimistanoop

小心! 如果用户错误地提交了错误的提交,则此命令可能导致丢失提交历史记录。总是有你额外的git备份,以防万一你犯错误,而不是你更安全。 :)

我有类似的问题,并希望恢复到早期的提交。在我的情况下,我没有intetessered保持较新的提交,因此我使用Hard

这就是我做的方式:

git reset --hard CommitId && git clean -f

这将在本地存储库上恢复,这里使用git Push -f后将更新远程存储库。

git Push -f
11
maytham-ɯɐɥʇʎɐɯ

当你的提交被远程推送时,你需要删除它们。让我假设您的分支正在开发并且它被推到Origin。

您首先需要从Origin中删除develop:

git Push Origin :develop (note the colon)

然后你需要开发到你想要的状态,让我假设提交哈希是EFGHIJK:

git reset --hard EFGHIJK

最后,Push再次开发:

git Push Origin develop
11
George Ninan

在GitKraken你可以这样做:

  1. 右键单击要重置的提交,选择:重置为此提交/硬

enter image description here

  1. 再次右键单击提交,选择:当前分支名称/推送

enter image description here

  1. 点击强制推动

enter image description here

Obs。 :您需要小心,因为硬重置后的所有提交历史都会丢失,并且此操作是不可逆转的。你需要确定你在做什么。

10
Ângelo Polotto

如果你想纠正上次提交中的一些错误,一个好的替代方法是使用 git commit --amend command。如果任何引用都没有指向最后一次提交,那么这将起到作用,因为它创建一个与最后一次提交具有相同父级的提交。如果没有对最后一次提交的引用,它将被简单地丢弃,并且此提交将是最后一次提交。这是在不恢复提交的情况下纠正提交的好方法。但它有其自身的局限性。

10
Upul Doluweera

首先,获取在某个日期标识提交的字符串,执行:

git rev-list -n 1 --before="2009-07-27 13:37" Origin/master

它打印提交标识符,获取字符串(例如XXXX)并执行:

git checkout XXXX
9
Luca C.

用于回滚(或恢复):

  1. git revert --no-commit“commit-code-to-remove”HEAD(例如git revert --no-commit d57a39d HEAD)
  2. git commit
  3. git推

尝试以上两个步骤,如果你发现这是你想要的那么git Push。

如果你发现错误的话:

git revert --abort

9
Jagraj Singh

使用 SourceTree 可以更轻松地完成它。只需右键单击您正在寻找的提交,然后从菜单中选择“Checkout”。

enter image description here

8
Marcin Szymczak

又一个最简单的解决方案;你必须改变分支才能做到这一点,但之后你可以运行:

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
8
Aif

由于某种原因,我无法手动恢复我,所以这就是我最终如何做到这一点。

  1. 检查出我想要的分支,复制它。
  2. 检查出最新的分支机构。
  3. 将我想要的分支内容复制到最新分支的目录中,覆盖更改并提交。
7
Demodave
git reflog

选择git reflog的HEAD的数量,你想要恢复和执行的操作(对于这个例子,我选择12):

git reset [email protected]{12} --hard
7
Sérgio

将分支恢复到任何特定提交的最简单方法,您无法更改我找到的历史记录:

  1. 签出您希望还原的提交或分支。
  2. 编辑.git/HEAD并将ref更改为要还原到的分支。

如:

echo 'ref: refs/heads/example' > .git/HEAD

如果你然后执行git status,你应该看到你所在的分支和你想要恢复的分支之间的所有变化。

如果一切都很好,你可以承诺。你也可以使用git diff revert..example来确保它是一样的。

6
jgmjgm

如果您想暂时还原更改,因为

  • 有人提交了代码,它破坏了构建或破坏了您正在使用的功能

您可以使用git log搜索上次工作提交然后运行

git rebase --onto <commitId>

当远程分支再次工作时,您可以

git pull --rebase

对于临时更改,此方法优于git checkout,因为您未处于分离状态。

5
joseph

重置分阶段变更和提交

git reset命令允许您更改HEAD-工作树指向存储库的最新提交。它修改了暂存区域或暂存区域和工作树。 Git能够完全按照您的意愿制作提交,这意味着您有时需要撤消对使用git add进行的更改的更改。你可以通过调用git reset HEAD <file to change>来做到这一点。您有两种方法可以完全摆脱变化。 git checkout HEAD <file(s) or path(s)>是一种快速撤消对临时区域和工作树的更改的方法。但是,请注意此命令,因为它会删除对工作树的所有更改。 Git不知道这些变化,因为它们从未被提交过。运行此命令后,无法恢复这些更改。您可以使用的另一个命令是git reset --hard。它对您的工作树同样具有破坏性 - 任何未提交的更改或分阶段更改在运行后都会丢失。运行git reset -hard HEAD与git checkout HEAD的作用相同。它只是不需要文件或路径来工作。您可以使用--soft与git reset.It将存储库重置为您指定的提交并暂存所有这些更改。您已经进行的任何更改都不会受到影响,工作树中的更改也不会受到影响。最后,您可以使用--mixed重置工作树而不进行任何更改。这也会取消暂存的任何更改。

还原提交

有时候我们会犯错误。不应该被共享的提交被推送到公共存储库,提交有一个无法修复并且需要撤消的错误,或者您可能不再需要该代码。这些情况都是调用git revertgit revert命令正是你所期望的。它通过对历史应用反向提交来恢复单个提交。有时您需要还原几个提交以完全撤消更改。您可以使用-no-commit,或者您可以使用-n告诉Git执行还原但是不要提交更改。这使您可以将所有还原提交组合到一个提交中,如果您需要还原跨多个提交的功能,这将非常有用。确保以相反的顺序还原提交 - 首先是最新的提交。否则,您可能会通过尝试还原尚不存在的代码来混淆Git。

2
SAIguru011