如何丢弃Git中的未分级更改?

Readonly 4562 git version-control

如何放弃工作副本中不在索引中的更改?

Tobi.. 5032

对于当前工作目录中的所有未暂存文件,请使用:

git checkout -- .

对于特定文件使用:

git checkout -- path/to/file/to/revert

--这里删除争论的歧义.

  • @Ninjack`git checkout - .`与`git checkout .`的含义相同,只是你明确指出你没有指定分支名称.他们都说要检查我目前正在进行的分支上的HEAD版本''.要么 './'.如果你通常使用`git checkout branch-name directory-or-file-name`,你会在分支`branch-name`上获得`directory-or-file-name`的HEAD版本. (115认同)
  • 这似乎是git规范的方式.也就是说,如果你输入`git status`,git会告诉你什么 (112认同)
  • 新手问题,什么是"git checkout - ." 在语义上意味着什么? (87认同)
  • 如果有未跟踪的文件,则不起作用.Git说`错误:以下未跟踪的工作树文件将被checkout覆盖:...`. (26认同)
  • IMO这个变体是不完美的,因为当更改清单时更改的存储库不在HEAD修订版上并且您不想将其更新为HEAD并且想要清除更改时,它不处理这种情况. (22认同)
  • @alexykot:您必须使用`git checkout`指定路径,否则它不会杀死您所做的更改!`.`的技巧是带路径的结账也包括所有子目录. (7认同)
  • 虽然看起来很明显,但我认为值得注意的是,这个命令应该从存储库的顶级目录运行,因为它只清理当前的工作目录. (5认同)
  • @alexykot"更新到HEAD"意味着清除更改.HEAD是当前检出的修订版. (4认同)
  • `git checkout .`更短 (3认同)
  • @MichałTrybus清理整个存储库,无论你在哪里,你都可以使用`git checkout - :/`(我自己也在寻找!) (3认同)
  • 这只会丢弃对现有文件的更改.它不会丢弃自上次提交以来添加的任何新文件. (2认同)
  • 我很困惑,这个(git checkout - .)只是*不*工作.我仍然拥有所有更改(未分级)文件. (2认同)

Greg Hewgill.. 2549

另一种更快捷的方法是:

git stash save --keep-index --include-untracked

--include-untracked如果您不想彻底了解它,则无需包括在内.

之后,git stash drop如果您愿意,可以使用命令删除该存储.

  • git checkout - .要快得多 (134认同)
  • 要彻底了解它,你也想要`--include-untracked`. (118认同)
  • 这会污染存储堆栈.`git checkout - .`只用一个命令完成工作. (118认同)
  • `git stash`和任何种类的`git checkout`都不会丢弃非分段删除.根据`git status`的输出,这里的实际正确答案是一些味道`git reset HEAD` (37认同)
  • @KarimSamir:这个问题专门询问*不在索引*中的变化.`git reset`命令也会丢弃索引中的更改. (9认同)
  • @FelipeTonello我希望我可以给你100个代表的评论.在我的测试中,这似乎完全符合我的要求.相反,我花了最后一小时使用"git checkout - *"并解决所有未跟踪的文件错误. (3认同)

Mariusz Nowa.. 1824

似乎完整的解决方案是:

git clean -df
git checkout -- .

git clean删除所有未跟踪的文件(警告:虽然它不会删除.gitignore中直接提到的忽略文件,但它可能会删除驻留在文件夹中的忽略文件)并git checkout清除所有未分级的更改.

  • 其他两个答案实际上并不起作用,这个答案确实有效. (113认同)
  • 小心运行git clean -df.如果您不明白它的作用,您可能会删除您要保留的文件,例如robots.txt,上传的文件等. (86认同)
  • 正如@ctlockey所说,第一个命令也**删除目录,如果它们只是被忽略的文件组成**...在我的项目中丢失了一大堆配置文件:(小心. (39认同)
  • @dval这是第一个命令删除了未编制索引的文件,第二个命令删除了未分段的更改(索引文件).因此,如果您没有任何暂存更改,则与使用`git reset --hard`恢复到最后一次提交相同 (18认同)
  • 如果未跟踪的目录是git克隆,请使用** - dff**. (3认同)
  • Erorgh!我刚用git clean -df删除了我的项目文件夹吗?我怎么得到这个?请帮忙!!!!我点了一个ls,我看不到另一个我无意删除的文件夹 (3认同)
  • 由于某种原因,这已恢复到之前的提交 (2认同)
  • @ user2441441:您很不走运:您清除了不受版本控制的文件。重要文件应始终受版本控制(不一定是它们所在存储库的一部分:您可以将它们放在另一个专用存储库中并对其进行符号链接)。并且位于存储库工作目录中但不在该存储库控制版本中的文件应始终为[`.gitignore`d](http://stackoverflow.com/documentation/git/245/ignoring-files-and-folders )。 (2认同)

CB Bailey.. 312

这将检出当前目录的当前索引,从而向下丢弃当前目录中的所有文件更改.

git checkout .

或者这会从索引中检出所有文件,覆盖工作树文件.

git checkout-index -a -f

  • 嗨,`git checkout .`和`git checkout - .`有什么区别? (28认同)
  • +1这是正确的答案,因为它正确处理了某些文件同时进行**和**无阶段更改的情况.请注意,此解决方案会丢弃未分级的更改; 如果你想保留它们,那么你应该使用@greg-hewgill的回答`git stash save --keep-index`. (13认同)
  • @Robert Siemer和一般情况? (10认同)
  • @Evan:在这种情况下没有区别. (5认同)
  • @Evan:问这个问题的好地方。–它与OP的问题无关,也与此处的答案无关。 (2认同)

Elvis Ciotti.. 239

git clean -df

通过从当前目录开始递归删除不受版本控制的文件来清除工作树.

-d:除了未跟踪的文件外,删除未跟踪的目录

-f:强制(根据clean.requireForce设置可能没有必要 )

运行git help clean以查看手册


Ben.. 103

我最喜欢的是

git checkout -p

这使您可以选择性地还原块.

也可以看看:

git add -p

  • 我喜欢在丢弃之前看到实际变化的能力. (9认同)
  • 我从来没有想过.`-p`增加了一层额外的安全性.将它与`git clean -d`结合起来实际回答OP. (2认同)

Martin G.. 89

由于没有答案表明我使用的确切选项组合,这里是:

git clean -dfx
git checkout .

这是使用git clean选项的在线帮助文​​本:

-d

除了未跟踪的文件之外,删除未跟踪的目录.如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会删除它.-f如果您确实要删除此类目录,请使用两次选项.

-f

如果Git的配置变量clean.requireForce未设置为false,Git的清洁会拒绝,除非给予删除文件或目录-f,-n-i..git除非-f给出第二个目录,否则Git将拒绝删除子目录或文件中的目录.

-x

不要使用.gitignore(每个目录)$GIT_DIR/info/exclude的忽略规则,但仍然使用随-e选项提供的忽略规则.这允许删除所有未跟踪的文件,包括构建产品.这可以(可能与之结合使用git reset)创建一个pristine工作目录来测试干净的构建.

此外,git checkout .需要在回购的根目录中完成.

  • 请注意,这是不可逆转的,如果你在`.gitignore`中有文件,你将失去它们.因此,请考虑在此之前备份您的项目. (5认同)
  • 同样关于第一个命令git clean -dfx,这是我在运行之前在安全方面的提示:只需在运行git clean -d -x -n之前运行,以显示文件列表即可-被删除,然后通过运行`git clean -d -x -f`确认操作(我将参数-n和re -f放在最后,以便能够在终端中快速更改它) (2认同)

blak3r.. 61

我真的发现这篇文章有助于解释何时使用什么命令:http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

有几种不同的情况:

  1. 如果您尚未暂存该文件,则使用git checkout.Checkout"更新工作树中的文件以匹配索引中的版本".如果文件尚未暂存(也就是添加到索引中)...此命令将基本上将文件还原为您上次提交的内容.

    git checkout -- foo.txt

  2. 如果您已暂存该文件,则使用git reset.重置会更改索引以匹配提交.

    git reset -- foo.txt

我怀疑使用git stash是一种受欢迎的选择,因为它有点危险.如果你在使用git reset时意外地吹得太厉害,你可以随时回到它.默认情况下,重置是递归的.

请查看上面的文章以获得进一步的建议.


A H M Forhad.. 58

最简单的方法是使用以下命令:

此命令用于放弃工作目录中的更改 -

git checkout -- .

https://git-scm.com/docs/git-checkout

在git命令中,通过使用以下方式实现对未跟踪文件的存储:

git stash -u

http://git-scm.com/docs/git-stash

  • 我两次来到这里,读完这个答案,最后忘记了`.`.对于未来我:期间是*必不可少的! (17认同)
  • 我需要摆脱子目录中的所有本地更改,而又不要浪费其他所有更改。这个答案很有帮助,谢谢 (2认同)
  • 请描述这两个命令的作用。没有解释真的没有帮助。 (2认同)
  • 优秀。结帐在一项命令中完成,而最受欢迎的一项在两项中完成。也可以跟着`git clean -fd`来清理不在索引中的文件。 (2认同)
  • 这是唯一为我工作的人。 (2认同)

jtheletter.. 54

如果您只想删除对现有文件的更改,请使用checkout(此处记录).

git checkout -- .
  • 没有指定分支,因此它检出当前分支.
  • double-hyphen(--)告诉Git,后面的内容应该作为它的第二个参数(path),你跳过了分支的规范.
  • 句点(.)表示所有路径.

如果要删除自上次提交后添加的文件,请使用clean(此处记录):

git clean -i 
  • -i选项启动交互clean,以防止错误删除.
  • 还有一些其他选项可以更快地执行; 看文档.

如果您希望将更改移至保留空间以供以后访问,请使用stash(此处记录):

git stash
  • 所有更改都将移至Git的Stash,以便以后访问.
  • 有一些选项可用于更细微的存储; 看文档.


Joshua Kunzm.. 47

如果您不想保留未分级的更改(特别是如果分阶段的更改是新文件),我发现这很方便:

git diff | git apply --reverse

  • 这会错过任何未跟踪的文件,这可能是一件好事 (7认同)

小智.. 44

当您输入git status时,会显示 (使用"git checkout - ..."来放弃工作目录中的更改) .

例如 git checkout -- .

  • 当然,正确的命令是"git checkout - ".一个点.在评论中,三个点是一个语法的东西,表明还有许多其他选项可以使用.. (2认同)

Bijan.. 43

git checkout -f


man git-checkout:

-f, --force

切换分支时,即使索引或工作树与HEAD不同,也要继续.这用于丢弃本地更改.

检查索引中的路径时,不要在未合并的条目上失败; 相反,未合并的条目将被忽略.

  • 这会丢弃索引的变化!! (并且OP要求保留原样.) (2认同)

Asped.. 38

你可以使用git stash - 如果出现问题,你仍然可以从藏匿处恢复.与此处的其他答案类似,但此处还会删除所有未暂存的文件以及所有未暂存的删除:

git add .
git stash

如果你检查一切正常,扔掉藏匿处:

git stash drop

Bilal Maqsood的答案git clean对我也很有帮助,但是我有更多的控制权 - 如果我不小心做了,我仍然可以得到我的改变

UPDATE

我认为还有一个更改(不知道为什么这对我有用):

git add . -A 代替 git add .

没有-A删除的文件将不会被暂存


Nick.. 35

我没有丢弃更改,而是将遥控器重置为原点.注意 - 此方法是将文件夹完全还原到repo的文件夹.

所以我这样做是为了确保他们在git重置时不会坐在那里(稍后 - 在Origin/branchname上排除gitignores)

注意:如果您想保留尚未跟踪的文件,而不是GITIGNORE,您可能希望跳过此步骤,因为它将擦除远程存储库中找不到的未跟踪文件(感谢@XtrmJosh).

git add --all

然后我

git fetch --all

然后我重置为原点

git reset --hard origin/branchname

这将使它回到原点.就像RE-Cloning分支一样,WHILE将所有我的gitignored文件保存在本地和就地.

更新后面的每个用户评论:更改以重置用户所在的当前分支.

git reset --hard @{u}

  • 我喜欢的一个很好的小变化是`git reset --hard @ {u}`,它将分支重置为当前远程跟踪分支的位置 (2认同)

artur.. 31

尝试了上面的所有解决方案,但仍然无法摆脱新的,未分阶段的文件.

使用git clean -f删除这些新文件- 虽然谨慎!注意强制选项.


piyushmandov.. 21

简单地说

git stash

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

git stash apply 

或者git stash pop


Ben Wilde.. 21

只需使用:

git stash -u

完成.简单.

如果您真的关心您的藏匿栈,那么您可以关注git stash drop.但在那时你最好使用(来自Mariusz Nowak):

git checkout -- .
git clean -df

尽管如此,我git stash -u最喜欢它,因为它只丢弃了一个命令中所有跟踪和未跟踪的更改.然而,git checkout -- .只有丢弃修订,并且git clean -df只丢弃未跟踪的变化......然后键入这两个命令是远远太多的工作:)


GlassGhost.. 16

这甚至可以在以下目录中工作; 超出正常的git权限.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

最近发生在我身上


vivekporwal0.. 14

cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory


msangel.. 11

无论您的仓库处于什么状态,您都可以随时重置为之前的任何提交:

git reset --hard <commit hash>

这将丢弃在提交后进行的所有更改.


Lahiru.. 11

在我看来,

git clean -df

应该做的伎俩.根据git clean上的Git文档

git-clean - 从工作树中删除未跟踪的文件

描述

通过从当前目录开始递归删除不受版本控制的文件来清除工作树.

通常,只删除Git未知的文件,但如果指定了-x选项,则也会删除被忽略的文件.例如,这可以用于删除所有构建产品.

如果给出任何可选的...参数,则只会影响这些路径.

选项

-d除了未跟踪的文件外,还删除未跟踪的目录.如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会删除它.如果您确实要删除此类目录,请使用-f选项两次.

-f --force如果Git配置变量clean.requireForce未设置为false,则除非给定-f,-n或-i,否则git clean将拒绝运行.


tjb.. 10

摆脱比git clean -df更具体的新文件的另一种方法(它将允许你摆脱一些文件,不一定全部),是先将新文件添加到索引,然后藏匿,然后删除藏.

当由于某种原因,您无法通过某种普通机制(如rm)轻松删除所有未跟踪文件时,此技术很有用.


bbarker.. 9

以下内容实际上只是一个解决方案,如果您正在使用存储库的分支,您可以定期与另一个存储库同步(例如,拉取请求).简短的回答:删除fork和refork,但是读取github上的警告.

我有一个类似的问题,也许不完全相同,我很遗憾地说我的解决方案并不理想,但它最终是有效的.

我经常会有这样的git状态消息(涉及至少2/4个文件):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

敏锐的眼睛会注意到,这些文件中的doppleganger是单个字母,以防万一.不知何故,我不知道是什么导致我开始这条路(因为我自己从上游回购中没有使用这些文件),我已经切换了这些文件.尝试此页面上列出的许多解决方案(和其他页面)似乎没有帮助.

我能够通过删除我的分叉存储库和所有本地存储库来重新解决问题.仅这一点还不够; 上游必须将有问题的文件重命名为新文件名.只要你没有任何未完成的工作,没有wiki,也没有与上游存储库不同的问题,你应该没问题.至少可以说,上游可能对您不满意.至于我的问题,它无疑是一个用户错误,因为我不是那么精通git,但事实上它很容易修复指向git的问题.


prosoitos.. 8

2019更新:

20197月以来,已经有一个新命令执行此操作:git restore

在中git status,现在Git建议使用此命令而不是git checkout以前的命令。

尽管此命令还可用于将工作树还原到特定的提交或还原索引的内容,但默认情况下,工作树将还原到索引中的状态(此处要求)。

因此,为了还原与pathspec匹配的文件(摆脱它们未进行的暂存更改),您可以执行以下操作:

git restore <pathspec>

并删除当前存储库中所有未暂存的更改:

git restore .

与一样git checkout -- .,这只会丢弃对Git跟踪的文件所做的更改,而不会丢弃任何新的未跟踪文件。如果要丢弃任何未暂存的更改,包括新的未跟踪文件,则可以运行其他:

git clean -dff

但是,请谨慎使用此后面的命令,因为您可能会丢弃不想删除的文件。


注意git restore:由于这是一个新命令,因此其手册页会发出警告:

此命令是实验性的。行为可能会改变。

因此,如果将来的行为确实发生变化,则此答案可能会过时。因此,man git-restore在使用前先快速运行可能是明智的。


twicejr.. 7

当您想将存储转移给其他人时:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[编辑]评论说,它可以命名为藏匿处.好吧,如果你想分享你的藏品,请使用它;)

  • 实际上Git藏匿可以有一个标题.例如`git stash save"功能X正在进行中"`. (5认同)

Pau.. 7

您可以创建自己的别名,描述如何以描述性方式执行此操作.

我使用下一个别名来放弃更改.


放弃工作树中(文件列表)中的更改

discard = checkout --

然后您可以将其用作下一个以丢弃所有更改:

discard .

或者只是一个文件:

discard filename

否则,如果您想要丢弃所有更改以及未跟踪的文件,我会使用checkout和clean的混合:

在工作树中清理并放弃更改和未跟踪的文件

cleanout = !git clean -df && git checkout -- .

所以下次使用很简单:

cleanout

现在可以在下一个包含大量别名的Github仓库中使用:


Ivan.. 6

如果所有暂存的文件都已实际提交,那么可以通过大约三次鼠标点击从GUI重置分支:分支,重置,!

因此,我在实践中经常做的是还原不需要的本地更改是提交所有好的东西,然后重置分支.

如果好的东西是在一次提交中提交的,那么你可以使用"修改最后一次提交"将它恢复到暂存或未分阶段,如果你最终想要以不同的方式提交它.

这可能不是您正在寻找的问题的技术解决方案,但我发现它是一个非常实用的解决方案.它允许您有选择地丢弃未分级的更改,重置您不喜欢的更改并保留您所做的更改.

总而言之,我只是提交,分支重置,并修改最后一次提交.


onalbi.. 6

如果你是在子模块的情况下,没有其他解决方案的工作尝试:

  • 要检查问题是什么(可能是"脏"的情况),请使用:

    git diff

  • 要删除藏匿处

    git submodule update


小智.. 6

我有一个奇怪的情况,一个文件总是未分阶段,这有助于我解决.

git rm .gitattributes
git add -A
git reset --hard


Jesús Castro.. 6

如果几乎不可能排除对文件的修改,你是否考虑过忽略它们?如果此语句正确并且您在开发期间不接触这些文件,则此命令可能很有用:

git update-index --assume-unchanged file_to_ignore


khem raj reg.. 6

你有一个非常简单的git命令 git checkout .


小智.. 5

如果你刚刚更改了文件的权限(这是在DOS/Windoze上),这些解决方案都不起作用

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/stash@{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/stash@{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

解决此问题的唯一方法是手动重置已更改文件的权限:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff


归档时间:

查看次数:

2417554 次

最近记录:

1 年,1 月 前