2319

我有一个项目在其中运行git init。在几次提交之后,我git status告诉我一切都是最新的,并且没有本地更改。

然后我连续做了几次改变,意识到我想把所有的东西都扔掉,回到我原来的状态。这个命令会为我做吗?

git reset --hard HEAD
4

17 回答 17

4079

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

git checkout .

如果您想恢复对索引所做的更改(即,您添加的),请执行此操作。警告这会将您所有未推送的提交重置为 master!

git reset

如果要恢复已提交的更改,请执行以下操作:

git revert <commit 1> <commit 2>

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

git clean -f

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

git clean -fd
于 2009-07-18T07:57:46.763 回答
459

注意:您可能还想运行

git clean -fd

作为

git reset --hard

不会删除跟踪的文件,其中 git-clean 将从跟踪的根目录中删除不在 git 跟踪下的任何文件。警告 - 小心这个!首先用 git-clean 运行一次空运行,看看它会删除什么是很有帮助的。

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

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

做几件事时可能会发生这种情况,当您和您的朋友都添加了一个同名的新文件时更新工作副本,但他首先将其提交到源代码管理中,并且您不在乎删除未跟踪的副本.

在这种情况下,进行试运行还有助于向您显示将被覆盖的文件列表。

于 2009-07-20T05:37:36.493 回答
223

重新克隆

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

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

清洁和重置

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

干净的

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

重启

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

笔记

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

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

也可以看看

  • git revert进行撤消先前提交的新提交
  • git checkout及时回到之前的提交(可能需要先运行上面的命令)
  • git stash与上面相同git reset,但您可以撤消它
于 2017-03-20T12:37:11.200 回答
103

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

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.
于 2015-04-22T20:48:23.750 回答
63

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

这是我当前的 bash 脚本,它一直有效。

#!/bin/sh
git reset --hard
git clean -f -d
git checkout HEAD

从工作副本根目录运行。

于 2014-06-04T07:25:46.773 回答
51

查看 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 a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
于 2009-07-19T12:16:28.677 回答
42

只需执行 -

git stash

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

git stash apply 
于 2015-04-24T12:18:07.107 回答
38

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

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

git clean -f -d
于 2013-09-11T07:10:43.763 回答
27

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

然后使用git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec还原更改。

于 2013-08-28T07:34:50.817 回答
24

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

想要丢弃本地提交:

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

以下也是如此:

git reset --hard origin/dev

查看:

git status  

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

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

于 2017-02-25T10:03:34.317 回答
24

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

git restore .

如果没有,则使用:

git restore :/

如果您想还原子集的本地更改:

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

有关详细信息,请参阅git restore 文档

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

于 2021-07-22T08:21:09.417 回答
8

试试这个来恢复本地分支中未提交的所有更改

$ 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
于 2017-01-03T12:49:58.453 回答
7

您可能不一定想要/需要将您的工作/文件存放在您的工作目录中,而只是完全摆脱它们。该命令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` 
于 2016-06-14T22:31:37.947 回答
6

在此处添加另一个选项。

我指的是标题:还原本地更改。
它还可以应用于未暂存以进行提交的更改。

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

git restore <file>

回到以前的状态。

于 2020-09-06T13:37:24.573 回答
3

如果您只想删除所有更改,请选择git checkout . 它更快更简单的方法。

于 2021-06-10T23:06:53.317 回答
0

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

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

问题解答:

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

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

于 2020-03-28T08:25:10.283 回答
0

两个简单的步骤

git fetch origin
git reset --hard origin/master

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

git reset --hard origin/main
于 2022-02-23T11:45:23.287 回答