本文共 6316 字,大约阅读时间需要 21 分钟。
如何丢弃工作副本中未包含在索引中的更改?
这会签出当前目录的当前索引,从而丢弃文件从当前目录向下的所有更改。
checkout .
或此操作从索引中检出所有文件,覆盖工作树文件。
git checkout-index -a -f
删除比git clean -df更具体的新文件的另一种方法(它将允许您删除某些文件(不一定是全部文件)),是先将新文件添加到索引,然后隐藏,然后删除藏。
当由于某种原因您无法通过某种常规机制(如rm)轻松删除所有未跟踪的文件时,此技术很有用。
我真的发现这篇文章有助于解释何时使用什么命令: :
有几种不同的情况:
如果尚未暂存文件,则可以使用git checkout
。 签出“更新工作树中的文件以匹配索引中的版本”。 如果文件尚未暂存(又添加到索引),则此命令实质上会将文件还原为您的最后一次提交。
git checkout -- foo.txt
如果已暂存文件,则使用git reset。 重置会更改索引以匹配提交。
git reset -- foo.txt
我怀疑使用git stash
是一种流行的选择,因为它的危险性要小一些。 如果您在使用git reset时不小心吹了太多东西,可以随时返回到它。 默认情况下,重置是递归的。
请参阅上面的文章以获取更多建议。
似乎完整的解决方案是:
git clean -dfgit checkout -- .
删除所有未跟踪的文件( 警告 :虽然它不会删除.gitignore中直接提到的被忽略文件, 但可能会删除驻留在文件夹中的被忽略文件 ),并且git checkout
清除所有未暂存的更改。
当您要将存储转移给其他人时:
# add filesgit add . # diff all the changes to a filegit 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权限。
sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx
最近发生在我身上
如果您使用的是存储库的派生库,并且在其中定期与另一个存储库定期进行同步(例如,拉取请求),那么以下内容实际上只是一个解决方案。 简短的答案:删除fork和refork,但请阅读github上的警告 。
我有一个类似的问题,可能不相同,我伤心地说我的解决方案并不理想,但它最终是有效的。
我经常会收到这样的git状态消息(涉及至少2/4个文件):
$ git status# Not currently on any branch.# Changes to be committed:# (use "git reset HEAD..." 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 ..." to update what will be committed)# (use "git checkout -- ..." 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
敏锐的眼睛会注意到,这些文件中的dopplegangers都是单个字母,以防万一。 不知何故,我不知道是什么使我沿着这条路开始的(由于我自己不是从上游仓库使用这些文件),所以我已经切换了这些文件。 尝试此页面(和其他页面)上列出的许多解决方案似乎无济于事。
我可以通过删除叉状存储库和所有本地存储库并重新分叉来解决此问题。 仅此一项是不够的。 上游不得不将有问题的文件重命名为新文件名。 只要您没有任何未提交的工作,没有Wiki和没有与上游存储库不同的问题,就可以了。 至少可以说,上游可能对您不太满意。 至于我的问题,毫无疑问,这是一个用户错误,因为我对git并不熟练,但是事实也很不容易解决git问题。
git checkout -f
man git-checkout
:
-f, --force
切换分支时,即使索引或工作树与HEAD不同,也要继续进行。 这用于丢弃本地更改。
从索引中检查路径时,不要在未合并的条目上失败; 相反,未合并的条目将被忽略。
cd path_to_project_folder # take you to your project folder/working directory git checkout . # removes all unstaged changes in working directory
我最喜欢的是
git checkout -p
这样就可以有选择地还原块。
也可以看看:
git add -p
如果实际上已提交所有暂存的文件,则可以简单地从您的GUI中重置分支,例如,大约单击三下鼠标: Branch , Reset , Yes !
因此,在实践中,我通常要做的就是还原所有不必要的本地更改,然后还原分支。
如果好东西是在单个提交中提交的,那么如果您最终希望以不同的方式提交它,则可以使用“修改最后一个提交”将其恢复到已暂存或未暂存的状态。
这可能不是您要寻找的技术解决方案,但我发现这是一个非常实用的解决方案。 它允许您有选择地放弃未进行的更改,重置不喜欢的更改并保留所做的更改。
因此,总而言之,我只是简单地进行commit , branch reset和修改last commit 。
简单地说
git stash
它将删除所有本地更改。 您还可以稍后说
git stash apply
或git stash pop
我没有放弃更改,而是将遥控器重置为原始位置。 注意-此方法是将文件夹完全还原到仓库中的文件夹。
因此,我这样做是为了确保当我重新设置git时,他们不会坐在那儿(以后-不包括Origin / branchname上的gitignores)
注意:如果要保留尚未跟踪但不在GITIGNORE中的文件,则可能希望跳过此步骤,因为它将擦除在远程存储库中找不到的这些未跟踪的文件(感谢@XtrmJosh)。
git add --all
然后我
git fetch --all
然后我重置原点
git reset --hard origin/branchname
那将使它回到平方。 就像重新克隆分支一样,在本地保持所有gitignored文件的位置。
以下是根据每个用户的评论更新的内容:将用户重置为当前用户所在分支的变体。
git reset --hard @{u}
您可以使用git stash-如果出现问题,仍然可以从stash恢复。 与此处的其他答案类似,但是此答案也将删除所有未暂存的文件以及所有未暂存的删除:
git add .git stash
如果您检查一切正常,请扔掉藏匿处:
git stash drop
来自Bilal Maqsood的git clean
答案也对我有用,但是有了存储,我有了更多控制权-如果我偶然地做某事,我仍然可以找回我的更改
更新
我认为还有1种更改(以前不知道为什么对我有用):
git add . -A
git add . -A
代替git add .
如果没有-A
,则不会暂存已删除的文件
如果您使用子模块,并且没有其他解决方案,请尝试:
要检查问题所在(可能是“肮脏”的情况),请使用:
git diff
去除藏匿处
git submodule update
无论您的存储库处于什么状态,都可以始终重置为以前的任何提交:
git reset --hard
这将丢弃该提交之后所做的所有更改。
由于没有答案表明我使用的确切选项组合,因此它是:
git clean -dfxgit checkout .
这是所使用的git clean
选项的在线帮助文本:
-d
除未跟踪的文件外,还删除未跟踪的目录。 如果未跟踪的目录由其他Git存储库管理,则默认情况下不会将其删除。 如果您确实要删除这样的目录,请使用-f
选项两次。
-f
如果Git配置变量clean.requireForce
未设置为false
,除非给定-f
, -n
或-i
,否则Git clean将拒绝删除文件或目录。 除非给出第二个-f
,否则Git将拒绝删除.git
子目录或文件中的.git
。
-x
不要使用.gitignore
(每个目录)和$GIT_DIR/info/exclude
的忽略规则,但仍要使用-e
选项提供的忽略规则。 这允许删除所有未跟踪的文件,包括构建产品。 可以使用它(可能与git reset
结合使用)创建一个原始的工作目录,以测试干净的构建。
另外, git checkout .
需要在仓库的根部完成。
当您输入git status时,将显示(使用“ git checkout-...”放弃工作目录中的更改) 。
例如git checkout -- .
在我看来,
git clean -df
应该可以。 根据
git-clean-从工作树中删除未跟踪的文件
描述
通过从当前目录开始递归删除不受版本控制的文件来清理工作树。
通常,仅删除Git未知的文件,但是如果指定-x选项,也会删除忽略的文件。 例如,这对于删除所有构建产品很有用。
如果给出任何可选的...参数,则仅影响那些路径。
选件
-d除删除未跟踪的文件外,还删除未跟踪的目录。 如果未跟踪的目录由其他Git存储库管理,则默认情况下不会将其删除。 如果您确实要删除这样的目录,请使用-f选项两次。
-f --force如果Git配置变量clean.requireForce没有设置为false,除非给定-f,-n或-i,否则git clean将拒绝运行。
只需使用:
git stash -u
做完了 简单。
如果您真的很在乎您的隐藏堆栈,则可以执行git stash drop
。 但是到那时,您最好使用(来自Mariusz Nowak):
git checkout -- .git clean -df
尽管如此,我还是最喜欢git stash -u
,因为它仅用一个命令就“丢弃”所有已跟踪和未跟踪的更改。 但是git checkout -- .
只有丢弃修订,并git clean -df
仅丢弃未经跟踪的变化......然后键入这两个命令是太多的工作:)
我遇到了一个奇怪的情况,即文件始终处于未暂存状态,这可以帮助我解决。
git rm .git属性
git添加-A git reset --hard
最简单的方法是使用以下命令:
此命令用于放弃工作目录中的更改-
git checkout -- .
在git命令中,通过使用以下方式实现未跟踪文件的存储:
git stash -u
您可以创建自己的别名,该别名以描述性方式描述如何进行。
我使用下一个别名放弃更改。
discard = checkout --
然后,您可以将其用作下一步以放弃所有更改:
discard .
或只是一个文件:
discard filename
否则,如果您要舍弃所有更改以及未跟踪的文件,则可以混合使用checkout和clean:
cleanout = !git clean -df && git checkout -- .
所以使用很简单,如下所示:
cleanout
现在可以在下一个Github存储库中使用了,其中包含很多别名:
如果几乎不可能排除文件的修改,您是否考虑过忽略它们? 如果此语句正确,并且在开发过程中您不会触摸这些文件,则此命令可能会很有用:
git update-index --assume-unchanged file_to_ignore
如果您只想删除对现有文件的更改 ,请使用checkout
( )。
git checkout -- .
--
)告诉Git,应将后面的内容作为其第二个参数(路径),而忽略了分支的指定。 .
)表示所有路径。 如果要删除自上次提交以来添加的文件 ,请使用clean
( ):
git clean -i
-i
选项启动一个交互式clean
,以防止误删除。 如果您希望将更改移至存放空间以供以后访问 ,请使用stash
( ):
git stash
对于当前工作目录中的所有未暂存文件,请使用:
git checkout -- .
对于特定文件,请使用:
git checkout -- path/to/file/to/revert
--
在这里消除 。
另一种更快的方法是:
git stash save --keep-index --include-untracked
如果您不希望透彻了解,则无需包含--include-untracked
。
之后,您可以根据需要使用git stash drop
命令删除该存储。
如果您对保留未暂存的更改不感兴趣(特别是如果暂存的更改是新文件),那么我发现这很方便:
git diff | git apply --reverse
尝试了以上所有解决方案,但仍无法摆脱未暂存的新文件。
使用git clean -f
删除那些新文件- 但是要小心! 注意强制选项。
git clean -df
通过从当前目录开始递归删除不受版本控制的文件来清理工作树。
-d
:除未跟踪的文件外,删除未跟踪的目录
-f
:强制(根据clean.requireForce
设置可能不是必需的)
运行git help clean
查看手册
转载地址:http://cudnb.baihongyu.com/