为什么 git 在 git 克隆之后结帐?
Why git checkout after git clone?
我是 git 的新手。我了解 git 基础知识以及使用 git 的开发过程,但是有一件事让我感到困惑。
每当我必须从包含多个项目的 git 存储库中提取内容时 (example),我会看到这些说明步骤:
- git 克隆 xxx
- cd xxx
- 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
.
我是 git 的新手。我了解 git 基础知识以及使用 git 的开发过程,但是有一件事让我感到困惑。
每当我必须从包含多个项目的 git 存储库中提取内容时 (example),我会看到这些说明步骤:
- git 克隆 xxx
- cd xxx
- 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
.