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