如何基于远程分支在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/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

【讨论】:

以上是关于如何基于远程分支在git中创建分支[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地和远程创建新分支? GIT [重复]

git如何利用分支进行多人开发

Git 如何从特定的提交中创建一个新的分支

如何在 Git 中创建新的本地分支?

Git 如何从特定的提交中创建一个新的分支

更改 git 合并分支冲突消息 [重复]