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

我有一个运行git init的项目。 几次提交后,我做了git status ,告诉我一切都是最新的,没有本地变化。

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

 git reset --hard HEAD 

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

 git checkout . 

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

 git reset 

如果您想恢复您所做的更改,请执行以下操作:

 git revert <commit 1> <commit 2> 

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

 git clean -f 

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

 git clean -fd 

注意:您可能也想运行

 git clean -fd 

 git reset --hard 

不会删除未跟踪的文件,因为git-clean会从跟踪的根目录中删除任何不在git跟踪下的文件。 警告 – 请小心! 先用git-clean运行一个干运行,看看它会删除什么是有帮助的。

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

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

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

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

看看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 bcde; 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 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. 

前面危险:(请阅读评论。执行我的答案build议的命令可能会删除超过你想要的)

彻底删除所有文件,包括我不得不运行的目录

 git clean -f -d 

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

这是我现在使用的bash脚本,它一直在运行。

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

从工作拷贝根目录运行。

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

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

简单地说

 git stash 

它会删除你所有的本地chages。 你也可以稍后用说

 git stash apply 

再克隆

 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

笔记

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

 mkdir project cd project git init echo '*.built' > .gitignore echo 'CODE' > a.sourceCode mkdir b echo 'CODE' > b/b.sourceCode cp -rbc 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上面,但你可以撤消它

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

试试这个恢复在本地分支uncommited所有的变化

 $ 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 

我search了一个类似的问题,

想要扔掉地方提交:

  1. 克隆存储库(git clone)
  2. 切换到开发分支(git checkout dev)
  3. 做了很less的提交(git commit -m“commit 1”)
  4. 但决定扔掉这些本地提交回到远程(起源/ 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点。