我该如何放弃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/
有几个不同的情况:
-
如果你还没有上传文件,那么你使用
git checkout
。 签出“更新工作树中的文件以匹配索引中的版本”。 如果这些文件还没有上演(又名索引),那么这个命令将会把文件恢复到上一次提交的状态。git checkout -- foo.txt
-
如果你已经登台了,那么使用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
简单地说
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