我曾经把我的 git 设置得很好,当我运行时它会自动推送到同名的远程分支
git push
,并在运行时自动拉取git pull
。
我试图向朋友展示如何做到这一点,并在此过程中设法破坏了我自己的配置。我怎样才能恢复我正在寻找的功能?我尝试了很多配置,但每个配置都有其问题。
我目前在
~/.gitconfig
中有这个:
[push]
default = current
[branch]
autoSetupMerge = always
但是当我在本地创建一个新分支,然后提交并推送时,它会显示“一切都是最新的”。如果我随后运行
git push origin <branch_name>
,它确实会推送更改。
这些设置似乎也不起作用:
[push]
default = matching
[branch]
autoSetupMerge = always
您可以使用
git config --global push.default current
进行配置
使其推送当前分支以更新同名分支。
但是,在 2022 年,使用 git 版本 git >= 2.37.0,您可以在 git config 中指定这一点
git config --global --add --bool push.autoSetupRemote true
,这可以在设置上游跟踪的同时实现相同的效果。
您可以使用以下命令指示 git 默认创建同名远程分支(我使用的是全局级别,您可以根据您的需求决定级别:
git config --global push.default current
您可以使用 -u 选项首次推送新分支,它将有助于跟踪新分支并有助于拉取更改。如果第一次推送时没有使用 -u ,以后推送时也可以使用它。基本上,跟踪将在使用 -u 选项推送后开始。
git push -u
无需为新分支和推送更改指定来源和分支名称。
这里的主控制旋钮确实是
push.default
,您可能想要 current
或 matching
,它们有一个非常重大的区别:
current
意味着如果你省略 refspec 参数,你的 Git 应该使用你现在所在的分支 - git status
会说“在分支...”,或者 git branch
会说用星号打印 - 并尝试将其推送到其上游对应部分。也就是说,如果当前分支是 xyz
,则 current
设置将要求 origin
将其 xyz
分支(您的上游)设置为与您的 xyz
相同的哈希 ID。 即使您的 xyz
的上游是他们的 zyx
,情况也是如此 - 请参阅下面的 upstream
。matching
意味着如果您省略 refspec 参数,您的 Git 应该从其 Git 获取分支名称列表。然后,对于每个分支的名称——无论它们是什么; master
、develop
、zyx
等等 — 无论您的分支的哈希 ID 是什么,您的 Git 都应该查看您是否也有同名的分支。对于每个匹配的 name,您的 Git 应要求其 Git 将 他们的 分支设置为 your Git 为该名称显示的相同哈希 ID。matching
设置意味着,例如,如果您运行:
git push ssh://host.example.com/path/to/repo.git
并且他们有分支
master
、develop
和 zyx
,而你有 master
和 develop
但没有 zyx
,你的 Git 会要求他们设置 他们的 master
和 develop
匹配您的 master
和 develop
,即使他们的 Git 与您的 Git 完全无关。
(如果他们的 Git 与你的无关,这个礼貌的请求肯定会失败,所以这没什么大不了的。)
您可以在任何给定的推送上明确要求
matching
行为,而无需设置 push.default
设置,使用:
git push <remote> :
也就是说,裸露的冒号
:
作为 refspec 意味着“匹配”。
其余的
push.default
设置,即 nothing
、upstream
、tracking
和 simple
,大多是 current
的变体:
nothing
设置会完全出错。我用过一段时间,但发现它太烦人了。upstream
和 tracking
设置是同义词 - tracking
是 upstream
已弃用的同义词 - 意味着 使用当前分支的上游设置来确定发送到另一个 Git 的名称。因此,如果您的 forward
将 origin/reverse
作为其上游,您将要求他们更新其 reverse
。simple
设置与 upstream
和 current
的含义相同,根据您要 git push
的位置选择要模拟的设置:它会检查您正在使用的遥控器是否是为其设置了遥控器,如果是这样,则行为类似于 upstream
,只不过它要求分支名称匹配。否则,它的行为就像 current
。这些天我将我的设置设置为
simple
,并且在故意推送新分支时运行 git push -u origin HEAD
,并且在推送到同名分支时不带参数运行 git push
。
如果你想把它放在 .gitconfig 中,也许类似
[push]
autoSetupRemote = true
会成功的。