Git:签出如何影响存储库?

Git:签出如何影响存储库?,git,Git,我一点编程经验都没有,我刚刚开始学习Git。我不明白git签出是如何工作的 根据: 签出旧提交是一个只读操作。查看旧版本时不可能损坏存储库。项目的“当前”状态在主分支中保持不变 但在下面的段落中,他们指出: 另一方面,签出旧文件确实会影响存储库的当前状态 在我看来,这完全是自相矛盾的。有人能用外行的语言给我解释一下吗 因为第一段解释了 git checkout <some commit> git checkout <some file> git签出 第二段解释 gi

我一点编程经验都没有,我刚刚开始学习Git。我不明白git签出是如何工作的

根据:

签出旧提交是一个只读操作。查看旧版本时不可能损坏存储库。项目的“当前”状态在主分支中保持不变

但在下面的段落中,他们指出:

另一方面,签出旧文件确实会影响存储库的当前状态


在我看来,这完全是自相矛盾的。有人能用外行的语言给我解释一下吗

因为第一段解释了

git checkout <some commit>
git checkout <some file>
git签出
第二段解释

git checkout <some commit>
git checkout <some file>
git签出

它们有不同的语义,特别是第一个是只读的,而第二个确实会更改存储库的状态。

第二句最好写为:

签出旧文件会影响工作区的当前状态

如果将存储库视为整个项目历史中所有版本文件的历史,则工作区是处于某种状态的文件的快照


签出
将内容从存储库移动到工作区。它只从存储库中读取,但会写入工作区。因此,它不能改变回购协议,但它可以改变你的工作空间。

想象你在你的主分支中,这是你完美的当前状态

git checkout master
想象一下,您只想进入特定的状态,或者在进行特定的提交时看看情况如何,想象一下提交的名称是97b4b6c。如果您之前进行了97b4b6c提交,git提供了一个选项,您可以进入该状态并签出存储库

请记住,
git checkout~97b4b6c
将进入97b4b6c提交状态。 进入此状态后,您当前的状态(主控)将不可用 伤害。您可以随时返回到当前状态(主控)。这 就像,您可以在A(主)和B(97b4b6c)状态之间切换,如下所示 切换不会影响A或B

如果您只对单个文件感兴趣,还可以使用git checkout获取它的旧版本。例如,如果您只想查看旧提交中的hello.py文件,可以使用以下命令:

git checkout commit hello.py
同样,如果希望在主状态下看到hello.py,在97b4b6c commit中看到hello.py

           .             .
hello.py-A (master)    hello.py-B (97b4b6c)

git checkout 97b4b6c hello.py
将显示处于97b46c提交状态的hello.py文件。同样,您也可以通过执行以下操作,在主控状态下查看他的相同文件:

git checkout master hello.py
请记住,与签出提交不同,这会影响项目的当前状态。旧文件版本将显示为“要提交的更改”,使您有机会恢复到文件的以前版本。如果您决定不保留旧版本,可以使用以下内容查看最新版本

摘要:

git check <commit>
git检查
将带您进入特定的提交状态,并且

git checkout <some file>
git签出
然而,git checkout和git之间的重要区别 签出是,
git签出
不会影响 项目的当前状态,但git checkout将 肯定会影响您当前的项目状态

还将带您访问其特定文件的旧版本


所以,git checkout是一个命令,它基本上是将您带到某个状态。它可以通过提交名称或文件名来实现这一点

Git的文档显然还有一些不足之处

上面的答案中有一个关键点,那就是如果您要求
git checkout
从特定的修订版获取特定的文件,这将产生比您预期的更大的影响

背景 这里您需要知道的是,在签出文件时,有三件事是您感兴趣的:

  • 存储库本身
  • 你的工作树
  • git称之为“索引”或“临时区域”的东西
还有第四项,即当前分支,
git checkout
也会影响它,但这一部分一开始是显而易见的。最终,它变得有点不那么清晰,以通常的git方式。:-)我过一会儿再谈

当使用
git checkout
来“及时返回”到较早的提交时,很明显这会影响您的工作树。除非git实际提取了早期版本的
README.txt
,否则无法查看早期版本的
README.txt
。因此,
git checkout
当然会影响工作树

然而,存储库本身,即曾经提交过的每个文件的每个版本的集合,加上所有提交本身,实际上都不受影响,因此这里可以合理地说存储库是只读的。(事实上,更改内容、添加新提交的操作大多只是添加到存储库中。一旦内容被
git提交
-ed,很难让git忘记任何内容。即使是看起来删除内容的操作,例如在交互式重新基站期间删除提交,实际上也只会添加内容。但这是另一个时间。)

使用git签出

现在,这是它变得有点奇怪的地方:
git checkout
在我看来,实际上是大约两到五个完全不同(尽管相关)的命令,所有这些命令都压缩成一个
git checkout
命令。确切的数字取决于你想把它们分开的程度(我想说,我自己至少应该把它们分成两部分):

  • 签出一个特定分支,例如,
    git签出主机
    git签出功能
  • 签出一个旧的提交,这样您就根本不在分支上了:例如,
    git checkout afe3ca9
    ,或者
    git checkout v1.2
    where
    $ git checkout master README.txt