克隆后,我只有一个分支吗?
After cloning, do I have only one branch?
我想了解我的以下情况:
Github 中有一个我和其他人正在使用的项目。我相信它除了 master 之外还有几个分支(特别是 "develop")
所以我用 git clone <url>
将项目克隆到我的电脑上
我得到了这个项目。我被告知我应该使用 develop 分支 而不是 和 master 分支
所以我键入 git branch
以查看那里有哪些分支,然后我得到了
$ git branch
* master
什么?开发分支在哪里?
尽管如此,我还是 git checkout develop
看!我现在在开发分支!我再次执行 git branch
,我可以看到
$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
$ git branch
* develop
master
这里发生了什么黑魔法??它说 develop 被设置为从 origin 开始跟踪 develop!那么在隐藏开发之前?遥不可及?
完成 git log --oneline --decorate
后,我可以看到 origin/develop 分支,但这里发生了什么??
简答
当您 clone
时(稍后当您 fetch
时),您的本地版本的 repo 会获取远程分支的更新定义,但不会自动创建本地副本。如果您只是签出名称与其中一个远程分支匹配的分支(但本地不存在),git 假设您需要跟踪相同的远程版本。
尝试 git branch -a
查看所有内容。
更多,请参阅 torek 的非常完整的答案以解开其背后的细节。
是的,在git clone
之后你只有一个b运行ch
事实上,就在 git clone
完成之前,您有 no b运行ches.
但是"having a branch"并没有那么多
Git 使用 b运行ch names 来记住特定的提交。每个名字记住一个,而且只有一个,commit。每个提交都由其哈希 ID 唯一标识:一个丑陋的大数字,如 b7bd9486b055c3f967a870311e704e3bb0654e4f
.
是提交本身记住了以前的提交(通过 他们的 又大又丑的哈希 ID)。 Git 将此称为每个提交的 parent 提交。这意味着像 master
这样的名称只需要记住任何给定 b运行ch 的 last 提交。 Git 将此最终提交称为 b运行ch 的 tip。
这也意味着我们可以使用一个不同的、不完全是 a-b运行ch 的名字来记住一些 other Git 的 b运行切!
进入远程跟踪b运行ch
在内部制作克隆涉及 运行宁 git fetch
。 git fetch
从其他 Git 复制了提交,git fetch
也复制了它们的 names。他们的名字实际上是 b运行ch 名字:这些记得 他们的 b运行ch 技巧,例如 master
和 develop
。但它们不是 your b运行ch 提示提交——还不是! 您的 Git 将这些重命名为origin/master
和origin/develop
。您的 Git 的 远程跟踪名称 带有 origin
前缀,请记住他们的名称 和 他们的提示提交。
运行 git fetch
更新您的远程跟踪名称,以便您了解他们的新 b运行ch 提示提交是什么。当然,它也会首先获得他们拥有的任何提交,而你没有。
黑魔法
[develop
suddenly appears:] what dark magic is happening here?
当您 运行 git checkout <em>name</em>
时,Git 首先搜索您的name
的 b运行ch 名称列表。如果存在,Git 会尝试检查 your b运行ch name
[ 的特定提交=92=],并将其设为当前 b运行ch。到目前为止还不错——但是如果 这个名字还不存在怎么办?
在这种情况下,git checkout
会搜索您的 远程跟踪名称,例如 origin/master
和 origin/develop
,而不仅仅是失败。如果恰好有一个与您要求的名称相似的名称,您的 Git 现在 创建 您自己的 b运行ch 名称,将其设置为记住,如 your b运行ch tip 提交,你的 Git 记住的哈希 ID 与 their tip 相同,使用远程跟踪名字.
所以现在你有一个 develop
现在 Git 可以检查它了!
事实上,这是 git clone
的最后一步:这是您最初获得 master
的方式。从 origin
复制提交并将其名称更改为 origin/*
后,您的 Git 运行 git checkout master
。你的 master
还不存在,所以你的 Git 从你的 origin/master
创建了它,而你的 Git 从他们的 master
创建了它。 (哎呀!这似乎是个漫长的过程,确实如此,但最终一切都变得有意义了!)
我想了解我的以下情况:
Github 中有一个我和其他人正在使用的项目。我相信它除了 master 之外还有几个分支(特别是 "develop")
所以我用 git clone <url>
将项目克隆到我的电脑上
我得到了这个项目。我被告知我应该使用 develop 分支 而不是 和 master 分支
所以我键入 git branch
以查看那里有哪些分支,然后我得到了
$ git branch
* master
什么?开发分支在哪里?
尽管如此,我还是 git checkout develop
看!我现在在开发分支!我再次执行 git branch
,我可以看到
$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
$ git branch
* develop
master
这里发生了什么黑魔法??它说 develop 被设置为从 origin 开始跟踪 develop!那么在隐藏开发之前?遥不可及?
完成 git log --oneline --decorate
后,我可以看到 origin/develop 分支,但这里发生了什么??
简答
当您 clone
时(稍后当您 fetch
时),您的本地版本的 repo 会获取远程分支的更新定义,但不会自动创建本地副本。如果您只是签出名称与其中一个远程分支匹配的分支(但本地不存在),git 假设您需要跟踪相同的远程版本。
尝试 git branch -a
查看所有内容。
更多,请参阅 torek 的非常完整的答案以解开其背后的细节。
是的,在git clone
之后你只有一个b运行ch
事实上,就在 git clone
完成之前,您有 no b运行ches.
但是"having a branch"并没有那么多
Git 使用 b运行ch names 来记住特定的提交。每个名字记住一个,而且只有一个,commit。每个提交都由其哈希 ID 唯一标识:一个丑陋的大数字,如 b7bd9486b055c3f967a870311e704e3bb0654e4f
.
是提交本身记住了以前的提交(通过 他们的 又大又丑的哈希 ID)。 Git 将此称为每个提交的 parent 提交。这意味着像 master
这样的名称只需要记住任何给定 b运行ch 的 last 提交。 Git 将此最终提交称为 b运行ch 的 tip。
这也意味着我们可以使用一个不同的、不完全是 a-b运行ch 的名字来记住一些 other Git 的 b运行切!
进入远程跟踪b运行ch
在内部制作克隆涉及 运行宁 git fetch
。 git fetch
从其他 Git 复制了提交,git fetch
也复制了它们的 names。他们的名字实际上是 b运行ch 名字:这些记得 他们的 b运行ch 技巧,例如 master
和 develop
。但它们不是 your b运行ch 提示提交——还不是! 您的 Git 将这些重命名为origin/master
和origin/develop
。您的 Git 的 远程跟踪名称 带有 origin
前缀,请记住他们的名称 和 他们的提示提交。
运行 git fetch
更新您的远程跟踪名称,以便您了解他们的新 b运行ch 提示提交是什么。当然,它也会首先获得他们拥有的任何提交,而你没有。
黑魔法
[
develop
suddenly appears:] what dark magic is happening here?
当您 运行 git checkout <em>name</em>
时,Git 首先搜索您的name
的 b运行ch 名称列表。如果存在,Git 会尝试检查 your b运行ch name
[ 的特定提交=92=],并将其设为当前 b运行ch。到目前为止还不错——但是如果 这个名字还不存在怎么办?
在这种情况下,git checkout
会搜索您的 远程跟踪名称,例如 origin/master
和 origin/develop
,而不仅仅是失败。如果恰好有一个与您要求的名称相似的名称,您的 Git 现在 创建 您自己的 b运行ch 名称,将其设置为记住,如 your b运行ch tip 提交,你的 Git 记住的哈希 ID 与 their tip 相同,使用远程跟踪名字.
所以现在你有一个 develop
现在 Git 可以检查它了!
事实上,这是 git clone
的最后一步:这是您最初获得 master
的方式。从 origin
复制提交并将其名称更改为 origin/*
后,您的 Git 运行 git checkout master
。你的 master
还不存在,所以你的 Git 从你的 origin/master
创建了它,而你的 Git 从他们的 master
创建了它。 (哎呀!这似乎是个漫长的过程,确实如此,但最终一切都变得有意义了!)