与远程仓库同名的Git分支创建方式不同。

4
创建一个与远程分支同名的本地分支时,推送和拉取的配置将会不同。
当前远程分支如下:
$ git branch -r
  origin/HEAD -> origin/master
  origin/master
  origin/someBranch

创建跟踪远程分支的本地分支:

$ git branch someBranch origin/someBranch 
  Branch someBranch set up to track remote branch someBranch from origin.
$ git branch someOtherBranch origin/someBranch 
  Branch someOtherBranch set up to track remote branch someBranch from origin.

检查跟踪和上游信息:

$ git remote show origin
* remote origin
  Fetch URL: git@github.somewhere.com:maic/repo.git
  Push  URL: git@github.somewhere.com:maic/repo.git
  HEAD branch: master
  Remote branches:
    master     tracked
    someBranch tracked
  Local branches configured for 'git pull':
    master          merges with remote master
    someBranch      merges with remote someBranch
    someOtherBranch merges with remote someBranch
  Local refs configured for 'git push':
    master     pushes to master     (up to date)
    someBranch pushes to someBranch (up to date)

为什么第二个分支没有推送配置就被创建了?

为什么你有两个不同的分支跟踪同一个远程分支?我怀疑 Git 在这里保护你免受自己的伤害。 - ebneter
我的疑问更多的是为什么同名的分支会被不同地处理。或者为什么我不能给我的本地分支任意命名,并且使用相同的命令正确地配置它进行推送和拉取。 - Maic López Sáenz
1个回答

5
本地分支只能跟踪远程分支进行推送,当且仅当本地和远程分支具有相同的名称。对于拉取而言,本地分支不需要与远程分支同名。有趣的是,如果您设置一个名为“foo”的分支来跟踪远程分支“origin/bar”(使用“git branch foo origin/bar”),并且如果远程存储库目前没有名为“foo”的分支,则如果稍后远程获取了名为“foo”的分支,则本地分支“foo”将在此后跟踪“origin/foo”!
$ git clone dev1 dev2
Cloning into 'dev2'...
done.
$ cd dev2
#
# After clone, local master tracks remote master.
#
$ git remote show origin
* remote origin
Fetch URL: /Users/ebg/dev1
Push  URL: /Users/ebg/dev1
HEAD branch: master
Remote branch:
  master tracked
Local branch configured for 'git pull':
  master merges with remote master
Local ref configured for 'git push':
  master pushes to master (up to date)
#
# Create branch br1 to track origin/master
#
$ git branch br1 origin/master
Branch br1 set up to track remote branch master from origin.
#
# br1 tracks origin/master for pulling, not pushing
#
$ git remote show origin
* remote origin
Fetch URL: /Users/ebg/dev1
Push  URL: /Users/ebg/dev1
HEAD branch: master
Remote branch:
  master tracked
Local branches configured for 'git pull':
  br1    merges with remote master
  master merges with remote master
Local ref configured for 'git push':
  master pushes to master (up to date)
#
# Go to the origin repo and now create a new 'br1' branch
#
$ cd ../dev1
$ git checkout -b br1
Switched to a new branch 'br1'
#
# Go back to dev2, fetch origin
#
$ cd ../dev2
$ git fetch origin
From /Users/ebg/dev1
 * [new branch]      br1        -> origin/br1
#
# Now local branch 'br1' is tracking origin/br1 for pushing
#
$ git remote show origin
* remote origin
Fetch URL: /Users/ebg/dev1
Push  URL: /Users/ebg/dev1
HEAD branch (remote HEAD is ambiguous, may be one of the following):
  br1
 master
Remote branches:
  br1    tracked
  master tracked
Local branches configured for 'git pull':
  br1    merges with remote master
  master merges with remote master
Local refs configured for 'git push':
  br1    pushes to br1    (up to date)
  master pushes to master (up to date)

所以,最初br1应该从master拉取/推送,结果我们发现br1从origin/master拉取并推送到一个我们从未知道的分支。

1
今天的Git 1.7.10发布说明有一个与此相关的更改:“当您在任何情况下不告诉要推送到“git push”命令的哪些分支和标记时,该命令使用“匹配引用”规则来更新具有与本地相同名称的分支和标记的远程分支和标记。...”因此,GIT在每次推送时都应用“匹配引用”,即使在设置本地foo的跟踪之后出现remote/foo,也会找到要推送到的remote/foo。 - GoZoner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接