我该如何放弃Git中未分配的更改?

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

另一个更快的方法是:

 git stash save --keep-index 

之后,如果你愿意的话,你可以用git stash drop命令删除那个存储。

对于特定的文件使用:

 git checkout path/to/file/to/revert 

对于所有未分档的文件使用:

 git checkout -- . 

确保包括最后期限。

看来完整的解决方案是:

 git clean -df git checkout -- . 

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

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

 git checkout . 

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

 git checkout-index -a -f 
 git clean -df 

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

-d :除了未跟踪的文件之外,还要除去未跟踪的目录

-f :强制(根据clean.requireForce设置可能不需要)

运行git help clean来查看手册

我最喜欢的是

 git checkout -p 

这可以让你有选择地恢复块。

也可以看看:

 git add -p 

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

有几个不同的情况:

  1. 如果你还没有上传文件,那么你使用git checkout 。 签出“更新工作树中的文件以匹配索引中的版本”。 如果这些文件还没有上演(又名索引),那么这个命令将会把文件恢复到上一次提交的状态。

    git checkout -- foo.txt

  2. 如果你已经登台了,那么使用git reset。 重置更改索引以匹配提交。

    git reset -- foo.txt

我怀疑使用git stash是一个受欢迎的选择,因为它有点危险。 如果你在使用git reset的时候不小心打了太多的东西,你总是可以回头看看。 重置是默认递归的。

看看上面的文章进一步的建议。

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

 git clean -dfx git checkout . 

这是使用的git clean选项的联机帮助文本:

-d

除了未跟踪的文件之外,还要除去未跟踪的目录。 如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会被删除。 如果你真的想删除这样一个目录,使用-f选项两次。

-f

如果Git配置变量clean.requireForce没有设置为false,git clean将拒绝删除文件或目录,除非给定-f,-n或-i。 Git将拒绝使用.git子目录或文件删除目录,除非给出第二个-f。

-x

不要使用从.gitignore(每个目录)和$ GIT_DIR / info / exclude读取的标准忽略规则,但是仍然使用-e选项给出的忽略规则。 这允许删除所有未跟踪的文件,包括构建产品。 这可以使用(可能与git reset一起)来创建一个原始的工作目录来测试一个干净的构建。

另外, git checkout . 是在回购的根源。

如果您对保持未分离的更改(特别是如果分阶段更改是新文件)不感兴趣,我发现这个方便:

 git diff | git apply --reverse 

当你输入git status时, (使用“git checkout – …”放弃工作目录中的改变)被显示。

比如git checkout -- .

git checkout -f


man git-checkout

-f, --force

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

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

你可以使用git存储 – 如果出现问题,你仍然可以从存储中恢复。 类似于这里的其他答案,但这一个也删除所有unstaged文件,也是所有unstaged删除:

 git add . git stash 

如果你检查一切正常,扔掉存储:

 git stash drop 

Bilal Maqsood用git clean的答案也适用于我,但随着隐藏我有更多的控制权 – 如果我意外地做了,我仍然可以得到我的变化

UPDATE

我认为还有一个变化(不知道为什么这之前为我工作):

git add . -A git add . -A而不是git add .

没有-A删除的文件将不会上演

我没有放弃更改,而是将遥控器重置为原点。 注意 – 这种方法是完全恢复到您的文件夹的回购。

所以我这样做,以确保他们不会坐在那里,当我git重置(后来 – 排除原产地/ branchname上的gitignores)

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

 git add --all 

然后我

 git fetch --all 

然后我重置为原点

 git reset --hard origin/branchname 

这将回到原点。 就像重新克隆分支一样,尽管保留所有的gitignored文件在本地和地方。

每个用户评论更新如下:变化重置为用户所在的当前分支。

 git reset --hard @{u} 

试过以上所有的解决方案,但仍然无法摆脱新的,unstaged文件。

使用git clean -f删除这些新文件 – 但要小心! 注意强制选项。

只要使用:

 git stash -u 

完成。 简单。

如果你真的关心你的存储栈,那么你可以跟随git stash drop 。 但在那个时候,你最好使用(来自Mariusz Nowak):

 git checkout -- . git clean -df 

尽管如此,我最喜欢git stash -u ,因为它只用一个命令 “丢弃”所有跟踪和未跟踪的更改。 还有git checkout -- . 只丢弃跟踪的更改,而git clean -df只丢弃未跟踪的更改…和键入这两个命令是太多的工作:)

最简单的方法是使用这个命令:

该命令用于放弃工作目录中的更改 –

 git checkout -- . 

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

在git命令中,未被跟踪的文件的存储是通过使用:

 git stash -u 

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

简单地说

 git stash 

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

 git stash apply 

或者git存储弹出

即使在目录中也是如此。 正常的git权限之外。

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

最近发生在我身上

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

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

当出于某种原因,通过一些普通机制(如rm)不能轻易删除所有未跟踪文件时,此技术非常有用。

我的想法是,

 git clean -df 

应该做的伎俩。 按照git clean文档

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

描述

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

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

如果给出任何可选的参数,则只有那些路径受到影响。

选项

-d除了未跟踪的文件以外,还要除去未跟踪的目录。 如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会被删除。 如果你真的想删除这样一个目录,使用-f选项两次。

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

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

敏锐的目光会注意到,这些文件有differegangers是一个单一的字母在案件。 不知何故,我不知道是什么导致我从这个路径开始(因为我没有从上游回购协议来处理这些文件),我已经切换了这些文件。 尝试在这个页面(和其他页面)列出的许多解决方案似乎没有帮助。

我能够通过删除我分叉的存储库和所有本地存储库,并reforking来解决问题。 仅这一点是不够的; 上游必须将有问题的文件重新命名为新文件名。 只要你没有任何无所作为的工作,没有维基,也没有任何问题与上游资源库分歧,你应该没问题。 至少可以说,上游可能不会对你感到高兴。 至于我的问题,这无疑是一个用户错误,因为我不熟练使用git,但事实上,这是不容易解决指向与git的问题。

当你想转移一个藏匿给其他人:

 # 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 

作为评论,它可以命名为stash。 那么,如果你想分享你的藏品,请使用这个;)

如果所有的分阶段文件都被实际提交,那么分支可以简单地从GUI重置,只需点击三次鼠标即可: 分支重置

所以在实践中我经常做的是回复不需要的本地修改,就是提交所有的好东西,然后重新设置分支。

如果好的东西是在一个单独的提交中完成的,那么如果你最终希望有一点不同的话,那么你可以使用“修改上次提交”来使其恢复上演或未上架。

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

所以总之,我只是做提交分支重置 ,并修改最后的提交

如果您只是更改了文件的权限 (这是在DOS / Windoze上)

 Mon 23/11 / 2015-15:16:34.80 C:\ ... \ work \ checkout \ slf4j +> git status
在分支SLF4J_1.5.3上
不进行提交的更改:
   (使用“git add ...”来更新将提交的内容)
   (使用“git checkout  -  ...”放弃工作目录中的更改)

        修改:.gitignore
        修改:LICENSE.txt
        修改:TODO.txt
        修改:codeStyle.xml
        修改:pom.xml
        修改:version.pl

没有更改添加到提交(使用“git add”和/或“git commit -a”)

星期一23/11 / 2015-15:16:37.87 C:\ ... \ work \ checkout \ slf4j +> git diff
 diff --git a / .gitignore b / .gitignore
旧模式100644
新模式100755
 diff --git a / LICENSE.txt b / LICENSE.txt
旧模式100644
新模式100755
 diff --git a / TODO.txt b / TODO.txt
旧模式100644
新模式100755
 diff --git a / codeStyle.xml b / codeStyle.xml
旧模式100644
新模式100755
 diff --git a / pom.xml b / pom.xml
旧模式100644
新模式100755
 diff --git a / version.pl b / version.pl
旧模式100644
新模式100755

星期一23/11/11  -  15:16:45.22 C:\ ... \ work \ checkout \ slf4j +> git reset --hard HEAD
 HEAD现在在8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940已添加.gitignore

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

星期一23/11 / 2015-15:16:53.49 C:\ ... \ work \ checkout \ slf4j +> git stash save -u
保存的工作目录和索引状态在SLF4J_1.5.3 WIP:8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940添加.gitignore
 HEAD现在在8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940已添加.gitignore

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

星期一23/11 / 2015-15:17:06.75 C:\ ... \ work \ checkout \ slf4j +> git stash drop
丢弃的refs / stash @ {0}(e6c49c470f433ce344e305c5b778e810625d0529)

星期一23/11 / 2015-15:17:08.90 C:\ ... \ work \ checkout \ slf4j +> git stash drop
没有找到藏匿处。

星期一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  - 。

星期一23/11 / 2015-15:22:04.53 C:\ ... \ work \ checkout \ slf4j +> git status
在分支SLF4J_1.5.3上
不进行提交的更改:
   (使用“git add ...”来更新将提交的内容)
   (使用“git checkout  -  ...”放弃工作目录中的更改)

        修改:.gitignore
        修改:LICENSE.txt
        修改:TODO.txt
        修改:codeStyle.xml
        修改:pom.xml
        修改:version.pl

没有更改添加到提交(使用“git add”和/或“git commit -a”)

星期一23/11 / 2015-15:22:13.06 C:\ ... \ work \ checkout \ slf4j +> git diff
 diff --git a / .gitignore b / .gitignore
旧模式100644
新模式100755
 diff --git a / LICENSE.txt b / LICENSE.txt
旧模式100644
新模式100755
 diff --git a / TODO.txt b / TODO.txt
旧模式100644
新模式100755
 diff --git a / codeStyle.xml b / codeStyle.xml
旧模式100644
新模式100755
 diff --git a / pom.xml b / pom.xml
旧模式100644
新模式100755
 diff --git a / version.pl b / version.pl
旧模式100644
新模式100755

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

星期一23/11 / 2015-15:25:43.79 C:\ ... \ work \ checkout \ slf4j +> git status -s |  egrep“^ M”| 切-c4- |  for / f“usebackq tokens = * delims =”%A(`more`)do chmod 644%〜A

星期一23/11 / 2015-15:25:55.37 C:\ ... \ work \ checkout \ slf4j +> git status
在分支SLF4J_1.5.3上
没有提交,工作目录干净

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

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

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

  • 要检查是什么问题(也许是一个“脏”的情况下)使用:

    git diff

  • 删除存储

    git submodule update

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

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


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

 discard = checkout -- 

然后你可以使用它作为下一个放弃所有更改:

 discard . 

或者只是一个文件:

 discard filename 

否则,如果你想放弃所有的更改和未跟踪的文件,我使用checkout和clean的混合:

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

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

所以使用简单如下:

 cleanout 

现在可以在下一个Github库中找到,它包含了很多别名:

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

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

只要使用:

 git stash -k -u 

这将存储未分离的更改未跟踪的文件(新文件)并保留分段文件。

这比重reset / checkout / clean ,因为你可能希望他们以后回来(通过git stash pop )。 把它们藏在藏匿处比放弃它们要好。

如果几乎不可能排除文件的修改,你有没有考虑忽略它们? 如果这个说法是正确的,在开发过程中你不会碰到这些文件,这个命令可能是有用的:

git update-index --assume-unchanged file_to_ignore