Git 个分支试图推送到 master。

Git branches trying to push to master.

我不知道我更改了什么,但最近当我尝试使用 "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 配置,它看起来不应该推送到 master。

[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 push 而不指定存储库和 refspec 参数。根据 git-push 文档,git 将默认为 branch.*.remote 存储库和 remote.*.push refspec。

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

git push origin my-branch

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

编辑:这是一个 Stack Overflow answer,看起来是对 git push

默认行为的很好解释

配置push.default

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

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

git config --global push.default simple

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

git config push.default upstream

(假设您希望当前存储库处于 upstream 模式,而不管您的 --global 设置如何)。

"default default" 取决于您的 Git 版本。

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

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

simpleupstream 是什么意思

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

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

设置后,git push 将从 name-of-the-remote 部分选择远程,并从 name-of- 推送 的分支分支部分。 (你推from的分支默认是你当前的分支,当然,是这个当前分支的上游设置了其他两部分。)

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

git push

表示:

git push $remote $branch:$upstream_branch

simple 设置增加了一个额外的约束:如果 $upstream_branch 不是$branch.

相同 名称

current 是什么意思

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

git push $remote $branch:$branch

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