我如何抛弃工作副本中未在索引中的更改?
我发现这篇文章很有帮助,可以解释何时使用哪个命令:http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
有几种情况:
如果您尚未将文件加入暂存区,则使用git checkout
。Checkout "更新工作树中的文件以匹配索引中的版本"。 如果文件尚未被暂存(也就是没有添加到索引中)……这个命令将基本上将文件还原为您最后提交的内容。
git checkout -- foo.txt
如果您已经将文件加入暂存区,则使用git reset
。Reset会更改索引以匹配某次提交。
git reset -- foo.txt
我怀疑使用git stash
是一个流行的选择,因为它比较安全。如果您在使用git reset时意外删除了太多内容,您随时可以回退到git stash保存的版本。Reset默认是递归的。
请查看上面的文章获取更多建议。
如果你不想保留未暂存的更改(尤其是暂存的更改是新文件),我发现这很方便:
git diff | git apply --reverse
git checkout -- .
如果出现问题,您可以使用git stash将其还原。与此处其他答案类似,但此答案还会删除所有未提交的文件和未提交的删除操作:
git add .
git stash
如果您确认一切都没问题,那么就丢掉这个存档:git stash drop
来自Bilal Maqsood的答案用git clean
对我也有效,但是使用存储区更加控制 - 如果我不小心做了什么,我仍然可以找回我的更改。
更新
我认为还有1个更改(不知道为什么以前这对我起作用):
git add . -A
而不是git add .
没有-A
,删除的文件将不会被提交到暂存区。
git checkout -f
man git-checkout
:
-f, --force
切换分支时,即使索引或工作树与HEAD不同也继续进行。这可用于丢弃本地更改。
从索引中检出路径时,不会因合并条目失败而失败;相反,未合并的条目将被忽略。
我没有丢弃任何更改,而是将我的远程重置为原点。注意-此方法是完全恢复您的文件夹与存储库相同。
所以我这样做是为了确保它们不会在我git reset时停留(稍后-不包括Origin / branchname上的gitignores)
注意:如果您想保留尚未跟踪但不在GITIGNORE中的文件,则可能希望跳过此步骤,因为它将擦除这些未跟踪的文件(感谢@XtrmJosh)。
git add --all
然后我git fetch --all
然后我重置为原点
git reset --hard origin/branchname
这将使它回到原点。就像重新克隆分支一样,同时在本地保留所有被Git忽略的文件。
根据下面用户评论的更新: 重置到当前用户所在的分支。
git reset --hard @{u}
git reset --hard @{u}
,它将分支重置到当前远程跟踪分支所在的位置。 - user2221343尝试了以上所有解决方案,但仍无法摆脱新的未暂存文件。
使用 git clean -f
删除这些新文件 - 但务必小心! 注意强制选项。
要永久丢弃更改:
git reset --hard
要将更改保存到以后再处理:
git stash
只需使用:
git stash -u
完成。容易。
如果您真的关心您的存储库栈,那么您可以继续使用 git stash drop
。但在那时,最好使用以下方法(来自Mariusz Nowak):
git checkout -- .
git clean -df
然而,我最喜欢的是git stash -u
,因为它可以在一个命令中"丢弃"所有跟踪和未跟踪的更改。但是git checkout -- .
只会丢弃已跟踪的更改,而git clean -df
只会丢弃未跟踪的更改... 而且输入这两个命令太麻烦了(far too much work) :)
git stash -u
将很快(Git 2.14.x/2.15,2017年第三季度)有所改进:https://dev59.com/LGkv5IYBdhLWcg3wkBka#46027357 - VonCgit stash -k
命令。 - snap简单来说
git stash
这将会移除您所有的本地更改。您也可以通过说
git stash apply
或者 git stash pop
git-clean
只会从工作树中删除未被跟踪的文件。详见 https://git-scm.com/docs/git-clean。 - Yegagit-clean -df
可能会很危险。它会删除本地未被跟踪的文件(例如由.gitignore
覆盖的文件)。请仔细阅读以下所有内容,并考虑使用git checkout .
代替。 - jacanterburygit status
命令会提供建议,告诉你如何操作!执行git checkout -- .
命令即可。 - Paulogit status
建议使用git restore
命令来达到相同的目的,这是一个新的命令。请参考我的2019更新。 - prosoitos