Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git Branch一直在跟踪master_Git - Fatal编程技术网

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