2013-03-08 106 views
69

什么是git中的checkoutgit checkout的真正含义是什么?

我知道一旦你做checkout到一个特定的分支,HEAD指向该分支。但它的真正含义是什么?这是否意味着我可以在那个分支上工作?如果是的话,那么,如果没有检查分支机构,我无法处理它?

另外,remote checkout是什么意思?它有什么用处?

+1

没有采取。是的,我已经了解了它的含义。即指向头等,但我想知道从“结账代码 - 进行更改 - 检查”的角度来看还是不同? – daehaai 2013-03-08 14:42:19

+0

投票下来...请发表一些意见!!不要说你没有看到答案。我在寻找更多的细节信息。 – daehaai 2013-03-08 15:20:23

+18

@antonijn - 我试着用Google搜索这个问题 - 这是第一个结果 - 有种悲伤,一旦我到达这里,我看到问题已经关闭,每个人都有这种疯狂的态度 - 我来自TFS背景,我开始怀疑“Checkout”意味着GIT中完全不同的东西。我想知道它在git-land中的含义。 – BrainSlugs83 2014-08-31 01:57:24

回答

36

正如您所注意到的,HEAD是一个标签,注明您在提交树中的位置。当你从一个提交移动到另一个提交时,它随你移动。 git checkout <commit>是在提交树中移动的基本机制,将您的焦点(HEAD)移动到指定的提交。

的提交可以通过任何多种方式来指定,提交散列,分行名称,标签名,相对语法(HEAD^HEAD~1,等)等。将结账视为改变分支通常是有用的,并且从这个角度来看有一些选项可行,但它们都参考提交。

要结帐一个提交有一些副作用,除了移动HEAD左右。

  • 工作目录更新为检出提交的状态。
  • 如果指定了分支名称,则checkout使该分支活动。活动分支将随着所添加的任何新提交一起移动。
    • -b选项将根据当前提交创建一个新分支,然后使其生效。
    • --track选项签出的分支,可以意识到一个远程分支
    • --orphan选择一个新的分支创建(像-b),但不会基于任何现有的承诺。

有一些更多的选择,你可以在git checkout man-page了解,所有这些都围绕着从一个移动提交到另一个 - 只是在什么样的影响不同的是此举除了感动HEAD

+0

所以,听起来像“结账”确实意味着完全不同的东西(与TFS相比 - 无论如何 - TFS相当于“得到”一个特定的“变更集”)。很高兴我看了这个! - “最新”有没有魔术常数? (在TFS中它是“T”) - 这样我们可以在不知道“HEAD”标签的情况下下载最新版本的代码? – BrainSlugs83 2014-08-31 02:03:30

+1

如果你在分支上,分支名称是该分支的最新提交 - 如果你不在分支上,那么你正在进行最新的提交。我会使用log命令在资源库中查找最近的提交,而不考虑分支,然后手动移动到它 - 但我确定它可以根据需要自动执行。 – 2014-09-03 13:26:40

+0

关于最后一段:请注意'git checkout '不会切换分支。 – galath 2015-07-09 12:07:40

13

“检出”表示您从存储库中获取任何给定的提交,并在工作目录中重新创建关联文件和目录树的状态。

当您签出的提交是一个分支头(例如git checkout HEAD~2),你是在一个所谓的分离头。你可以在这里创建提交,但是一旦你切换到不同的分支,那些提交将不能被分支名称恢复,甚至可能在一段时间后被垃圾收集器删除。

7

让我解释一些使用文件,文件夹和分支结帐的使用情况,以便它可以帮助理解。

假设我们有一个名为devindex.html的文件夹,一切都被跟踪并且工作目录是干净的。

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

现在,如果我在dev文件夹中进行了一些更改,并且想要恢复该文件夹。我可以使用git checkout dev,但是如果已经有一个名为dev的分支,而不是检查该文件夹,它将拉下该分支。为了避免这种情况,我宁愿做git checkout -- dev

现在,这里裸露双横条站当前分支,并要求git从当前选定的分支文件夹dev

同样如果我做git checkout alpha dev它会从alpha分支下拉开发文件夹。

这个答案是针对你的第一个问题'git checkout really mean'。

相关问题