git push.default=current和push.default=upstream之间有什么区别?

10 浏览
0 Comments

git push.default=current和push.default=upstream之间有什么区别?

git-config的man页面列出了push.default选项的内容:

nothing - 不推送任何内容。

matching - 推送所有匹配的分支。在两端具有相同名称的所有分支都被视为匹配。这是默认选项。

upstream - 将当前分支推送到其上游分支。

tracking - 上游的过时同义词。

current - 将当前分支推送到同名分支。

在大多数情况下,我认为推送到一个分支的上游分支与推送到同名分支是相同的,因为上游分支通常具有相同的名称,并且同名分支("current")通常(或根据定义总是?)是上游分支。那么有什么区别呢?

更新:git-config的文档已经更新(正如人们所期望的),因此在那里进行的区分可能会更加清晰。

0
0 Comments

git push.default=current与push.default=upstream之间的区别是什么?

git push.default=current将当前分支推送到远程仓库上同名的分支。

git push.default=upstream将当前分支推送到上游分支。

上游分支是一个被显式或隐式定义为与当前分支上游相关的分支。这意味着默认情况下,推送和拉取操作将与该分支同步。上游分支可以在与当前分支本身相同的仓库中。您可以设置本地主分支作为本地功能(主题)分支的上游分支,并在它们之间进行推送和拉取等有趣的操作。

隐式的上游设置是通过branch.autosetupmerge配置值完成的。您可以在git config帮助页面中找到相关文档。使用git branch命令的-u选项可以进行显式的上游设置。有关详细信息,请参阅帮助页面。

我认为branch.autoSetupMerge与-u/--set-upstream没有相同的功能。至少,在文档中没有看到任何暗示它使git push的行为默认类似于使用-u调用的内容,这似乎是您所说的。你能解释一下你的意思吗?

当您检出一个远程跟踪分支时,默认情况下,branch.autoSetupMerge配置会创建一个新的本地分支,并将其上游设置为远程跟踪分支。可以通过使用-t (--track)或-u ... (--set-upstream-to=...)标志来显式执行这个隐式操作,这两种方式的语法略有不同,但功能相同。

我明白发生了什么 - 因为这个问题是关于git push的,所以我(错误地)假设您是在谈论git push的-u选项,而不是git branch的-u选项。对于造成的混淆我感到抱歉:)

0
0 Comments

在git中,有两个配置项可以控制push操作的行为:git push.default=current和git push.default=upstream。两者之间的区别在于,upstream会推送到配置的上游分支,而current则假设上游分支与当前本地分支同名,并推送到该特定名称的分支上。事实上,不能假设本地分支的上游跟踪分支与本地分支本身同名。

举个例子来说,如果你在多个仓库中工作,或者在许多共享的开发者远程仓库之间切换,你通常会跟踪同一分支的不同分叉,比如allen-master或susan-master,它们分别跟踪Allen和Susan的仓库中的master分支。在这种情况下,current设置是不正确的,因为这些分支名称在他们的远程仓库中并不存在。然而,upstream则可以正常工作。

另一个实际的例子可能是同时跟踪一个development和一个production仓库。你的工作流可能为每个仓库使用不同的主线分支,但这可能会导致混淆。假设你是一个代码集成者,想要分别跟踪两个仓库的master分支。

git checkout -b production --track production/master

git checkout -b development --track development/master

现在你有了两个分支,分别跟踪它们各自的仓库,它们都没有使用master命名约定。分支名称不会引起混淆:它们明确地描述了它们的跟踪对象。然而,push.default=current在这种情况下没有任何意义,因为远程仓库都不包含development或production分支。

你给出了两个upstream优于current的例子。我认为这是很明显的,所以你应该给出一个相反的例子。

据我所知,current在你是一个相对新的开发者的情况下更好,因为你不需要进行太多的git config操作,特别是在从其他地方克隆了代码之后。current会为你推送到或创建-然后推送到远程仓库上同名的分支,如果它们还不存在的话;而simple则会在同名分支不存在时直接拒绝推送。upstream在这种情况下的行为与simple相同,除非已经明确设置了上游分支,或者其他方式设置了上游分支,如Yawar的回答中所述。

“事实上,不能假设本地分支的上游跟踪分支与本地分支本身同名。” -> 这取决于你团队的git策略。我知道一些大公司由于公司政策禁止分叉,即使他们有一个庞大的开发团队。在这种情况下,只需使用current即可。

0