Git Branch一直在跟踪master
从最近开始,默认情况下,我的分支现在跟踪并推送到远程主机,即使我执行Git Branch一直在跟踪master,git,Git,从最近开始,默认情况下,我的分支现在跟踪并推送到远程主机,即使我执行git push-u origin branch_name,即使我使用匹配作为我的push.default选项 # -------- # STEP 1 # -------- $ git checkout -b my_branch Branch my_branch set up to track local branch master. Switched to a new branch 'my_branch' # -------
git push-u origin branch_name
,即使我使用匹配
作为我的push.default
选项
# --------
# STEP 1
# --------
$ git checkout -b my_branch
Branch my_branch set up to track local branch master.
Switched to a new branch 'my_branch'
# --------------------------------------------------------------------------------
# STEP 2: (same behavior BTW with current/upstream/simple)
# --------------------------------------------------------------------------------
$ git config --global push.default matching
# --------
# STEP 3:
# --------
$ git push -u origin my_branch
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 1.16 KiB | 0 bytes/s, done.
Total 8 (delta 7), reused 0 (delta 0)
To XX:YYY/my_repo
62d390c..4e4baa1 my_branch -> master
Branch my_branch set up to track remote branch master from origin.
此外,如果我在步骤2尝试以下操作,我会得到一个错误:
$ git branch --set-upstream-to=origin/my_branch
error: the requested upstream branch 'origin/my_branch' does not exist
hint:
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint:
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.
我知道我可以手动编辑.git/config
,但是为什么上面的操作不起作用
此位可疑,因为中间线不应出现: 例如,当我在存储库中执行
git checkout-bfoo
时:
$ git checkout -b foo
Switched to a new branch 'foo'
请注意,缺少上游设置。我猜您的gco
别名或脚本中有--track
编辑:这是因为您已将分支配置为自动设置合并
始终,因此从本地分支创建的新分支跟踪其本地分支
这只是问题的一半,但如果不是这样,整个问题无论如何也不会发生。因此,一个修复方法是删除该设置(默认设置似乎是大多数人最想要的)
解决问题的另一半: 这里的问题实际上就是Git所说的:
origin/my_branch
不存在。嗯,它还不存在:你需要说服你的Git有一个源代码/my_分支。Git是Git,有很多方法可以做到这一点,但可能是最好的一种方法,我们稍后会介绍
这就是问题所在:由于my_branch
已经有一个上游设置master
(不是origin/master
,只是master
),您的Git要求另一个Git使用名称master
,就好像您已经运行了:
git push origin my_branch:master
由于此git push
没有其他问题,他们的一方按照您的要求设置他们的master
以匹配您的myu分支
,然后您的一方按照您的要求使用-u
,即将上游设置从master
更改为origin/master
。那当然不是你想问的
(而且:如果Git是本地主控
,也就是分支,那么你的Git在主控
中替换它似乎有点不好。my_branch.remote
只是,而不是源控
。但是假设我们不能更改Git本身……)
我认为有三种简单的方法可以解决这个问题:
使用明确的远程端名称:git push-u origin my_branch:my_branch
。这会覆盖当前的上游设置,因此您的Git会要求他们的Git写入my_branch
。如果成功,您的Git现在将拥有origin/my_branch
,并将my_branch
的上游设置更改为origin/my_branch
这里的一个缺点是,如果推送失败,Git将不会更改当前的上游设置。当然,对于gitpush-u
(包括接下来的两种方法,但在这两种情况下,没有为未来留下任何陷阱)
在运行git push
之前,显式删除当前上游设置:git分支--取消设置上游my_分支
(或任何等效设置,包括编辑.git/config
文件)。既然没有上游,您的Git就不会要求他们的Git使用名称master
一旦您的Git要求他们的Git在origin
上创建my_branch
(而不是master
),我们就回到了第一种方法的情况
首先避免将本地主机设置为上游。效果与方法2相同
要做到这一点,一个困难的方法是假装你的Git:你可以创建一个远程跟踪分支,而不需要真正去远程。为此,您必须使用“管道”命令git update ref
,而不是git branch
。但是,如果这样做,则可以在推送之前使用--将上游设置为
,从而在远程上实际创建分支。(另一个困难的方法是直接编辑.git/config
的技巧,或者使用git config
执行等效操作。这允许您将上游设置为实际上还不存在的内容,因为git在这里真正做的是存储名称。)推送之后是否执行了git fetch
?我认为这将创建origin/my_branch
。谢谢torek。我尝试不使用别名(例如,常规git checkout-b new_branch
也没有用。这就是为什么我在开始提问后很快更新了OP),我总是设置branch new branch来跟踪本地分支主控。
Hm,您是否将branch.autoSetupMerge
配置为always
?这可能就够了。git push
使用本地分支。$branch.merge
值作为上游端名称似乎有点邪恶和/或错误。也许如果branch.$branch.remote
与使用的远程git push
不同,那么对于大多数推送行为,它至少应该发出警告,或者可能失败。这(为什么push-u
的性能没有更好)尤其不清楚,因为您尝试了匹配,这应该完全忽略上游设置。Git的人将Git push重写为C程序(它以前是一个shell脚本),所以现在很难理解为什么-u
在这里没有帮助。这可能是一个bug。我得到的印象是,一些非默认行为模式(如推送的匹配
,或者这个autosetupmerge=always设置)没有被测试。当我有时间(哈哈)的时候,我需要看看测试套件的内部。
$ git checkout -b foo
Switched to a new branch 'foo'
$ git branch --set-upstream-to=origin/my_branch
error: the requested upstream branch 'origin/my_branch' does not exist
$ git push -u origin my_branch
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 1.16 KiB | 0 bytes/s, done.
Total 8 (delta 7), reused 0 (delta 0)
To XX:YYY/my_repo
62d390c..4e4baa1 my_branch -> master
Branch my_branch set up to track remote branch master from origin.
git push origin my_branch:master