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

时间:2009-07-18 07:52:29

标签: git revert git-checkout

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

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

git reset --hard HEAD

16 个答案:

答案 0 :(得分:3102)

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

git checkout .

如果要还原对索引所做的更改(即已添加的更改),请执行此操作。 警告这会将所有未提交的提交重置为master!

git reset

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

git revert <commit 1> <commit 2>

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

git clean -f

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

git clean -fd

答案 1 :(得分:364)

注意:您可能还想运行

git clean -fd

作为

git reset --hard

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

当您收到错误消息

时,这也特别有用
~"performing this command will cause an un-tracked file to be overwritten"

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

在这种情况下,执行干运行也会显示一个将被覆盖的文件列表。

答案 2 :(得分:97)

重新克隆

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

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

清理并重置

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

清洁

git clean -f -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 stashgit reset相同,但您可以将其撤消

答案 3 :(得分:73)

如果您想恢复所有更改并与当前远程主控更新(例如,您发现主HEAD已向前移动,因为您将其分支并且您的推送被拒绝&# 39;)你可以使用

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.

答案 4 :(得分:48)

查看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

答案 5 :(得分:34)

DANGER AHEAD :(请阅读评论。执行我的答案中建议的命令可能会删除超出您想要的内容)

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

git clean -f -d

答案 6 :(得分:34)

在阅读了大量答案并尝试之后,我发现了各种边缘情况,这意味着有时候他们并没有完全清理工作副本。

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

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

从工作副本根目录运行。

答案 7 :(得分:31)

简单地说

git stash

它将删除所有本地chages。你也可以稍后再说

git stash apply 

答案 8 :(得分:26)

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

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

答案 9 :(得分:11)

我搜索了类似的问题,

想扔掉当地的承诺:

  1. 克隆了存储库(git clone)
  2. 切换到dev分支(git checkout dev)
  3. 做了很少的提交(git commit -m&#34; commit 1&#34;)
  4. 但决定抛弃这些本地提交以返回远程(origin / dev)
  5. 以下是:

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

答案 10 :(得分:6)

您可能不一定希望/需要在工作目录中存储您的工作/文件,而只是完全摆脱它们。命令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` 

答案 11 :(得分:6)

尝试使用此方法还原本地分支中未提及的所有更改

$ 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

答案 12 :(得分:2)

在此处添加另一个选项。

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

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

git restore <file>

返回到先前的状态。

答案 13 :(得分:2)

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

git restore .

如果没有,则使用:

git restore :/

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

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

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

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

答案 14 :(得分:0)

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

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

问题的答案:

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

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

答案 15 :(得分:0)

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