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
设置为 simple
、upstream
或 current
之一。事实上,你可能想要 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 或更高版本,你不必设置任何东西。
simple
和 upstream
是什么意思
在 Git 中,您的每个分支(您的本地分支名称,如 master
和 my-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
。使用 simple
或 upstream
意味着:
git push
表示:
git push $remote $branch:$upstream_branch
simple
设置增加了一个额外的约束:如果 $upstream_branch
不是与 $branch
.
相同 名称
current
是什么意思
请注意,以上两者都要求 current 分支 有一个 upstream。使用 current
有点像使用 simple
,只是 Git 不需要完整的上游设置。它只需要 "remote" 部分。 (你可以写 git push origin
来提供那部分,或者你当前的分支可以有一个远程集,有或没有上游的另一半。)现在不需要 $upstream_branch
,git push
只是:
git push $remote $branch:$branch
同样,新的默认设置是 simple
,这通常是正确的设置。
我不知道我更改了什么,但最近当我尝试使用 "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
设置为 simple
、upstream
或 current
之一。事实上,你可能想要 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 或更高版本,你不必设置任何东西。
simple
和 upstream
是什么意思
在 Git 中,您的每个分支(您的本地分支名称,如 master
和 my-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
。使用 simple
或 upstream
意味着:
git push
表示:
git push $remote $branch:$upstream_branch
simple
设置增加了一个额外的约束:如果 $upstream_branch
不是与 $branch
.
current
是什么意思
请注意,以上两者都要求 current 分支 有一个 upstream。使用 current
有点像使用 simple
,只是 Git 不需要完整的上游设置。它只需要 "remote" 部分。 (你可以写 git push origin
来提供那部分,或者你当前的分支可以有一个远程集,有或没有上游的另一半。)现在不需要 $upstream_branch
,git push
只是:
git push $remote $branch:$branch
同样,新的默认设置是 simple
,这通常是正确的设置。