我在网上有一个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
但这似乎不起作用。
有什么想法吗?
答案 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 branch
和git 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:
git branch
告诉您,*
将此分支标记为星号git add
)-m
)来确定此新提交中应包含的内容commit f5f7ce02e16cf4fc038be2f04ac44623a7c2523c
参数或其他任何方式)创建一个新提交,其中包含当前日期和时间以及您的git配置数据中的名称,以及最后git log
中显示的dev-test
- 并将SHA-1 ID存储在“当前分支”中,一个你从第1步开始。这是使当前分支增长(并因此向前发展)的最后一步。
如果您在dev-test
分支上,则每次进行更改时,git add
都会增加新提交,然后git commit
和origin/
。
所有这些活动仅在您的存储库中发生,而不是在其他人的存储库中。同时,如果您克隆了其他人的存储库,那么他们(无论他们是谁)正在进行自己的活动,并在{{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)。