从中央仓库创建本地分支的标准方法是什么?

时间:2016-10-19 15:39:19

标签: git git-branch git-checkout

假设中央仓库有masterbranch_Abranch_B。 在我当地的工作空间中,我只有masterbranch_A

我希望以干净的方式在我的工作空间中获得本地分支branch_B

即。我想从中央回购的branch_B获得相同的内容,而不是别的。

我认为git checkout -b my_name/branch_B会这样做。 然而,当我这样做时,我遇到了很多冲突,我不知道为什么。

我不想手动解决冲突。我想要的只是从中央回购的branch_B获得相同的确切内容而不是其他内容(例如,如果有的话,丢弃任何本地更改)

3 个答案:

答案 0 :(得分:3)

即使git checkout branch_B不存在,您想要的只是branch_B 。事实上,它不存在至关重要,否则git checkout无法创建它。

在您使用它之前,请花点时间考虑一下:您并不是真的"从中央回购创建分支"一点都不您无法:您只能在您自己的存储库上运行。

这看起来似乎是一种没有区别的区别,但对于从Git怪异的众多内容中找出任何意义至关重要。 您所做的一切,您在您自己的存储库中执行此操作。

(有一点是异常 - 但不是真的 - git push。在这里,你把你已经做过的事情带到你自己的存储库中,然后把它们提供给另一个Git ,自己的存储库,然后根据您提供的内容请求它为存储库执行操作。它由 < / em> Git做这些事情,到自己的存储库。)

集中存储库

在处理中央存储库时,从获取内容的方式是使用git fetchfetch命令调用他们的Git并从他们那里请求他们的分支名称和其他此类引用的列表,这将为您的Git提供他们的分支提示ID(SHA-1哈希)。然后,您的Git通过哈希ID和任何其他对象(文件,或技术上的&#34; blob&#34; ,树对象,早期提交及其树和blob,以及带注释)请求任何提交对象-tag objects)需要完成获取。然后你的Git将所有这些对象放在你的存储库中,作为最后一步,将所有分支名称重命名为你的Git保证不会与任何新名称冲突的新名称您的分行名称。

Git从其名称中合成的新名称是远程跟踪分支origin/master等)。这些由git fetch创建和更新。如果您使用--prune或将修剪设置为默认设置,则git fetch操作将从您的存储库中删除任何不再具有相应的远程跟踪分支名称其他Git的常规分支。 (这有时很有用,但不是默认值,可能是出于历史原因加上&#34;只有在其他回购&#34;方面有很多分支创建和删除时才有用。)

origin的{​​{1}}部分只是远程的名称。事实上,遥控器只是一个名称origin/master,因为它是由origin创建的默认名称 - 您的Git会在其下存储用于git clone的网址。这些远程跟踪分支的名称是通过将远程名称放在远程分支名称前面构建的:因此git fetch变为masterorigin/master变为{ {1}},等等。

为什么branch_A创建分支

你想要的长命令是:

origin/branch_A

(假设您的其他中央存储库已在git checkout下归档)。 git checkout -b branch_B --track origin/branch_B 在这里意味着&#34;创建一个分支&#34;,origin意味着:&#34;我将提供另一个我想要你的名字,我的Git,在我的存储库中查找以查找提交哈希ID。当我这样做时,我也希望你在制作分支后做同等级的-b。&#34;当然,最后,--track是(已存在的)远程跟踪分支的名称。

这很常用,所以Git人决定让git branch --set-upstream-to更加聪明:如果你要求Git按名称检查一个分支,它没有&#39;存在,origin/branch_B在远程跟踪分支名称剥离远程后,查看是否存在具有相同名称的远程跟踪分支。 (哇!)也就是说,如果你git checkout,你的Git会查看是git checkout还是git checkout sneeze或其他什么。

如果只有一个这样的远程跟踪分支,则然后 origin/sneeze被指示创建本地分支,使用远程跟踪分支的当前哈希ID作为起点。

但是快捷方式必须完全拼写

请注意,upstream/sneeze不会从git checkout开始制作新的git checkout -b branch_B。它只是从当前提交开始创建一个新的branch_B。新分支也设置为跟踪任何远程跟踪分支。这是因为origin/branch_B告诉branch_B立即创建分支,以便它永远不会触发&#34;嘿,等等,我没有现有的-b ..也许我应该运行一些自动特殊情况代码?&#34;代码。

当然,要使特殊情况代码起作用,您必须在存储库中拥有 git checkout。它不会在集中式存储库中找到它并找到它。只有branch_B会这样做 - 它只是origin/branch_Bgit fetch实际调用另一个Git,使用隐藏在远程名称下的网址。

(事实上,git fetch有时也会调用另一个Git,但那是其他SO问题。)

答案 1 :(得分:0)

你需要执行:

func stopTimerTest() {
    timerTest = nil
}

&#34;来源&#34;是远程存储库的默认名称。要知道正确的名称执行:

git checkout -b branch_B origin/branch_B

答案 2 :(得分:0)

首先git fetch

git fetch之后,您的本地仓库应该从中央仓库获取所有分支,通常称为origin

这将创建一个名为origin/branch_B的本地远程跟踪分支:

$ git fetch
 * [new branch]      branch_B -> origin/branch_B

此远程跟踪分支origin/branch_B跟踪您的仓库中的 从中央仓库获取的最新更改。

你不应该承诺,所以你需要创建一个实际的分支来处理。

然后git checkout branch_B

然后,只需git checkout branch_B创建一个自动跟踪branch_B的本地origin/branch_B

$ git checkout branch_B
Branch branch_B set up to track remote branch branch_B from origin.
Switched to a new branch 'branch_B'

如果要列出本地和远程分支,可以使用git branch -va