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

然后我做了几次连续的改变,意识到我想扔掉一切,回到原来的状态。这个命令能帮我吗?

git reset --hard HEAD

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

git checkout .

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

git restore .

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

git reset

要还原已提交的更改,请执行以下操作:

git revert <commit 1> <commit 2>

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

git clean -f

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

git clean -fd

查看git-relog。它将列出它记住的所有状态(默认为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

注意:您可能还想运行

git clean -fd

as

git reset --hard

不会删除未跟踪的文件,因为gitclean将从跟踪的根目录中删除不受git跟踪的任何文件。警告-小心!首先使用git clean运行一次试运行,看看它会删除什么。

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

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

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

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

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

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

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

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

git clean -f -d

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

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

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

从工作副本根目录运行。

如果您想恢复所有更改并更新当前远程主机(例如,您发现主机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.

简单地执行-

git stash

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

git stash apply 

您可能不一定希望/需要将您的工作/文件存储在工作目录中,而是简单地将其完全删除。命令gitclean将为您执行此操作。

这样做的一些常见用例是删除由合并或外部工具生成的cruft,或者删除其他文件,以便可以运行干净的构建。

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

git stash--全部

这将删除所有内容,但将其全部保存在存储库中。这些藏起来的东西以后就可以用了。

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

gitclean-f-d

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

git clean -f -d -n

它将向您显示执行gitclean-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

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

想要放弃本地提交:

克隆了存储库(gitclone)切换到dev分支(git checkout dev)做了几次提交(gitcommit-m“commit 1”)但决定放弃这些本地提交,返回远程(origin/dev)

以下情况也是如此:

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点。

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

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

问题解答:

如何恢复git历史记录中保留或不保留更改的单个更改如何返回到旧版本以从相同状态重新启动

在此处添加另一个选项。

我指的是标题:还原本地更改。它还可以应用于未准备提交的更改。

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

git restore <file>

返回到以前的状态。

如果您只想删除所有更改,请执行git签出。这是一种更快更简单的方法。

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

git restore .

如果没有,则使用:

git restore :/

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

使用top pathspec magic还原所有工作树文件:git restore:/还原当前目录中的所有文件:gitrestore。文件类型(例如所有C源文件):git restore“*.C”

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

要删除未跟踪的文件:gitclean-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 files
git checkout .

# Remove all untracked files 
git clean -fd

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