Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
`git reset--hard head`vs`git clean--force-d`vs`git checkout--`放弃本地更改之间有什么区别_Git - Fatal编程技术网

`git reset--hard head`vs`git clean--force-d`vs`git checkout--`放弃本地更改之间有什么区别

`git reset--hard head`vs`git clean--force-d`vs`git checkout--`放弃本地更改之间有什么区别,git,Git,git reset--hard headvsgit clean--force-dvsgit checkout--.然后git pull放弃本地更改并从git服务器存储库获取最新更改有什么区别?(非常接近,但不完全相同) 为了进行详细的比较,git checkout--.和git reset--hard HEAD,请参阅我的答案,密切关注索引的描述,因为这将为您提供下一部分的信息 请记住,尽管您不能直接看到索引,但1它是下一次提交的内容。因此,您必须了解Git使用索引而不是工作树进行提交。通常,“

git reset--hard head
vs
git clean--force-d
vs
git checkout--.
然后
git pull
放弃本地更改并从git服务器存储库获取最新更改有什么区别?

(非常接近,但不完全相同)

为了进行详细的比较,
git checkout--.
git reset--hard HEAD
,请参阅我的答案,密切关注索引的描述,因为这将为您提供下一部分的信息

请记住,尽管您不能直接看到索引,但1它是下一次提交的内容。因此,您必须了解Git使用索引而不是工作树进行提交。通常,“看到”就足够了将索引与
HEAD
commit进行比较得到的索引:只要索引中的某个文件与
HEAD
commit中的同一个文件完全相同,
git status
什么也不说;但是只要文件不同,
git status
就会打印出一些内容

(注意:
git status
另外,还将索引与工作树进行比较。如果索引与工作树不同,则表示除未跟踪但被忽略的文件外的其他内容。根据定义,只有工作树文件可以未跟踪,因此索引文件是否未跟踪是毫无疑问的。在总结运行的两个
git diff
时,
git status
可以在默认长格式输出中一次执行一个操作,也可以在
--short
输出中一次执行所有操作。)


1实际上,您可以看到索引:运行
git ls index--stage
,git会将整个过程泄漏出来。2这实际上对于调试非常有用。但是,对于包含许多文件的大型存储库,它每天打印的文件太多,而且
git status
是一个更好的工具

2实际上,您需要添加
--debug
以获得整个过程,包括
--assessment unchanged
--skip worktree
标志,甚至Git也会对您隐藏特殊的撤销条目


git clean
仅删除(部分或全部)未跟踪的文件 在Git中,未跟踪的文件实际上非常容易定义:它是一个不在索引中的文件。这几乎就是它的全部内容,尽管出于
Git clean
的目的,我们还需要另外一项,即是否也忽略该文件

如果文件被跟踪(在索引中),则不能忽略该文件。这样的文件是Git所知道的,因此,
Git clean
永远不会碰它们:这不是它的工作;它的工作是删除一些或所有未跟踪的文件。只有未跟踪的文件可以被忽略,因此未跟踪的文件要么未跟踪但不被忽略,要么未跟踪但也被忽略

默认情况下,
git clean
将删除或假装删除,具体取决于
--干运行
--强制
等选项—仅删除未被忽略的未跟踪文件

使用
-X
(大写X)选项,
git clean
将只删除(或一如既往地假装删除)被忽略的未跟踪文件

使用
-x
(小写x)选项,
git clean
绕过所有“忽略”规则,这意味着所有未跟踪的文件自动归入未跟踪和未忽略的类别。因此,
git clean-f-x
将删除所有未跟踪的文件,即使是那些通常被忽略的文件

使用
-d
git clean
也将删除目录。根据定义,目录永远不会被跟踪,3因此所有目录实际上都是未跟踪的目录,但它们是未跟踪的目录,而不是未跟踪的文件。git对只包含未跟踪文件的子目录使用特殊的捷径处理(或者完全为空),但是:Git没有枚举该目录中的每个(未跟踪)文件,而是将其视为“未跟踪目录”。4

$ mkdir tt
$ cd tt
$ git init
Initialized empty Git repository in ...
$ echo for testing git clean > README
$ git add README
$ touch untr
$ mkdir sub
$ touch sub/subfile
$ git status --short
A  README
?? sub/
?? untr
git status--short
输出的双问号表示未跟踪的文件或未跟踪的目录。由于
sub
是一个包含未跟踪文件的目录,它显示为未跟踪的目录。运行
git clean-f
(或
git clean-n
)表明git删除(或将删除)
unt
,这是一个未跟踪的文件,不会被忽略;但Git不会删除
sub/subfile
sub
本身:

$ git clean -f
Removing untr
-d
添加到
git clean
选项会使git同时删除
sub/subfile
sub

$ git clean -df
Removing sub/
(按照POSIX的要求,删除整个目录意味着首先删除其所有内容。)

将路径名参数添加到git clean将其清理限制为给定的路径名,这非常简单

请注意,对于一个未被忽略但包含另一个Git存储库(无论是作为常规存储库还是作为当前存储库的子模块)的目录,还有另一个特殊情况:
git clean-df
git clean-dfx
不会删除此子存储库,但
git clean-dff
git clean-dffx
将删除此子存储库


3这实际上意味着您不能将目录添加到索引中。(Gitlink条目用于存储子模块信息,通常在Git索引中找到。)

4Git确实在索引中秘密存储关于(至少一些)目录的信息,作为一种性能攻击。其要点是,如果Git发现某些目录,如
sub
只包含未跟踪的文件,或者(递归地)只包含未跟踪的文件的目录,Git可以将其分类为“将来跳过w