git checkout是否会更新所有文件?

9

新手问题,我想确保我理解了这个问题。

当我执行git checkout <revision>命令时,它会将整个项目返回到那个时刻的状态,还是只会重新创建那个特定版本中更改的文件?

例如:如果我的文件夹除了.git repo以外完全为空,然后我执行git checkout master命令,结果的文件是整个项目吗,还是仅为最近提交更改的文件?

我问这个问题,因为我正在不同的时间点(从一开始)检查我的项目,而且每次检查的大小都有很大的变化, 与人们预期的项目逐渐增长的方式不同。

2个回答

5

当我执行git checkout <revision>命令时,它是否会将整个项目返回到该时刻的状态,还是仅重新创建那个特定修订中更改的文件?

如果您的工作树和暂存区完全为空(除了.git子目录),并且您运行以下命令:

git checkout <revision>

如果在运行 git checkout 命令时你的工作区不为空,情况就会更加微妙,并可分为以下三种情况:

  1. 这个操作并不复杂,Git 会轻松地执行它:特定版本的内容会被复制到您的工作区(如果需要,会覆盖现有内容)。
  2. 如果执行该操作会导致本地更改丢失,那么 Git (假设您没有使用 -f 标志)会告诉您该操作无法进行并中止检出。
  3. 可能会出现更复杂的情况,其中一些本地未提交的更改保留在您的工作区和/或索引中。关于这种情况的更多详细信息可以在我的答案中找到:为什么检出不同分支后仍然存在未暂存的更改?

如果您的工作树和暂存区与特定版本的内容完全相同,那么您的工作树和暂存区将完美地反映该特定版本的内容。

[...] 每个检出的大小差异很大。

您是否考虑到未跟踪的文件?您是否提交后删除了大型文件?仅根据您提供的信息,我们只能对检出大小差异很大的原因进行推测。


1
感谢您的解释。我之所以问这个问题,是因为我想将整个项目恢复到从空工作目录提交的点,而不仅仅是检索特定提交的内容。 这个命令似乎做到了我需要的:git checkout <revision> . - user2089518
@user2089518 很酷。只要记住,git checkout 的结果取决于具体情况。 - jub0bs

1

文档中可以看到:"将工作树中的文件更新为与索引或指定树中版本相匹配的版本。" 在您的示例中,它将完全返回仓库到检出时的状态。

但是,正如Jubobs所指出的,在您上次检出后如果对仓库的状态进行了任何更改,则其行为会有所不同。如果是这种情况,他的答案比我的更详细。

还要注意,这仅适用于由git跟踪的文件,因此您存放的任何其他文件都不会受到影响。


它会完整地将存储库返回到检出时的状态。但并非总是如此;请参见https://dev59.com/8l8e5IYBdhLWcg3wPYdA#25940509 - jub0bs
1
啊,是的,好观点。我忘记了那个,我会更新我的答案。 - Adam H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接