编辑我的代码后," git checkout - 。"适用于重置,但在" git checkout [revision]之后。"它没有

时间:2017-04-21 12:39:22

标签: git version-control git-checkout

编辑完代码后,git checkout -- .可用于撤消我的修改。但是,相同的命令无法撤消git checkout [revision] .所做的更改 - 在这种情况下我需要git reset --hard;

任何人都可以解释为什么不一致吗?

2 个答案:

答案 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