如何将Git托管项目中的所有本地更改恢复到以前的状态?

我运行了git status,它告诉我一切都是最新的,没有本地更改。

然后我连续进行了几次更改,并意识到我想扔掉所有东西并回到我的原始状态。这个命令会为我做吗?

git reset --hard HEAD
2321201 次浏览

要恢复对工作副本所做的更改,请执行以下操作:

git checkout .

或者等效地,对于git版本>=2.23:

git restore .

要恢复对索引所做的更改(即您添加的更改),请执行以下操作。警告这将重置您所有未推送的提交到master!

git reset

要恢复您已提交的更改:

git revert <commit 1> <commit 2>

要删除未跟踪的文件(例如,新文件、生成的文件):

git clean -f

或未跟踪的目录(例如,新的或自动生成的目录):

git clean -fd

查看git-reFlog。它会列出它记得的所有状态(默认为30天),你可以简单地签出你想要的状态。例如:

$ git init > /dev/null$ touch a$ git add .$ git commit -m"Add file a" > /dev/null$ echo 'foo' >> a$ git commit -a -m"Append foo to a" > /dev/null$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null$ git reset --hard HEAD^^ > /dev/null$ cat afoobc$ git reflog145c322 HEAD@{0}: HEAD^^: updating HEADae7c2b3 HEAD@{1}: commit: Append e to afdf2c5e HEAD@{2}: commit: Append d to a145c322 HEAD@{3}: commit: Append c to a363e22a HEAD@{4}: commit: Append b to afa26c43 HEAD@{5}: commit: Append foo to a0a392a5 HEAD@{6}: commit (initial): Add file a$ git reset --hard HEAD@{2}HEAD is now at fdf2c5e Append d to a$ cat afoobcd

注意:您可能还想运行

git clean -fd

git reset --hard

没有删除未跟踪的文件,其中git-Clean将从跟踪的根目录中删除任何不在git跟踪下的文件。警告-小心!首先运行git-Clean的试运行很有帮助,看看它会删除什么。

当您收到错误消息时,这也特别有用

~"performing this command will cause an un-tracked file to be overwritten"

这可能发生在做几件事情时,一个是更新工作副本,当你和你的朋友都添加了一个同名的新文件,但他首先将其提交到源代码控制中,你不关心删除未跟踪的副本。

在这种情况下,执行空运行也将帮助您显示将被覆盖的文件列表。

我遇到了类似的问题。解决方案是使用git log来查找本地提交的版本与远程提交的版本不同。(例如,版本是3c74a11530697214cbcc4b7b98bf7a65952a34ec)。

然后使用git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec恢复更改。

前方危险:(请阅读评论。执行我回答中提出的命令可能会删除比您想要的更多的内容)

完全删除所有文件,包括我必须运行的目录

git clean -f -d

在阅读了一堆答案并尝试之后,我发现了各种边缘情况,这意味着有时它们不能完全清理工作副本。

这是我目前使用的bash脚本,它一直有效。

#!/bin/shgit reset --hardgit clean -f -dgit checkout HEAD

从工作复制根目录运行。

如果您想恢复所有更改并与当前远程主服务器保持同步(例如,您发现主HEAD在您分支后向前移动,并且您的推送被“拒绝”),您可以使用

git fetch  # will fetch the latest changes on the remotegit reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

简单地执行-

git stash

它将删除所有本地更改。您也可以稍后通过执行-

git stash apply

您可能不一定想要/需要将您的工作/文件存储在您的工作目录中,而是简单地完全摆脱它们。命令git clean将为您执行此操作。

执行此操作的一些常见用例是合并或外部工具生成的清除污垢或删除其他文件,以便您可以运行干净的构建。

请记住,您将需要非常小心此命令,因为它旨在从本地工作目录中删除未跟踪的文件。如果您在执行此命令后突然改变主意,则无法返回查看已删除文件的内容。更安全的替代方案是执行

git stash --all

这将删除所有内容,但将其全部保存在一个存储中。然后可以使用此存储。

但是,如果您确实想要删除所有文件并清理您的工作目录,您应该执行

git clean -f -d

这将删除任何文件以及任何由于命令而没有任何项目的子目录。在执行git clean -f -d 命令之前要做的一件聪明的事情是运行

git clean -f -d -n

这将向您显示执行git clean -f -d后将删除的内容的预览

所以这里总结了你的选择从最具侵略性到最不具侵略性


备选案文1:在本地删除所有文件(最具攻击性)

git clean -f -d

备选案文2:预览上述影响(预览最具侵略性)

git clean -f -d -n

备选案文3:隐藏所有文件(攻击性最小)

git stash --all

尝试此操作以恢复本地分支中未提交的所有更改

$ git reset --hard HEAD

如果你看到这样的错误:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

您可以导航到“. git”文件夹,然后删除index.lock文件:

$ cd /directory/for/your/project/.git/$ rm index.lock

最后,再次运行命令:

$ git reset --hard HEAD

我搜索了一个类似的问题,

想要丢弃本地提交:

  1. 克隆存储库(git clone)
  2. 切换到开发分支(git检出开发)
  3. 很少提交(git提交-m"提交1")
  4. 但决定丢弃这些本地提交以返回远程(来源/开发)

下面是这样做的:

git reset --hard origin/dev

检查:

git status
On branch devYour branch is up-to-date with 'origin/dev'.nothing to commit, working tree clean

现在本地提交丢失,回到最初的克隆状态,上面的第1点。

重新克隆

GIT=$(git rev-parse --show-toplevel)cd $GIT/..rm -rf $GITgit clone ...
  • ✅删除本地的非推送提交
  • ✅恢复您对跟踪文件所做的更改
  • ✅恢复您删除的跟踪文件
  • ✅删除.gitignore中列出的文件/目录(如构建文件)
  • ✅删除未跟踪且不在.gitignore中的文件/目录
  • 😀你不会忘记这个方法
  • 😔浪费带宽

以下是我每天忘记的其他命令。

清理和重置

git clean --force -d -xgit reset --hard
  • ❌删除本地的非推送提交
  • ✅恢复您对跟踪文件所做的更改
  • ✅恢复您删除的跟踪文件
  • ✅删除.gitignore中列出的文件/目录(如构建文件)
  • ✅删除未跟踪且不在.gitignore中的文件/目录

干净

git clean --force -d -x
  • ❌删除本地的非推送提交
  • ❌恢复您对跟踪文件所做的更改
  • ❌恢复您删除的跟踪文件
  • ✅删除.gitignore中列出的文件/目录(如构建文件)
  • ✅删除未跟踪且不在.gitignore中的文件/目录

重置

git reset --hard
  • ❌删除本地的非推送提交
  • ✅恢复您对跟踪文件所做的更改
  • ✅恢复您删除的跟踪文件
  • ❌删除.gitignore中列出的文件/目录(如构建文件)
  • ❌删除未跟踪且不在.gitignore中的文件/目录

备注

确认上述所有内容的测试用例(使用bash或sh):

mkdir projectcd projectgit initecho '*.built' > .gitignoreecho 'CODE' > a.sourceCodemkdir becho 'CODE' > b/b.sourceCodecp -r b cgit add .git commit -m 'Initial checkin'echo 'NEW FEATURE' >> a.sourceCodecp a.sourceCode a.builtrm -rf cecho 'CODE' > 'd.sourceCode'

另见

  • #0进行撤消先前提交的新提交
  • #0返回到之前的提交(可能需要先运行上面的命令)
  • #0与上面的git reset相同,但您可以撤消它

这个问题更多的是关于更广泛的存储库重置/恢复,但是如果你有兴趣恢复单个更改-我在这里添加了类似的答案:

https://stackoverflow.com/a/60890371/2338477

问题解答:

  • 如何在git历史记录中保留或不保留更改的情况下恢复单个更改

  • 如何返回到旧版本从相同的状态重新启动

在这里添加另一个选项。

我指的是标题:恢复当地更改。
它也可以应用于未为提交而暂存的更改。

在这种情况下,您可以使用:

git restore <file>

回到以前的状态。

如果您只想删除所有更改,请选择git checkout .这是一个更简单,更简单的方法

如果您在顶部项目目录中,请尝试此操作:

git restore .

如果没有,请使用:

git restore :/

如果您想恢复子集的本地更改:

  • 使用顶级路径规范魔法恢复所有工作树文件:git restore :/
  • 恢复当前目录中的所有文件:git restore .
  • 文件类型(例如所有C源文件):git restore '*.c'

有关详细信息,请参阅git恢复留档

删除未跟踪的文件:git clean -f

两个简单的步骤

git fetch origin
git reset --hard origin/master

或者如果你的git使用main而不是master使用这个:

git reset --hard origin/main

其他答案似乎太复杂了,所以这里有一个对我有效的简单解决方案:

如何放弃所有本地更改并将文件重置为当前分支上的最后一次提交?

# Execute on the root of the working tree...
# Discard all changes to tracked filesgit checkout .
# Remove all untracked filesgit clean -fd

注意:忽略的文件将不受影响