【问题标题】:After cloning, do I have only one branch?克隆后,我只有一个分支吗?
【发布时间】:2019-01-19 21:03:42
【问题描述】:

我正在尝试了解我的以下情况:

我和其他人正在使用 Github 中的一个项目。我相信它除了 master 之外还有几个分支(特别是“develop”)

所以我使用git clone <url> 将项目克隆到我的计算机上 我得到了这个项目。我被告知我应该使用开发分支而不是使用主分支

所以我输入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

这里发生了什么黑暗魔法?它说开发被设置为从原点跟踪开发!所以在那个发展被隐藏之前?遥不可及?

在完成git log --oneline --decorate 之后,我可以看到 origin/develop 分支,但是这里发生了什么??

【问题讨论】:

  • git clone 为每个分支存储库创建远程跟踪分支。
  • 是的,如果您只想克隆一个分支,请查看this SO answer。
  • @Maroun 所以我必须使用git branch -a 来查看所有内容并结帐到我想使用的那个?
  • @KansaiRobot 是的。
  • @KansaiRobot 当您使用git branch -a 时,如果您的遥控器碰巧没有命名为origin,则遥控器将以remotes/originremotes/<somethingElse> 为前缀(毕竟这只是一个约定,即使很常用)。如果您想创建一个跟踪远程版本的本地版本,请不要git checkout remotes/origin/myBranch,而是git checkout myBranch

标签: git github git-branch git-clone


【解决方案1】:

是的,git clone 之后只有一个分支

事实上,就在git clone 结束之前,您没有个分支。

但“有一个分支”并不意味着那么多

Git 使用 分支名称 来记住特定的提交。每个名字都记得一个,而且只有一个,commit。每个提交都由其哈希 ID 唯一标识:一个大而丑陋的数字,例如 b7bd9486b055c3f967a870311e704e3bb0654e4f

提交本身会记住以前的提交(通过他们的大丑陋的哈希ID)。 Git 将此称为每个提交的 提交。这意味着像master 这样的名称只需要记住任何给定分支的last 提交。 Git 将此最终提交称为分支的 tip

这也意味着我们可以使用不同的、不完全分支的名称来记住一些 other Git 的分支!

进入远程跟踪分支

进行克隆涉及在内部运行git fetchgit fetch 从其他 Git 复制提交,git fetch 也复制它们的名称。他们的名字实际上是分支名称:这些记住他们的分支提示,例如masterdevelop。但它们不是你的分支提示提交——还没有! 您的Git 重命名这些,为origin/masterorigin/develop。您的 Git 的远程跟踪名称,带有 origin 前缀,记住他们的名字他们的提示提交。

运行git fetch 会更新您的远程跟踪名称,以便您知道他们的新分支提示提交是什么。当然,它也会首先获取他们拥有的任何提交,而你没有。

黑暗魔法

[develop突然出现:]这里发生了什么黑暗魔法?

当您运行 git checkout <em>name</em> 时,Git 会首先在您的分支名称列表中搜索 name。如果存在,Git 会尝试检查作为 your 分支 name 尖端的特定提交,并将其设为当前分支。到目前为止一切都很好——但是如果这个名字还不存在呢?

在这种情况下,git checkout 不仅会失败,还会搜索您的远程跟踪名称,例如 origin/masterorigin/develop。如果确实有一个与您要求的名称相似,那么您的 Git 现在创建您自己的分支名称,并将其设置为记住,作为 您的分支提示提交,相同的哈希 ID您的 Git 使用远程跟踪名称将其记住为 他们的 提示。

所以现在你有一个develop,现在 Git 可以检查它了!

事实上,这是git clone 的最后一步:这就是你最初获得master 的方式。从origin 复制提交并将其名称更改为origin/* 后,您的Git 运行git checkout master。你的 master 还不存在,所以你的 Git 从你的 origin/master 创建它,你的 Git 从他们的 master 创建。 (哇!这似乎是一个很长的路要走,确实如此,但最终一切都说得通!)

【讨论】:

  • @KansaiRobot,请阅读thisthis 以全面了解该主题。我会说阅读它推荐的整本书。但特别重要的是要理解所有 Git 存储库都是完全独立的和独立的, 任何存储库中的分支与任何其他存储库中的分支之间的所有“链接”都是完全是政策问题。
【解决方案2】:

简答

当您clone(然后当您fetch)时,您的本地版本的存储库会获取远程分支的更新定义,但不会自动创建本地对应项。如果您只是签出一个名称与远程分支之一匹配的(但本地不存在的)分支,git 会假定您需要跟踪该分支的远程版本。

试试git branch -a 看看一切。

有关更多信息,请参阅 torek 的非常完整的答案以了解其背后的详细信息。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2011-06-16
    • 2021-10-15
    • 2012-02-11
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多