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

Jac*_*ine 1830 git revert git-checkout

我有一个项目,我跑了git init.几次提交之后,我做了git status哪些告诉我一切都是最新的,并且没有本地更改.

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

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

180*_*ION 3244

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

git checkout .
Run Code Online (Sandbox Code Playgroud)

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

git reset
Run Code Online (Sandbox Code Playgroud)

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

git revert <commit 1> <commit 2>
Run Code Online (Sandbox Code Playgroud)

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

git clean -f
Run Code Online (Sandbox Code Playgroud)

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

git clean -fd
Run Code Online (Sandbox Code Playgroud)

  • fwiw经过这么长时间后,`git checkout path/to/file`只会将本地更改恢复为`path/to/file` (124认同)
  • 我提出了一个新的,单一的命令.`git unfuck`. (53认同)
  • 下面的答案+1也提到git clean -f(删除未跟踪的更改)和-fd(也删除未跟踪的目录) (27认同)
  • `git checkout .`和`git reset [ - hard HEAD]`没有用,我不得不做一个`git clean -fd`来恢复我的更改. (9认同)
  • `git reset`不会重置您的更改,`git reset --hard`会这样做. (6认同)
  • 如果您还想清理未跟踪的文件,请阅读http://stackoverflow.com/questions/61212/removing-untracked-files-from-your-git-working-copy (3认同)
  • 警告是完全错误的!首先,git reset在当前分支(HEAD)上工作,它的作用与"master"分支无关.此外,重置与未提交的提交无关,并且您不会因为使用git reset而自动丢失它们. (3认同)
  • 我的项目根目录中的`git checkout .`仅应用于该目录中的文件,我必须执行`git checkout*`来恢复所有子目录. (2认同)

Ant*_*bbs 378

注意:您可能还想运行

git clean -fd
Run Code Online (Sandbox Code Playgroud)

git reset --hard
Run Code Online (Sandbox Code Playgroud)

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

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

~"performing this command will cause an un-tracked file to be overwritten"
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,执行干运行还将帮助显示将被覆盖的文件列表.

  • git clean -fd(-d需要强制) (35认同)
  • -n或--dry-run是干运行的标志. (14认同)
  • 文件清理命令是"git clean -f".使用"git clean -d"删除未跟踪的目录 (12认同)
  • git clean -ffd如果你的git存储库中有另一个git存储库.没有双f,它将不会被删除. (2认同)

Wil*_*ken 118

再克隆

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

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

清洁并重置

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

清洁

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

重启

git reset --hard
Run Code Online (Sandbox Code Playgroud)
  • ❌删除本地的非推送提交
  • ✅恢复对跟踪文件所做的更改
  • ✅恢复删除的跟踪文件
  • ❌删除.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'
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • git revert 进行撤消先前提交的新提交
  • git checkout 及时返回到先前的提交(可能需要首先运行上面的命令)
  • git stashgit reset上面,但你可以撤消

  • @styfle ✅ 是它所做的,❌ 是它不做的 (3认同)
  • @FullDecent阅读有点令人困惑."❌不删除本地的,未推送的提交".这意味着它不会删除.双重否定意味着它确实删除了? (3认同)
  • 我很确定,第一个选项(**重新克隆**)实际上是“删除本地、非推送的提交”:) (2认同)
  • 关于 `git clean -f -d -x` 中的 -x 标志:如果指定了 -x 选项,则忽略的文件也会被删除。例如,这对于从 GIT 文档中删除所有构建产品很有用。 (2认同)

Mic*_*ant 78

如果您想恢复所有更改并且与当前远程主控器保持同步(例如,您发现主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.
Run Code Online (Sandbox Code Playgroud)

  • 在“git reset --hard origin/master”(有效)中指定“origin”似乎很重要——没有它(即“git reset --hard”)似乎没有任何改变。 (6认同)

Wil*_*ell 49

看看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
Run Code Online (Sandbox Code Playgroud)

  • 也救了我!就我而言,我的“git rebase -i”冒险出了问题(最终由于编辑错误而删除了一些提交)。多亏了这个提示,我又回到了良好的状态! (2认同)

Tob*_*ann 35

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

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

git clean -f -d
Run Code Online (Sandbox Code Playgroud)

  • 为了节省任何人我刚刚经历的痛苦:这也将删除.gitignore-d文件! (13认同)
  • 没有伤害。我有备份,但这可能需要免责声明;) (2认同)

小智 34

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

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

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD
Run Code Online (Sandbox Code Playgroud)

从工作副本根目录运行.

  • 最后一个命令给出了'错误:pathspec'HEAD'与git已知的任何文件都不匹配 (10认同)
  • `git reset --hard`恢复跟踪文件(暂存与否),`git clean -f -d`删除未跟踪文件,`git checkout - HEAD`为什么我们需要这个? (4认同)

piy*_*vra 34

简单地说

git stash
Run Code Online (Sandbox Code Playgroud)

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

git stash apply 
Run Code Online (Sandbox Code Playgroud)

  • `git stash drop`删除最新的隐藏状态而不适用于工作副本. (6认同)
  • 使用`git stash pop`会自动删除最重要的隐藏更改 (2认同)

amr*_*mra 32

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

git restore .
Run Code Online (Sandbox Code Playgroud)

如果没有则使用:

git restore :/
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Pat*_*ick 27

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

然后git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec用来恢复更改.


Ber*_*san 18

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

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

# Execute on the root of the working tree...

# Discard all changes to tracked files
git checkout .

# Remove all untracked files 
git clean -fd
Run Code Online (Sandbox Code Playgroud)

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


Man*_*ddy 14

我搜索了类似的问题,

想扔掉当地的承诺:

  1. 克隆了存储库(git clone)
  2. 切换到dev分支(git checkout dev)
  3. 做了很少的提交(git commit -m"commit 1")
  4. 但决定扔掉这些本地提交回到远程(origin/dev)

以下是:

git reset --hard origin/dev
Run Code Online (Sandbox Code Playgroud)

校验:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这是唯一对我有用的东西 - “git reset --hard origin” (2认同)

小智 10

两个简单的步骤

git fetch origin
Run Code Online (Sandbox Code Playgroud)
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard origin/main
Run Code Online (Sandbox Code Playgroud)


joe*_*oey 7

您可能不一定希望/需要在工作目录中存储您的工作/文件,而只是完全摆脱它们.该命令git clean将为您执行此操作.

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

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

git stash --all

这将删除所有内容,但保存所有内容.之后可以使用此存储.

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

git clean -f -d

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

git clean -f -d -n
Run Code Online (Sandbox Code Playgroud)

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

所以这里是从最具侵略性到最具攻击性的选项的总结


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

git clean -f -d
Run Code Online (Sandbox Code Playgroud)

选项2:预览上述影响(预览最积极)

git clean -f -d -n
Run Code Online (Sandbox Code Playgroud)

选项3:存储所有文件(最不积极的)

`git stash --all` 
Run Code Online (Sandbox Code Playgroud)


Jan*_*lva 6

尝试此操作以还原本地分支中未提及的所有更改

$ git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

但是如果你看到这样的错误:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.
Run Code Online (Sandbox Code Playgroud)

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

$ cd /directory/for/your/project/.git/
$ rm index.lock
Run Code Online (Sandbox Code Playgroud)

最后,再次运行命令:

$ git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)


Rtm*_*tmY 5

在此处添加另一个选项。

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

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

git restore <file>
Run Code Online (Sandbox Code Playgroud)

回到以前的状态。

  • 要恢复当前本地目录中的所有文件更改,您可以使用: git Restore 。 (3认同)