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

git version-control

2292891 观看

30回复

135576 作者的声誉

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

作者: Readonly 的来源 发布者: 2008 年 9 月 9 日

回应 (30)


4775

52452 作者的声誉

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

git checkout -- .

对于特定文件使用:

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

--这里删除争论的歧义

作者: Tobi 发布者: 09.09.2008 07:37

2435

696707 作者的声誉

决定

另一种更快捷的方法是:

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

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

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

作者: Greg Hewgill 发布者: 09.09.2008 07:39

306

537385 作者的声誉

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

git checkout .

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

git checkout-index -a -f
作者: CB Bailey 发布者: 20.06.2009 10:28

44

755 作者的声誉

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

git diff | git apply --reverse
作者: Joshua Kunzmann 发布者: 28.07.2011 05:27

28

615 作者的声誉

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

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

作者: artur 发布者: 14.10.2011 09:07

230

3741 作者的声誉

git clean -df

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

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

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

运行git help clean以查看手册

作者: Elvis Ciotti 发布者: 07.12.2011 01:09

10

6743 作者的声誉

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

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

作者: tjb 发布者: 15.06.2012 08:55

58

10327 作者的声誉

我真的发现这篇文章有助于解释何时使用什么命令: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时意外地吹得太厉害,你可以随时回到它。默认情况下,重置是递归的。

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

作者: blak3r 发布者: 13.08.2012 09:31

1760

24293 作者的声誉

似乎完整的解决方案是:

git clean -df
git checkout -- .

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

作者: Mariusz Nowak 发布者: 29.08.2012 06:28

7

1073 作者的声誉

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

# 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

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

作者: twicejr 发布者: 08.07.2013 03:07

16

8519 作者的声誉

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

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

最近发生在我身上

作者: GlassGhost 发布者: 05.09.2013 09:38

9

2421 作者的声誉

以下内容实际上只是一个解决方案,如果您正在使用存储库的分支,您可以定期与另一个存储库同步(例如,拉取请求)。简短的回答:删除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的问题。

作者: bbarker 发布者: 05.01.2014 04:53

41

4105 作者的声誉

git checkout -f


man git-checkout

-f, --force

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

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

作者: Bijan 发布者: 17.05.2014 02:28

14

310 作者的声誉

cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory
作者: vivekporwal04 发布者: 30.05.2014 09:26

95

4169 作者的声誉

我最喜欢的是

git checkout -p

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

也可以看看:

git add -p
作者: Ben 发布者: 10.10.2014 12:31

6

1878 作者的声誉

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

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

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

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

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

作者: Ivan 发布者: 20.03.2015 03:38

21

3049 作者的声誉

简单地说

git stash

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

git stash apply 

或者git stash pop

作者: piyushmandovra 发布者: 24.04.2015 12:19

33

788 作者的声誉

我没有丢弃更改,而是将遥控器重置为原点。注意 - 此方法是将文件夹完全还原到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}
作者: Nick 发布者: 07.08.2015 09:15

36

2388 作者的声誉

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

git add .
git stash

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

git stash drop

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

UPDATE

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

git add . -A 代替 git add .

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

作者: Asped 发布者: 11.09.2015 11:59

6

1208 作者的声誉

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

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

    git diff

  • 要删除藏匿处

    git submodule update

作者: onalbi 发布者: 01.10.2015 09:32

11

6728 作者的声誉

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

git reset --hard <commit hash>

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

作者: msangel 发布者: 05.02.2016 12:59

84

10368 作者的声誉

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

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 .需要在回购的根目录中完成。

作者: Martin G 发布者: 28.04.2016 07:46

42

666 作者的声誉

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

例如 git checkout -- .

作者: Erdem ÖZDEMİR 发布者: 17.05.2016 11:27

10

1380 作者的声誉

在我看来,

git clean -df

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

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

描述

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

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

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

选项

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

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

作者: Lahiru 发布者: 14.07.2016 07:03

21

4118 作者的声誉

只需使用:

git stash -u

完成。简单。

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

git checkout -- .
git clean -df

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

作者: Ben Wilde 发布者: 08.09.2016 06:19

6

164 作者的声誉

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

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

作者: SDV 发布者: 08.02.2017 11:58

51

1009 作者的声誉

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

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

git checkout -- .

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

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

git stash -u

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

作者: A H M Forhadul Islam 发布者: 12.04.2017 09:27

7

5767 作者的声誉

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

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


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

discard = checkout --

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

discard .

或者只是一个文件:

discard filename

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

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

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

所以下次使用很简单:

cleanout

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

作者: Pau 发布者: 05.06.2017 04:44

6

1204 作者的声誉

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

git update-index --assume-unchanged file_to_ignore

作者: Jesús Castro 发布者: 31.07.2017 03:57

49

6811 作者的声誉

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

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

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

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

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

git stash
  • 所有更改都将移至Git的Stash,以便以后访问。
  • 有一些选项可用于更细微的存储; 看文档。
作者: jtheletter 发布者: 18.03.2018 12:19
32x32