如何设置上游分支以将本地分支推送到magit?


11

据我所记得,如果我在一个分支上工作,例如,my-feature-branch我曾经能够使用magit-status菜单从菜单中执行此操作P P,然后从origin/my-feature-branch顶部的列表中选择远程分支。效果很好。

最近,在讨论中,我可以做一些类似的事情P -u e(打开magit-push-popup,设置--set-upstream标志并e在其他地方使用),类似地,我可以从以开头的分支列表中进行选择origin/my-feature-branch。这对我也很好。但是,即使在最近,这种方法也不再起作用,而且我还无法找出设置上游分支的最佳方法。

当我使用P e第一个选项将分支推送到时origin/my-feature-branch,这几乎总是我想要的。但是,它没有设置origin/my-feature-branch为本地分支的上游。使用P u允许我选择上游分支,但origin/my-feature-branch不在列表中,而且我必须在origin/my-feature-branch不使用制表符补全的情况下进行键入(我知道这并不难,但是它容易出现用户错误,并且比命令行要慢)。

这是现在设置上游分支的唯一方法,还是我错过了什么?我查看了与此问题相关的其他讨论和文档,但是我发现的所有来源似乎都已过时。


1
我认为该<remote>/<branch>零件被意外地遗漏在提示之外(请参阅此评论)。同时,您可以设置magit-push-current-set-remote-if-missing为nil。
凯尔·梅耶

我已经解决了。我在下面的回答假定该修复程序。
tarsius

发现并修复了其他一些相关问题。您可能需要等待几个小时,Melpa才能赶上所有下面的一切都是100%正确的。
tarsius

Answers:


11

有几种方法可以设置上游,同时推动或不推动。

如果magit-push-current-set-remote-if-missing为非nil(默认值),那么您将看到类似以下内容:

Push feature to
 p pushRemote, after setting that
 u @{upstream}, after setting that
 e elsewhere

要将其推送origin/feature并设置为上游,请按u,然后RET接受默认的完成候选者。

如果magit-push-current-set-remote-if-missingnil,则您将看到以下内容:

Push feature to
 e elsewhere

如果您p现在按,则系统将告知您上游尚未配置(这意味着如果没有上游,则无法推送到上游)。

但是,如果magit-push-current-set-remote-if-missingnil,则开关列表将具有--set-upstream,因此您可以像平常一样使用P - u p(除了第二个p是小写字母)。不过,这有一个复杂之处:更改值之后,magit-push-current-set-remote-if-missing您必须重新启动Emacs --set-upstream才能显示或消失。

最后,您可以使用“设置上游(不执行其他操作)”命令来设置上游:b uorigin/masterRET。请注意,使用这种方法时,只能选择一个已经存在的分支。


但是最好配置远程推送并推送到该远程推送。要了解有关推送远程及其与上游有何不同的更多信息,请参阅信息手册中的“ 分支”节点(Web版本尚未更新)。

基本上,上游分支是您的功能分支最终最有可能合并到的分支(通过合并或重新设置基础,而不是通过推送)origin/master。而“推-远程”功能则是您在继续使用功能分支时将其推入的位置,以便其他人可以合并它们。如果本地分支已命名feature,而push-remote是my-fork,则使用推送该分支P p将推送到my-fork/feature。(无法配置“推送到分支”,推送远程上的分支名称始终与本地名称相同。)

因此,尽管您的问题类似于“如何在同时配置上游的同时向上游推”,但我的建议是根本不向上游推,而应该推向远程推。

前提是您尚未更改的值,则magit-push-current-set-remote-if-missing可以使用来配置Push-remote P psome-remoteRET。但是,由于您可能会将所有功能分支推送到同一个遥控器,因此最好为所有分支设置一次推送-远程操作并对其进行操作:b然后M-p选择正确的遥控器。


另请注意,通常不必显式设置上游分支。创建新分支并选择一个远程分支作为起点时,该分支将用作上游分支。

不幸的是,起点通常是本地分支,在这种情况下,默认情况下Git不会将其用作上游。但这可以通过运行一次轻松解决:

git config --global branch.autoSetupMerge always

默认值为true,表示“将起点设置为上游,前提是它是远程分支”。


顺便说一下,同样适用于推式遥控器。通常也应该在“新”存储库中半自动设置该设置。如果克隆存储库,系统将询问您是否要将其origin用作推送远程。您应该回答“是”,除非您要添加另一个遥控器(例如)my-fork,该遥控器应被用作推送遥控器。当您使用M aremote.pushDefault尚未添加新的遥控器时,系统会询问您是否要将新添加的遥控器用作推式遥控器。

可以使用magit-clone-set-remote.pushDefault和进行配置magit-remote-add-set-remote.pushDefault

另一个高级选项是magit-branch-prefer-remote-upstream,默认为nil。如果你将其设置为t,然后选择一个本地分支为起点一个新的分支,那么出发点的上游威力(根据一定的规则,请参见文档弦)作为上游,而不是起点本身。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.