如何基于远程分支在git中创建分支[重复]
Posted
技术标签:
【中文标题】如何基于远程分支在git中创建分支[重复]【英文标题】:How to create a branch in git basing it on a remote branch [duplicate] 【发布时间】:2016-05-06 20:10:36 【问题描述】:远程仓库有一个本地仓库不存在的分支。我需要获取它并开始使用它,而无需将它与我拥有的任何其他分支合并。我该怎么做?
【问题讨论】:
【参考方案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/master
、origin/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 rebase
和git 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我找到了办法。这个命令可以做到:
git fetch remote branch_name:branch_name
【讨论】:
这完成了大部分工作,但生成的本地分支没有跟踪远程跟踪分支。通常,执行此操作的方法是git fetch <remote>
,后跟git checkout <branch>
。我会添加一个答案。【参考方案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
【讨论】:
以上是关于如何基于远程分支在git中创建分支[重复]的主要内容,如果未能解决你的问题,请参考以下文章