如何在git中克隆之前选择一个特定的分支并合并

时间:2014-07-31 12:01:41

标签: git svn version-control merge

我在网上有一个repo,我不再使用master分支,所以我创建了一个名为dev-test的分支并将我所有的本地repo推送到这个分支,但现在在我的VPS中,我安装了git并需要dev-test分支。所以,我一直在努力只获得这个分支,但它看起来有点复杂。

除非您先下载主程序,否则似乎无法选择特定分支。

我做了git clone https://foo@bitbucket.org/foo/repo.name.git

这会克隆repo.name源,但只会克隆主分支。然后我尝试将分支更改为git checkout -b dev-test并执行git fetch dev-test但这似乎不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果没有额外的选项,git clone将克隆整个存储库。这包括复制其所有分支标签,但它们会被重命名,因为您可能希望或可能不希望它们的分支名称与您的分支名称匹配,或者更可能 - 您可能只想跟上一个或两个“他们的”分支。

完成后,作为最后一步,git clone执行git checkout将您置于您选择的分支上。那是哪个分支?答案是:“它取决于”,但通常,如果你没有在clone命令上选择一个分支,你告诉git检查分支master

此时您可以简单地git checkout dev-test切换到另一个分支;或者您可以将-b dev-test传递给git clone告诉它“结帐dev-test,而不是默认值”。在任何一种情况下,git都会查看它从远程克隆的分支标签(在git clone步骤中),并制作“跟踪”“远程跟踪分支”的新的本地分支标签。您可以使用git branchgit branch -r(或两者同时使用git branch -a)查看包含git fetch和“远程分支”的本地分支。请参阅以下内容。

origin命令不使用分支名称,而是使用远程名称。默认远程名称为git clone,这指的是您从中git fetch执行的存储库。使用git fetch origin(或git clone),您告诉您的git调用原始git checkout上使用的同一个远程站点,告诉它您现在拥有的内容,并要求它发送给您从那时起的任何新事物。


正如fpietka在several comments中指出的那样,你需要改变(或重建)你的git正在做的心理模型。使用-b 而不 git checkout zorg ,您要求git找到现有分支:

zorg

首先查找本地分支zorg,如果存在,则尝试切换到它。如果本地分支origin/zorg不存在,它将检查远程zorg。如果 存在,git将创建本地分支origin/zorg,指向与远程跟踪分支git checkout -b相同的提交。

通常,您将需要创建一个新的本地分支,该分支根本不存在,也可能永远不会存在。 (例如,如果你想尝试一些改变,但不打算让它们成为“生产质量”,你可以创建一些本地实验分支。)创建一个新的分支,它将从任何提交中增长现在,这个就是当你使用git checkout -b experiment-1

experiment-1

现在,新提交将增加一个名为git commit的新(仅限本地)分支。

每当你执行git status时,git:

  1. 查看您所在的分支(git branch告诉您,*将此分支标记为星号git add
  2. 使用当前的“索引”或“暂存区域”(请参阅​​-m)来确定此新提交中应包含的内容
  3. 使用您指定的提交消息(通常通过运行编辑器,或从commit f5f7ce02e16cf4fc038be2f04ac44623a7c2523c参数或其他任何方式)创建一个新提交,其中包含当前日期和时间以及您的git配置数据中的名称,以及最后
  4. 采用命名实际提交的大丑陋SHA-1 - 这些是git log中显示的dev-test - 并将SHA-1 ID存储在“当前分支”中,一个你从第1步开始。
  5. 这是使当前分支增长(并因此向前发展)的最后一步。

    如果您在dev-test分支上,则每次进行更改时,git add都会增加新提交,然后git commitorigin/


    所有这些活动仅在您的存储库中发生,而不是在其他人的存储库中。同时,如果您克隆了其他人的存储库,那么他们(无论他们是谁)正在进行自己的活动,并在{{1}中创建他们的本地分支 - 这是您的“远程”分支机构的可能性很大。 - 向前移动。你(和你的git)无法知道他们是否以及什么时候做的事情。你所能做的就是在某个时候问“嗯......我不知道他们在做什么?”

    这是您运行git fetch时的情况。 你的 git调用他们的 git并说:“嘿,我从你那里复制了分支dev-test,最后我知道它是f5f7ce02e16cf4fc038be2f04ac44623a7c2523c,是什么现在好吗?“他们的git说现在是什么,你的git和他们的git弄清楚他们从那以后做了什么。您的git会带来所有这些更改 - 但它不会,而应该不会更改您的 dev-test。你可能在那里做了很多东西!

    所以,你的 git会根据他们的 git在他们的 origin/dev-test中的内容来更新你的dev-test。这是git处理克隆存储库中的分支命名的方式。

    此时,如果你已经完成了工作他们已经完成了工作,你可能会想要合并或重新组合你的工作来整合他们的工作,或者说服他们这样做。但这是另一个话题,对于以后(或Pro Git book)。