gpt4 book ai didi

git - 分支不断跟踪master

转载 作者:太空狗 更新时间:2023-10-29 14:31:52 25 4
gpt4 key购买 nike

从最近开始,我的分支现在是 默认 跟踪并推送到远程主机,即使我这样做 git push -u origin branch_name即使我使用 matching作为我的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.

另外,如果我尝试以下 STEP 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 remote -v
origin XX:YYY/my_repo (fetch)
origin XX:YYY/my_repo (push)

$ git --version
git version 2.9.2

最佳答案

这一点是可疑的,因为中间线不应该出现:

$ git checkout -b my_branch
Branch my_branch set up to track local branch master.
Switched to a new branch 'my_branch'


例如,当我做 git checkout -b foo在存储库中:
$ git checkout -b foo
Switched to a new branch 'foo'

请注意缺少上游设置。我的猜测是你的 gco别名或脚本有 --track在里面某处。 编辑 : 原来是因为你配置了 branch.autoSetupMergealways ,因此从本地分支创建的新分支会跟踪其本地分支。

这只是问题的一半,但如果这没有发生,那么无论如何都不会发生完整的问题。因此 一种解决方法是删除该设置 (默认值似乎是大多数人最想要的)。

解决问题的另一半:

$ git branch --set-upstream-to=origin/my_branch
error: the requested upstream branch 'origin/my_branch' does not exist


这里的问题实际上就是 Git 所说的: origin/my_branch不存在。好吧,它还不存在:你需要说服你的 Git 拥有一个 origin/my_branch . Git 就是 Git,有很多方法可以做到这一点,但可能是最好的一种方法,我们稍后会介绍。

$ 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.


这就是问题所在:因为 my_branch已经有一个上游设置 master (不是 origin/master ,只是 master ),您的 Git 要求另一个 Git 使用名称 master ,就好像你已经运行了:
git push origin my_branch:master

因为这个 git push 没有其他问题,他们的一方做你方要求的——设置他们的 master匹配您的 my_branch ——然后你的一方按照你的要求做 -u ,即从 master 更改上游设置至 origin/master .这当然不是你要问的。

(而且:当它是本地的 master 时,您的 Git 替换为 master 似乎有点邪恶,即 branch.my_branch.remote 只是 . ,而不是 origin 。但假设我们无法更改 Git本身...)

我看到了三种简单的方法来解决这个问题:
  • 使用明确的远程端名称:git push -u origin my_branch:my_branch .这会覆盖当前的上游设置,以便您的 Git 要求他们的 Git 写入 my_branch .如果成功——它应该——你的 Git 现在将拥有 origin/my_branch并将更改 my_branch 的上游设置至 origin/my_branch .

    这里的一个缺点是,如果推送失败,您的 Git 不会更改当前的上游设置。当然,对于 git push -u 来说,这通常是正确的。 (包括接下来的两种方法,但在这两种情况下, future 不会留下任何陷阱)。
  • 在运行 git push 之前显式删除当前上游设置: git branch --unset-upstream my_branch (或任何等价物,包括编辑 .git/config 文件)。现在没有现有的上游,你的 Git 不会要求他们的 Git 使用名称 master .

    一旦你的 Git 要求他们的 Git 创建 my_branch (而不是 master )在 origin 上,我们回到第一种方法发生的事情。
  • 避免设置本地 master首先作为上游。效果同方法二。

  • 一种很难做到这一点的方法是伪造你的 Git:你可以创建一个远程跟踪分支,而无需实际访问远程。为此,您必须使用“管道”命令 git update-ref ,而不是 git branch .但是,如果您这样做,您可以使用 --set-upstream-to在实际创建远程分支的推送之前。 (另一种困难的方法是您使用的技巧,即直接编辑 .git/config,或使用 git config 进行等效操作。这允许您将上游设置为尚不存在的东西,因为所有 Git 都在这里真正做正在存储名称。)

    关于git - 分支不断跟踪master,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38730369/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com