【问题标题】:How to create a branch in git basing it on a remote branch [duplicate]如何基于远程分支在git中创建分支[重复]
【发布时间】:2016-05-06 20:10:36
【问题描述】:

远程仓库有一个本地仓库不存在的分支。我需要获取它并开始使用它,而无需将它与我拥有的任何其他分支合并。我该怎么做?

【问题讨论】:

    标签: git


    【解决方案1】:

    TL;DR 版本

    git fetch <em>remote</em>; git checkout <em>branch</em>

    历史

    git 的设计者似乎故意混淆了,但实际上混淆是由于 git 所走的进化路径。

    在过去(在 git 版本 1.5 之前),您只是直接从另一个存储库中获取分支,每次都输入存储库的完整 URL。正如您可能想象的那样,一直在输入长存储库路径很快就会过时。有一堆中间解决方案,然后有人提出了 remote 的想法:一个像 origin 这样的短名称,您可以使用它来存储您可能想知道的关于其他 git 存储库的所有信息。

    与远程一起出现的远程跟踪分支。这里的想法是,如果你的 git 通过互联网电话调用另一个 git 并花一些时间与它聊天并检索一大堆新东西,那么在你自己的存储库中藏起一个 每个他们提供给你的分支以及那些提交。这些是您的远程跟踪分支:origin/masterorigin/develop 等等。

    每当您运行 git fetch origin 时,您的 git 都会调用他们的 git,获取他们提供的任何新提交,并以 origin/<em>branch</em> 松鼠所有他们的分支。如果您以前没有,现在就拥有。

    检查远程跟踪分支

    现在,您可以签出远程跟踪分支,但不能on远程跟踪分支:

    $ git checkout origin/develop
    

    就像找到origin/develop的提交ID一样:

    $ git rev-parse origin/develop
    39d22b9678b8c571aab6902620c95907d5bef2db
    

    然后将其交给git checkout:

    $ git checkout 39d22b9678b8c571aab6902620c95907d5bef2db
    Note: checking out '39d22b9678b8c571aab6902620c95907d5bef2db'.
    
    You are in 'detached HEAD' state. ...
    

    (唯一的区别是 git 可以使用名称 origin/develop,如果您将其交给 git checkout,您仍然会收到“分离的 HEAD”消息。)

    创建本地分支

    git checkout -b <em>branch</em> 将创建一个新的本地分支,并从当前提交开始。这很好,但这意味着您必须先检查远程跟踪分支。或者,您可以告诉git checkout -b 从哪里开始新分支。但是你也应该设置它来跟踪(正如 git 所说)另一个分支,这将我们带到:

    从远程跟踪分支创建本地分支

    现在,棘手的一点是,一旦您拥有 origin/develop(或其他一些 origin/ 限定的分支名称),您就可以使用相同的名称 git checkout 一个常规的、普通的本地分支,即使您没有还没有。 Git 会注意到 develop 不是(还)一个分支名称,所以它会扫描你所有的远程跟踪分支并发现有一个匹配的名称——在这种情况下是origin/develop——并假设你的意思是“请创建一个新的develop 并使其跟踪origin/develop,以便它最初以origin/develop 指向的相同 提交开始”。

    (这是一个很常见的需求,以至于 git 人员在 git 版本 1.6.6 中添加了它。)

    等等,一个本地分支跟踪一个远程跟踪分支?

    是的。

    但是为什么它不是本地跟踪分支呢?

    “本地”、“远程”和“跟踪”这些词已经出现太多次了,更不用说the multiple meanings of the word "branch"了。你想要一个本地跟踪分支来跟踪一个远程跟踪分支吗?如果您的本地分支跟踪另一个 本地 分支会怎样? :-)(是的,git 可以做到。)

    说真的,这个术语有点奇怪。就这样长出来了。

    其他一些事情

    git branch 命令有--set-upstream-to--unset-upstream。这些默认在当前分支上运行,如果您指定一个,则在本地分支上运行,并设置本地分支要跟踪的 other 分支的名称(对于--set-upstream-to),或者停止本地分支跟踪它设置为跟踪的任何内容(对于--unset-upstream)。这些使用单词“upstream”而不是短语remote-tracking branch,这是合理的,因为您可以将上游设置为另一个本地分支。这就是您跟踪另一个分支的方式(无论它是否是远程跟踪分支)。

    让本地分支跟踪其他分支有什么好处?为什么要打扰?

    它让git rebasegit merge 知道要基于什么进行rebase 或合并,这样您就不必再次输入;它让git status 计算您在本地分支上的提交,而另一个分支没有(例如ahead 3)和/或他们有您没有的提交(例如,behind 12)。换句话说,这只是为了方便。 不过很方便。味道很好而且对你有好处!

    【讨论】:

      【解决方案2】:

      您只需输入:

      git fetch <remote>
      

      从远程获取所有参考,

      git checkout <remote>/<branch>
      

      让您将远程分支签出到“匿名”分支,

      git checkout -b <new_local_branch>
      

      根据您签出的远程分支创建一个本地分支。

      您也可以将远程分支设置为上游:

      git branch --set-upstream-to=<remote/branch> <new_local_branch>
      

      【讨论】:

      • 这不是一个真正的匿名分支。毕竟你把它叫做什么。它实际上是一个远程跟踪分支。
      • 使用 git checkout / 签出远程分支后,我猜我在一个未命名的“匿名”分支上。
      • 在检查了我们的远程/分支后,您处于分离状态。这一般来说没什么用
      【解决方案3】:

      我找到了办法。这个命令可以做到:

      git fetch remote branch_name:branch_name
      

      【讨论】:

      • 这完成了大部分工作,但生成的本地分支没有跟踪远程跟踪分支。通常,执行此操作的方法是git fetch &lt;remote&gt;,后跟git checkout &lt;branch&gt;。我会添加一个答案。
      【解决方案4】:

      我不是git 专家,但我想你可以切换到所需的分支,拉取它,然后从中创建新分支。
      换句话说:

      git checkout remote_branch
      git pull
      git checkout -b new_branch
      

      要获取远程分支,您可以使用:

      git fetch remote_name
      

      其中remote_name是正在使用的remote的名称,例如origin

      【讨论】:

      • 如何结帐到本地尚不存在的分支?
      【解决方案5】:

      这个Git checkout -b new_branch 创建了一个名为“new_branch”的新分支

      git pull origin remote_branch 将代码从 remote_branch 拉到 new_branch

      git checkout -b new_branch
      git pull origin remote_branch
      

      你也可以试试

      git checkout -b <branch> --track <remote>/<branch>
      

      referance

      【讨论】:

        猜你喜欢
        • 2015-02-25
        • 1970-01-01
        • 2015-03-30
        • 2016-02-06
        • 1970-01-01
        • 2019-08-14
        • 2013-12-14
        • 2013-12-13
        • 2011-01-17
        相关资源
        最近更新 更多