如何丢弃工作副本中未包含在索引中的更改?
git-clean -df
可能很危险。它将删除本地未跟踪的文件(例如,.gitignore覆盖)仔细阅读以下所有内容,并考虑使用git checkout。相反
git status
就可以做到这一点! git checkout -- .
如何丢弃工作副本中未包含在索引中的更改?
git-clean -df
可能很危险。它将删除本地未跟踪的文件(例如,.gitignore覆盖)仔细阅读以下所有内容,并考虑使用git checkout。相反
git status
就可以做到这一点! git checkout -- .
Answers:
另一种更快的方法是:
git stash save --keep-index --include-untracked
--include-untracked
如果您不希望它做得太透彻,则无需包括在内。
之后,您可以根据需要使用git stash drop
命令删除该存储区。
--include-untracked
。
git reset
命令也将丢弃索引中的更改。
git stash
,也没有任何各种git checkout
将丢弃不分级删除。根据输出git status
,这里的实际正确答案是某种味道git reset HEAD
git checkout -- .
仅使用一个命令执行该作业。
对于当前工作目录中的所有未暂存文件,请使用:
git checkout -- .
对于特定文件,请使用:
git checkout -- path/to/file/to/revert
--
这里消除争论的歧义。
git status
error: The following untracked working tree files would be overwritten by checkout: ...
。
git checkout -- .
含义相同git checkout .
,不同之处在于您明确表示未指定分支名称。他们俩都说我在当前所在的分支上签出HEAD版本。要么 '。/'。如果您通常这样做git checkout branch-name directory-or-file-name
,则会获得directory-or-file-name
on branch 的HEAD版本branch-name
。
似乎完整的解决方案是:
git clean -df
git checkout -- .
git clean
删除所有未跟踪的文件(警告:虽然它不会删除.gitignore中直接提及的被忽略文件,但可能会删除驻留在文件夹中的被忽略文件),并git checkout
清除所有未暂存的更改。
git reset --hard
这会签出当前目录的当前索引,从而丢弃文件从当前目录向下的所有更改。
git checkout .
或此操作从索引中检出所有文件,覆盖工作树文件。
git checkout-index -a -f
git checkout .
和之间有什么区别git checkout -- .
?
git stash save --keep-index
。
我最喜欢的是
git checkout -p
这样就可以有选择地还原块。
也可以看看:
git add -p
-p
增加了额外的安全性。结合使用git clean -d
以实际回答OP。
由于没有答案表明我使用的确切选项组合,因此它是:
git clean -dfx
git checkout .
这是所用git clean
选项的在线帮助文本:
-d
除未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由其他Git存储库管理,则默认情况下不会将其删除。-f
如果您确实要删除这样的目录,请使用两次选项。
-f
如果Git配置变量clean.requireForce
未设置为false
,除非给出,或-f
,否则Git clean将拒绝删除文件或目录。Git将拒绝删除子目录或文件中的目录,除非提供第二个目录。-n
-i
.git
-f
-x
不要使用.gitignore
(按目录)和中$GIT_DIR/info/exclude
的忽略规则,但仍要使用-e
选项提供的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。可以使用它(可能与结合使用git reset
)创建原始工作目录以测试干净的构建。
另外,git checkout .
需要在回购的根目录中完成。
git reset --hard
代替它?(实际上等价于git reset --hard HEAD
当前目录,并且应该能在其中运行)
git clean -dfx
,这里有个提示,我在运行它之前会很安全:刚运行git clean -d -x -n
之前,显示要删除的文件列表,然后通过运行确认操作git clean -d -x -f
(我把参数-n
,-f
最终可以在终端中对其进行快速更改)
.gitignore
将会丢失它们。因此,在此之前请考虑备份您的项目。
如果您只想删除对现有文件的更改,请使用checkout
(在此处记录)。
git checkout -- .
--
)告诉Git,以下内容应作为其第二个参数(路径),而忽略了分支的指定。.
)表示所有路径。如果要删除自上次提交以来添加的文件,请使用clean
(在此处记录):
git clean -i
-i
选项启动一个交互式clean
,以防止误删除。如果您希望将更改移至存放空间以供以后访问,请使用stash
(在此处记录):
git stash
我真的发现这篇文章有助于解释何时使用什么命令: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 checkout -- .
https://git-scm.com/docs/git-checkout
在git命令中,通过使用以下方式实现未跟踪文件的存储:
git stash -u
.
最后忘记了。为了我未来:这段时间至关重要!
git clean -fd
以清理不在索引中的文件。
git checkout -f
man git-checkout
:
-f, --force
切换分支时,即使索引或工作树与HEAD不同,也要继续进行。这用于丢弃本地更改。
当从索引中检出路径时,不要在未合并的条目上失败;相反,未合并的条目将被忽略。
当您键入git status时 (使用“ git checkout-...”放弃工作目录中的更改) 将显示。
例如 git checkout -- .
2019更新:
自2019年7月以来,已经有一个新的命令执行此操作:git restore
。
在中git status
,现在Git建议使用此命令而不是git checkout
以前的命令。
尽管此命令还可用于将工作树还原到特定的提交或还原索引的内容,但默认情况下,工作树将还原到索引中的状态(此处要求)。
因此,为了还原与pathspec匹配的文件(摆脱它们未进行的暂存更改),您可以执行以下操作:
git restore <pathspec>
例如,要恢复当前目录中所有未暂存的更改,可以运行:
git restore .
如果从项目的根目录运行此命令,它将恢复整个存储库中所有未分段的更改。
请注意,与git checkout -- .
(如Mariusz Nowak所指出的)一样,这将仅丢弃对Git跟踪的文件的更改,而不会丢弃任何新的未跟踪的文件。如果要丢弃任何未暂存的更改,包括新的未跟踪文件,则可以运行其他:
git clean -df
但是,请谨慎使用此后面的命令,因为您可能会丢弃不想删除的文件。
注意git restore
:由于这是一个新命令,因此其手册页会发出警告:
此命令是实验性的。行为可能会改变。
因此,如果将来的行为发生变化,则此答案可能会过时。因此,man git-restore
在使用前先快速运行可能是明智的。
git restore .
效果很好。谢谢。
git restore <filename>
,而且效果很好。
git restore .
将所有文件还原到当前目录中,而不是整个存储库中。
我没有放弃更改,而是将遥控器重置为原始位置。注意-此方法是将文件夹完全还原到仓库中的文件夹。
因此,我这样做是为了确保当我重新设置git时,他们不会坐在那儿(以后-不包括Origin / branchname上的gitignores)
注意:如果要保留尚未跟踪但不在GITIGNORE中的文件,则可能希望跳过此步骤,因为它将清除在远程存储库中找不到的这些未跟踪的文件(感谢@XtrmJosh)。
git add --all
然后我
git fetch --all
然后我重置原点
git reset --hard origin/branchname
那将使它回到平方。就像重新克隆分支一样,在本地保持所有gitignored文件的位置。
以下是根据每个用户的评论更新的内容:将重置为用户所在的当前分支的变体。
git reset --hard @{u}
git reset --hard @{u}
将分支重置为当前远程跟踪分支所在的位置
只需使用:
git stash -u
做完了 简单。
如果您真的很在乎您的隐藏堆栈,则可以选择git stash drop
。但是到那时,您最好使用(来自Mariusz Nowak):
git checkout -- .
git clean -df
尽管如此,我还是git stash -u
最喜欢的,因为它仅用一个命令就“丢弃”了所有已跟踪和未跟踪的更改。然而,git checkout -- .
只有丢弃修订,并且git clean -df
只丢弃未跟踪的变化......然后键入这两个命令是远远太多的工作:)
git stash -u
将很快(GIT 2.14.x / 2.15,Q3 2017)发展了一下:stackoverflow.com/a/46027357/6309
git stash -k
我认为应该是这样。
即使在以下目录中也可以使用:超出正常的git权限。
sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx
最近发生在我身上
git help clean
“ -d除未跟踪的文件外,删除未跟踪的目录”。
你有一个非常简单的git命令 git checkout .
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
应该可以。根据git clean上的Git文档
git-clean-从工作树中删除未跟踪的文件
描述
通过从当前目录开始递归删除不受版本控制的文件来清理工作树。
通常,仅删除Git未知的文件,但是如果指定-x选项,也会删除忽略的文件。例如,这对于删除所有构建产品很有用。
如果给出任何可选的...参数,则仅影响那些路径。
选件
-d除删除未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由其他Git存储库管理,则默认情况下不会将其删除。如果您确实要删除这样的目录,请使用-f选项两次。
-f --force如果Git配置变量clean.requireForce未设置为false,除非给定-f,-n或-i,否则git clean将拒绝运行。
无论您的存储库处于什么状态,都可以始终重置为以前的任何提交:
git reset --hard <commit hash>
这将丢弃该提交之后所做的所有更改。
如果您使用的是存储库的派生库,并且在其中定期与另一个存储库定期进行同步(例如拉取请求),那么以下内容实际上只是一个解决方案。简短答案:删除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
敏锐的眼睛会注意到,这些文件中的dopplegangers都是单个字母,以防万一。不知何故,我不知道是什么让我沿着这条路开始的(由于我自己不是从上游仓库使用这些文件),所以我已经切换了这些文件。尝试此页面(和其他页面)上列出的许多解决方案似乎无济于事。
我可以通过删除叉状存储库和所有本地存储库并重新分叉来解决此问题。仅此一项是不够的。上游不得不将有问题的文件重命名为新文件名。只要您没有任何未提交的工作,没有Wiki和没有与上游存储库不同的问题,就可以了。至少可以说,上游可能对您不太满意。至于我的问题,毫无疑问,这是一个用户错误,因为我对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
[编辑]如所评论,可以命名藏匿处。好吧,如果您想共享存储空间,请使用它;)
git stash save "Feature X work in progress"
。
您可以创建自己的别名,该别名以描述性方式描述如何进行。
我使用下一个别名放弃更改。
discard = checkout --
然后,您可以将其用作下一步以放弃所有更改:
discard .
或只是一个文件:
discard filename
否则,如果您要舍弃所有更改以及未跟踪的文件,那么我将使用checkout和clean:
cleanout = !git clean -df && git checkout -- .
因此,使用非常简单,如下所示:
cleanout
现在可以在下一个Github存储库中使用了,其中包含很多别名:
git-clean
仅从工作树中删除未跟踪的文件git-scm.com/docs/git-clean