为什么 git 在 git 克隆之后结帐?

Why git checkout after git clone?

我是 git 的新手。我了解 git 基础知识以及使用 git 的开发过程,但是有一件事让我感到困惑。

每当我必须从包含多个项目的 git 存储库中提取内容时 (example),我会看到这些说明步骤:

  1. git 克隆 xxx
  2. cd xxx
  3. git 结帐 yyy

这让我有点费解。由于我已经拥有整个存储库,如果我可以只复制文件夹并随心所欲地使用它,为什么我要签出我感兴趣的项目?

前两个步骤只是告诉您 git clone,这将克隆到某个文件夹,然后 cd 到该文件夹​​。仅当您 不想 开始使用该存储库的 master 或默认分支时,才需要执行第三步。通常,在 git 克隆之后,默认选择 master 分支。因此,如果您的指示要求您在其他 yyy 分支上工作,那么第三步就有意义了。

运行 git checkout yyy 将自动创建一个名为 yyy 的本地分支 如果 在您的仓库中有一个同名的跟踪分支.在这种情况下,它也会切换到新创建的本地分支。

注意:我是作为评论开始的,但它足够长,而且真的可以使用一些格式,所以我把它移到了一个答案中。这是对您对 Tim Beigeleisen 的评论的回复:

If you refer to my example link, checking out "stereo_image_proc" works but I can't see it being one of the branches, how come?

git checkout stereo_image_proc 没有抱怨的原因(乍一看似乎什么也没做)是 git checkout 本身实际上是两个 不同的 命令合二为一。在某些人(包括我的)看来,这是一个特性或错误特性:git checkout 的参数可以是 分支名称 ,或 路径名称.

具体来说:

  • git结帐<em>分支</em>要求Git切换到,有时甚至创建并切换到您在命令行中提供其名称的分支。

    切换到 一个分支是一个非常复杂的过程,最后,但它开始很简单:它改变了 Git 的 [=13] 概念=] 这样你就在命名的分支上。它还有另一个非常有用的功能:在Git实际切换到(and/or创建)这个分支之前,Git确保这不会破坏您不小心在 错误的 分支上开始的任何工作。

  • git checkout <em>name1 name2 ... nameN</em>,另一方面,询问 Git 从一些 命名或暗示的提交 中提取 特定文件 。这通常最好写成 git checkout -- <em>file</em>,其中 -- 告诉 Git名称 不应 被视为 分支 名称。也就是说,假设您有一个名为 master 文件 并且您想要提取它:那么 git checkout master 将不起作用,因为那是 分支 命名为 master,但您想要 文件 命名为 master。所以git checkout -- master告诉Git:不是分支,是文件。

    当你使用这种git checkout时,你是在告诉Git:我知道我开始编辑一些文件,但我现在决定编辑这个文件,或所有这些文件,是一个错误。将它们全部恢复原样,将它们恢复为每个文件的先前版本。 例如,假设您有一个名为 README.txt 的文件并且您开始编辑它然后意识到您应该正在创建一个 new 文档文件。您将添加的新内容复制到新文件中,但现在您希望 README.txt 回到开始编辑之前的状态。所以你 运行 git checkout README.txt,然后 擦除你对文件的更改

    但就 Git 而言,在此处命名 目录 (或文件夹,如果您更喜欢该术语)意味着 中的每个文件目录,递归地包括任何子目录。由于 stereo_image_proc 是目录,而不是分支名称,因此您将获得 git checkout.

  • 的第二种形式

底线是 git checkout stereo_image_proc 告诉 Git 清除您对该目录 中的任何文件所做的任何更改。如果您没有进行任何更改,那么,没问题!但如果你有,这可能是非常灾难性的。

因为git checkout 确实有这两种模式——安全的switch branches模式,和不安全的破坏我所有的工作 模式——你必须记下你正在调用哪个模式,每次你 运行 git checkout.