git push不会创建/更新远程分支,而是直接更新远程分支

50few1ms  于 2023-01-15  发布在  Git
关注(0)|答案(3)|浏览(148)

最近,我的local git改变了把分支推到remote的方式,但我不知道为什么。以前,我会用命令创建新分支:
git checkout -b feature_x origin/master
然后,将新分支推送到remote(为了创建一个Pull Request):
git push origin feature_x
这在上周之前一直运行良好,但是现在当我运行最后一个命令时,git直接推送到remote,而不创建分支(或允许为该分支创建PR)。我想我一定是在没有意识到的情况下更改了设置,才导致这种情况,但我不确定是哪一个。有人知道是什么导致了这种行为吗?或者有什么方法可以回到过去的做事方式?
git push origin feature_x的输出:

To https://github.com/[URL]
  2826f0c..66748dc  feature_x -> master

配置:

push.default=tracking
core.editor=vim
core.askpass=git-gui--askpass
branch.autosetupmerge=true
credential.helper=osxkeychain
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
remote.origin.url=https://github.com/[URL]
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.feature_x.remote=origin
branch.feature_x.merge=refs/heads/master
oyxsuwqo

oyxsuwqo1#

请不要混淆分支和存储库。
您有两个不同的存储库,本地存储库和github远程存储库。
在本地资源库中创建一个分支feature_x,并在该本地分支上提交更改。
稍后,您尝试将本地分支推送到远程存储库。完整的语法如下:

git push origin src:dst

这意味着推送到一个名为origin的远程位置(它可能被配置为github存储库),并在远程存储库中获取本地分支src并将其命名为dst
您没有指定:dst,因此将使用一些默认值。
从你的描述中,你期望feature_x:feature_x,但你得到了feature_x:master
git help push表示:

The <dst> tells which ref on the remote side is updated with this push.
   Arbitrary expressions cannot be used here, an actual ref must be named. If git
   push [<repository>] without any <refspec> argument is set to update some ref
   at the destination with <src> with remote.<repository>.push configuration
   variable, :<dst> part can be omitted---such a push will update a ref that
   <src> normally updates without any <refspec> on the command line. Otherwise,
   missing :<dst> means to update the same ref as the <src>.

感谢您的更新。
git branch -vv应该显示,您的特性分支正在跟踪origin/master。到目前为止,这是很好的。但是push.default=tracking说您想推送到跟踪分支作为默认值。-〉这解释了feature_x:master的行为。
也许你需要push.default=currentpush.default=simple(因为git 2.0默认也是simple)。

fdx2calv

fdx2calv2#

有没有人知道是什么会导致这种行为,也许还有一种回到旧的做事方式的方法?
看起来@michas在您的配置的帮助下,已经将push.default=tracking确定为问题所在。
但是,如果你使用的是git 2.37+,我还是建议你,根据你的期望,使用下面的设置:

git config --global push.default simple
git config --global branch.autoSetupMerge simple
git config --global push.autoSetupRemote true
  • push.default=simple将确保您只“隐式”推送到与本地分支名称相同的远程分支,否则将失败。
  • branch.autoSetupMerge=simple将确保您仅在从同名远程分支创建新分支时获得新分支上的跟踪关系。
  • push.autoSetupRemote=true将确保当您将新的本地分支推送到远程时,它会自动获得跟踪关系(所以git pull可以工作,git status可以显示你有多少本地未推送提交,等等),而且它还可以让git push只在新分支上工作--而不需要指定远程,或者分支。git push然后执行您原本需要运行git push -u origin HEAD的操作。
vmpqdwk3

vmpqdwk33#

您可以执行以下命令来更新上游

git push -u origin feature_x

在那之后它应该像往常一样开始工作

相关问题