git checkout真正意味着什么?

时间:2013-03-08 14:38:08

标签: git git-checkout

git中checkout是什么?

我知道,一旦你checkout到某个特定分支,HEAD指向该分支。但这究竟意味着什么?这是否意味着我可以在那个分支上工作?如果是,那么,如果没有检查分支,我就无法继续工作了吗?

此外,remote checkout是什么意思?它有用吗?

3 个答案:

答案 0 :(得分:46)

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

可以通过多种方式指定提交,提交哈希,分支名称,标记名称,相对语法(HEAD^HEAD~1等)等等。将checkout视为更改分支通常很有用,并且有一些选项可以从这个角度工作,但它们都引用了提交。

除了移动HEAD之外,检查提交还有一些副作用。

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

还有一些选项,您可以在git checkout man-page中阅读,所有选项都围绕从一个提交转移到另一个提交 - 只是改变移动除了移动{{{ 1}}。

答案 1 :(得分:18)

&#34;退房&#34;表示您从存储库中获取任何给定的提交,并在工作目录中重新创建关联文件和目录树的状态。

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

答案 2 :(得分:17)

让我解释一下结帐的一些用例,包括文件,文件夹和分支,以便它可以帮助理解。

假设我们有一个名为devindex.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确实意味着&#39;。