我克隆了一个git repo并使用git checkout -b A创建了一个分支A.之后,我做了一些更改并在分支A中提交并使用
将其推送到远程分支 git push -u origin/A
与此同时,我删除了我当地的工作区。现在我必须在A中进行更改。所以我再次克隆了回购。现在我有两个分支来源/ A和A. 我应该
git checkout A
(or)
git checkout -b branchname origin/A
问题: 1)为什么两个同名的分支都相同?
答案 0 :(得分:1)
origin / A是远程,A是您的本地,因此如果远程或本地不是最新的,它们可以是不同的。但是你不需要再次克隆来获得分支,你只需要做git fetch --all
答案 1 :(得分:1)
在这里选择 branch 这个词可能很糟糕。您可能会说它是参考点:它是对提交图中提交的引用。
原因是origin
分布式:每个对等方都存储提交图的(部分)。无法保证您机器上的图形与远程计算机上的图形(master abc----ghi---mno
\ \
\ \
A def----jkl
)完全相同,也不能保证在项目上协作的朋友的机器上也是如此。
例如,本地图可能如下所示:
master
这意味着有两个指针mno
指向A
,jkl
指向master abc----ghi---mno
\
\
A def
。现在遥控器最近无法更新,只包含:
xyz
另一位开发人员也可能在遥控器中创建了贡献master abc----ghi---mno
\
\
A def---xyz
,从而产生了一个图表:
master abc----ghi---mno
\ \
\ \
A def----jkl
\
\
origin/A xyz
在这种情况下,联盟看起来像:
origin/A
在这种情况下,def
指向A
,jkl
指向git checkout
。
如果遥控器与本地存储库完全同步,那么两者都是相同的。
checkout A
表示您正在设置活动分支,这意味着项目的活动状态现在切换到引用指向的位置。如果这样做jkl
,系统将修改文件,使其看起来像存储在提交jkl
中的状态,此外git checkout -b B A
将被标记为"当前"状态。
如果您要运行origin/A
(请注意,而不是A
)。您只需创建一个新分支。从现在开始,B
和jkl
都指向master abc----ghi---mno
\ \
\ \
def----jkl
/ |
<A> |
/
<B>
。因此:
git checkout -b B A
如果您运行origin
:并且如master abc----ghi---mno
\ \
\ \
def----jkl
/ /
<B> <A>
未完全同步(或进一步同步)之前所述,则会导致:
git fetch --all
您可以运行git pull --all origin
或{{1}}来同步图表。