git配置设置以自动创建同名远程分支

14

我曾经将我的git设置得非常好,当我运行git push时,它会自动推送到同名的远程分支,并在运行git pull时自动更新。

我试图向朋友展示如何做到这一点,在此过程中却破坏了自己的配置。我该如何恢复所需的功能?我尝试了很多配置,但每个配置都有问题。

目前我在~/.gitconfig中有以下配置:

[push]
    default = current
[branch]
    autoSetupMerge = always

但是当我在本地创建一个新的分支,然后提交和推送时,它会显示“一切都是最新的”。如果我运行git push origin <branch_name>,它就可以推送更改。

这些设置似乎也不起作用:

[push]
    default = matching
[branch]
    autoSetupMerge = always
3个回答

17

你可以使用git config --global push.default current来配置它,让它将当前分支推送到同名的远程分支进行更新。

但是,从2022年开始,如果你使用 git 版本 git >= 2.37.0,你可以在你的 git 配置中指定git config --global --add --bool push.autoSetupRemote true来实现同样的效果,同时还会设置上游跟踪。


2
吹毛求疵:git config --global -push.autoSetupRemote true 应该足够了(但是+1)。 - ted
6
nitpick 上有一个错别字:git config --global push.autoSetupRemote true,需要在 push 前面移除多余的 - - Anand Sunderraman
我会用一个额外的点增强这个答案:如果你正在使用push.autoSetupRemote true,那么你几乎肯定也想要branch.autoSetupMerge simple,这将确保你的分支操作仅在你的新分支具有相同名称时设置跟踪分支。如果没有,你的 git pull 行为在最初分支和第一次推送之间的短时间内会变得奇怪/不同。 - Tao
这个 git config set up 命令做了以下更改: 它设置了: [push] autoSetupRemote = true 在我的全局 .gitconfig 文件中。 - Tore Aurstad

15

您可以使用以下命令指示git默认创建与同名远程分支(我使用全局级别,您可以根据需求决定级别):

您可以使用以下命令指示git默认创建与同名远程分支(我使用全局级别,您可以根据需求决定级别):

git config --global push.default current

来源

您可以在第一次推送新分支时使用 -u 选项,它将有助于跟踪新分支并在拉取更改时帮助。如果您没有在第一次推送时使用 -u,则稍后也可以使用它进行推送。基本上,在使用 -u 选项进行推送后将开始跟踪。

git push -u

在创建新分支并推送更改时,没有指定起点和分支名称。


1
过去我没有使用 -u 选项也能正常工作。只用 git push 就可以了。 - Eliezer Steinbock
你只需要在第一次使用时这样做。然后你就可以像平常一样使用git push了。 - user
简单明了,直截了当。谢谢! - Clint Eastwood

4
这里的主控制旋钮确实是 push.default,你可能想选择 currentmatching,它们有一个非常重要的区别:
  • current 意味着如果你省略 refspec 参数,你的 Git 应该使用你当前所在的分支 - 即 git status 显示为 "on branch ..." 或 git branch 带有星号的分支 - 并尝试将其推送到其上游分支。也就是说,如果当前分支是 xyzcurrent 设置将请求 origin 将其 xyz 分支(你的上游)设置为与你的 xyz 相同的哈希 ID。即使你的 xyz 的上游是他们的 zyx,这也是正确的——请参见下面的 upstream

  • matching 意味着如果你省略了 refspec 参数,你的 Git 应该从对方的 Git 中获取一个分支名称列表。然后,对于他们的每个分支名称——无论它是什么;masterdevelopzyx 等等——你的 Git 应该看看你是否也有一个同名的分支,而不管你的分支哈希 ID 是什么。对于每个匹配的名称,你的 Git 应该请求他们的 Git 将 他们的 分支设置为与 你的 显示的相同名称的哈希 ID。

matching 设置意味着,例如,如果你运行:
git push ssh://host.example.com/path/to/repo.git

他们有分支masterdevelopzyx,而你有masterdevelop,但没有zyx,你的Git会要求他们将他们的masterdevelop设置为与你的masterdevelop匹配,即使他们的Git与你的Git完全无关。
(如果他们的Git与你的无关,这个礼貌的请求肯定会失败,所以这不是什么大问题。)
你可以在任何给定的推送中明确要求matching行为,而不设置push.default设置,使用:
git push <remote> :

也就是说,作为一个refspec,只有一个裸的冒号:意味着“匹配”。
其余的push.default设置,包括nothingupstreamtrackingsimple,大多数都是current的变体:
- nothing设置如果省略了refspec,会完全报错。我曾经使用过这个设置,但发现它太烦人了。 - upstreamtracking设置是同义词——trackingupstream的弃用同义词——意思是“使用当前分支的上游设置来确定要发送到其他Git的名称”。因此,如果您的forward分支的上游是origin/reverse,您将要求他们更新他们的reverse分支。 - simple设置与upstreamcurrent的含义相同,根据您正在git push的位置选择要模拟的设置:它检查您正在使用的远程是否是设置的远程,如果是,则像upstream一样工作,但需要分支名称匹配。否则,它的行为就像current一样。
我现在将我的设置保留为simple,并在有意推送新分支时运行git push -u origin HEAD,在推送到同名分支时不带参数地运行git push

直到一周前,我已经设置好了git checkout -b my_branch && git push可以正常工作。同样适用于git pull。但是我尝试过的所有设置都没有提供这种功能。 - Eliezer Steinbock
1
matching 不会创建分支,因为它不匹配。只有当你当前分支中时,current 才会创建分支。此外,请注意任何全局设置都可以被任何本地设置覆盖;你也可以使用 remote.<name>.push 为特定的远程设置默认的refspec,这将覆盖其他的 push.* 设置。 - torek
我认为实际上可能是本地设置覆盖了它。在另一个项目中,一切都按照我喜欢的方式运作。current 是正确的选项。下周将查看发生了什么问题。 - Eliezer Steinbock
1
您可以使用 git config --show-origin --get-all push.default 命令来显示设置了 push.default 的每个配置文件以及当前存储库的设置。该命令将首先显示任何系统设置,然后是任何 --global 设置,最后是任何基于 .git/config 的设置。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接