git checkout到底是什么意思?


93

checkoutgit 中的s是什么?

我知道一旦您checkout对特定分支进行操作,就HEAD指向该分支。但这到底是什么意思?这是否意味着我可以在那个分支上工作?如果是,那么,在不签出分支的情况下,我无法进行处理吗?

还有,这remote checkout是什么意思?有什么用?


1
没有采取。是的,我有,并且我了解了其含义的理论。即指向HEAD等。但是我想从“签出代码-进行更改-签入”的角度知道还是不同?
daehaai 2013年

24
@antonijn-我已经尝试搜索这个问题-这是第一个结果-有点可悲的是,一旦我来到这里,我看到问题已经解决,每个人都有这种疯狂的态度-我来自TFS背景,开始怀疑“结帐”在GIT中的含义完全不同。我想知道这对git-land 意味着什么。
BrainSlugs83 2014年

Answers:


56

如您所述,HEAD是一个标签,用于指示您在提交树中的位置。当您从一个提交移至另一个提交时,它会与您一​​起移动。 git checkout <commit>是在提交树中移动,将焦点(HEAD)移至指定提交的基本机制。

提交可以通过任何多种方式来指定,提交散列,分行名称,标签名称,相对语法(HEAD^HEAD~1等)等。通常认为将签出更改为分支是很有用的,从该角度来看,有一些选项可行,但是它们都引用提交。

签出提交除了HEAD四处走动以外还具有一些副作用。

  • 工作目录将更新为检出提交的状态。
  • 如果指定了分支名称,则检出将使该分支处于活动状态。活动分支将随添加的所有新提交一起移动。
    • -b选择该选项后,将基于当前提交创建一个新分支,然后将其激活。
    • 使用该--track选项,可以使检出的分支知道远程分支
    • 如果有此--orphan选项,则会创建一个新分支(如-b),但不会基于任何现有提交。

还有更多选项,您可以在git checkout手册页中阅读这些选项,所有这些选项都围绕着从一个提交移动到另一个提交-除了move之外,该移动还有什么作用HEAD


因此,听起来“结帐”确实意味着完全不同的东西(无论如何,与TFS相比-TFS等效项是“获取”特定的“变更集”)。很高兴我查了一下!-是否有“最新”的魔术常数?(在TFS中为“ T”)-这样我们就可以下载最新版本的代码而无需知道“ HEAD”标签了吗?
BrainSlugs83 2014年

1
如果您在分支上,则分支名称是该分支的最新提交;如果您不在分支上,则使用最新提交。我将使用log命令在不考虑分支的情况下找到存储库中的最新提交,然后手动将其移至它-但我确信如果需要的话,它可以自动化。
David Culp 2014年

关于最后一段:请注意git checkout <commit> <path>不要切换分支。
galath

您的解释没有错,但您忘记了一个非常重要(且可能很危险)的用例:git checkout <path>
埃里克·杜米尼尔

24

让我解释一下使用文件,文件夹和分支进行签出的一些用例,以便对理解有所帮助。

假设我们有一个名为的文件夹,dev并且index.html还跟踪了所有内容,并且工作目录很干净。

如果我不小心更改了文件名,index.html并且想要撤消该操作,那么我将简单地使用git checkout index.html它,它将从存储库当前选定的分支中恢复该文件状态。

现在,如果我在dev文件夹中做了一些更改并想要恢复它。我可以使用,git checkout dev但是如果已经命名了分支dev而不是检出该文件夹,它将拉低该分支该怎么办。为了避免这种情况,我宁愿这样做git checkout -- dev

现在,这里的双破折号代表当前分支,并向git询问dev当前选定分支中的文件夹。

同样,如果我这样做git checkout alpha dev,它将从alpha分支下拉dev文件夹。

这个答案是针对您的第一个问题“ git checkout的真正含义”。


2
在最后一行中,此答案是您的第一个问题“ git checkout的真正意思”。 您要从“平均值”分支中检出“真正”文件夹吗:P
Paramvir Singh Karwal '19

22

“签出”意味着您从存储库中获取任何给定的提交,然后在工作目录中重新创建关联文件和目录树的状态。

当您检出不是分支头的提交时(例如git checkout HEAD~2),您就处于所谓的分离头上。您可以在此处创建提交,但是一旦切换到其他分支,这些提交将无法通过分支名称进行恢复,并且一段时间后甚至可能被垃圾收集器删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.