【问题标题】:Git branches trying to push to master.Git 分支试图推送到 master。
【发布时间】:2016-11-13 22:06:03
【问题描述】:

我不知道我改变了什么,但最近当我尝试使用“git push”向上推我的一个分支时,它试图推到远程分支并掌握。

➜  module1 git:(my-branch) git push 
Counting objects: 40, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (40/40), 3.68 KiB | 0 bytes/s, done.
Total 40 (delta 14), reused 0 (delta 0)
To git@github.corp.company.com:Project-1/SomeProject.git
   1000000..000000e  my-branch -> my-branch
 ! [rejected]        master -> master (non-fast-forward)

幸运的是,每次发生这种情况时,我都会收到一条被拒绝的消息,因为我的分支一直落后于 master。我以前只能输入 git push,它只会推送我正在跟踪的分支。我查看了我的 git 配置,它看起来不应该推动掌握。

[remote "origin"]
    url = git@github.corp.company.com:Project-1/SomeProject.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "my-branch"]
    remote = origin
    merge = refs/heads/my-branch

有什么办法可以防止这种情况发生?

【问题讨论】:

    标签: git git-branch git-push


    【解决方案1】:

    在不指定存储库和 refspec 参数的情况下,我会小心使用 git push。根据git-push 文档,git 将默认使用branch.*.remote repo 和remote.*.push refspec。

    在个人实践中,我总是用类似下面的东西来推动......

    git push origin my-branch

    您始终可以使用git branch -vv 显示每个分支正在跟踪的远程。将有助于进一步调试。

    编辑:这是一个Stack Overflow answer,它看起来很好地解释了git push的默认行为

    【讨论】:

      【解决方案2】:

      配置push.default

      您想将push.default 设置为simpleupstreamcurrent 之一。事实上,你可能想要simple

      要为自己设置simple 模式,对于所有未设置其他值的存储库,请使用:

      git config --global push.default simple
      

      要在一个特定的存储库中覆盖它,请使用,例如:

      git config push.default upstream
      

      (假设您希望当前存储库使用upstream 模式,无论您的--global 设置如何)。

      “默认默认值”取决于您的 Git 版本。

      在 2.0 之前的 Git 版本中,初始默认值为 matching。这是您现在看到的行为,显然不是您想要的。

      在 Git 2.0 或更高版本中,初始默认值为 simple。如果这是你想要的并且git --version告诉你你有2.0或更高版本,你不需要设置任何东西。

      simpleupstream 是什么意思

      在 Git 中,您的每个分支(您的本地分支名称,例如 mastermy-branch)都可以有一个“上游”设置。 (或者它可以没有上游设置,但这对我们来说不是很有用!)设置或更改上游的主要命令是git branch --set-upstream-to

      上游本身是必不可少的两个部分:远程名称,如origin,以及该远程上的分支名称,如master。使用git branch --set-upstream-to,您只需将远程跟踪分支命名为origin/master,即可同时设置这两个分支,这很明显。

      一旦设置,git push 将从远程名称部分中选择远程,并从分支名称部分中选择要推送的分支。 (当然,您 from 推送的分支默认为您当前的分支,并且设置其他两个部分的是当前分支的上游。)

      假设您当前的分支是$branch,它的上游是$remote/$upstream_branch。使用simpleupstream 意味着:

      git push
      

      意思是:

      git push $remote $branch:$upstream_branch
      

      simple 设置增加了一个额外的约束:如果$upstream_branch$branch 的名称不同相同,此默认推送将停止(拒绝运行) .

      current 是什么意思

      请注意,以上两个都要求当前分支有一个上游。使用current 有点像使用simple,只是Git 不需要完整的上游设置。它只需要“远程”部分。 (你可以写 git push origin 来提供那部分,或者你当前的分支可以有一个远程集,有或没有上游的另一半。)现在不需要$upstream_branchgit push 现在只需要:

      git push $remote $branch:$branch
      

      同样,新的默认设置是 simple,这通常是正确的设置。

      【讨论】:

        猜你喜欢
        • 2012-07-25
        • 1970-01-01
        • 2015-08-14
        • 2020-09-16
        • 1970-01-01
        • 2021-11-23
        • 2010-11-07
        • 2016-01-23
        • 2011-09-10
        相关资源
        最近更新 更多