编辑完代码后,git checkout -- .
可用于撤消我的修改。但是,相同的命令无法撤消git checkout [revision] .
所做的更改 - 在这种情况下我需要git reset --hard;
。
任何人都可以解释为什么不一致吗?
答案 0 :(得分:1)
这一切都与Git的索引有关。
索引在Git中有几个功能,但主要的是你在那里构建 next 提交。其他版本控制系统没有单独的索引(或完全隐藏它):它们只有当前提交,这是显而易见的事情,Git称之为HEAD,而< em> work-tree ,您可以在其中查看和编辑文件。但是Git有另外的第三件事。
第三件事,这个索引,是你必须git add
改变的原因。在您git add
某个工作树文件的新版本之前,索引版本仍然与HEAD提交中的版本匹配。因此,您将要做的下一次提交尚未获得该文件的新版本。
命令:
git checkout -- .
将文件从索引复制到工作树。如果您没有git add
更新版本,则索引版本与HEAD提交匹配,因此将与HEAD提交相同的版本复制到工作树。
命令:
git checkout <revision> -- .
然而,做了一些非常不同的事情:它将指定修订版中的所有内容复制到索引中,然后将这些文件从索引复制到工作树中。现在每个文件的索引版本都已更改:
git checkout -- .
再次将相同的索引版本添加到您的工作树中。他们仍然准备好在新的提交中提交。
你可以:
git checkout HEAD -- .
将把HEAD提交中的所有文件复制到索引中,然后复制到工作树中。这将使HEAD,索引和工作树再次匹配。
同时,命令:
git reset --hard HEAD
略有不同,但最终会产生相同的效果:首先,它将当前分支从HEAD
移动到HEAD
。由于这不会将移动到任何地方,因此完全没有效果。接下来,它将新的HEAD文件复制到索引中,最后,它将这些文件从索引复制到工作树(这是--hard
步骤。)
如果您在索引中有新文件,那么您可以看到一些额外的差异,这些差异不在HEAD
提交中。使用git checkout HEAD -- .
会将它们留在那里,而git reset --hard HEAD
会删除它们(从索引和工作树中删除它们)。
答案 1 :(得分:0)
git checkout -- .
将丢弃工作目录中的更改,并将所有文件的版本保留为最后一次提交(如您所说的撤消编辑)。
git checkout <commit> .
将按指定更改所有文件的版本。有两种情况:
git checkout <last commit> .
,这与git checkout -- .
的工作方式相同,因为git会将所有文件的版本更改为最后一次提交。git checkout <not last version> .
,这将按照您指定的版本检出所有文件的版本,并且由于文件与上次提交不同,因此需要提交本地更改。总而言之,对于不同的情况:
撤消修改(未提交): git checkout -- .
需要根据之前的提交进行开发: git checkout <commit> .
和git commit
放弃一些已提交的更改: git reset --hard HEAD~n