我是否可以意外地同时推送多个Git功能分支



我已经使用git好几年了,所以我会说我对它很"满意",但决不是专家。

开始了一项新工作,我的开发负责人试图告诉我,如果我不定期使用git remote update origin --prune删除/修剪本地功能分支,git在推送OTHER功能分支时会自动推送它们

作为他在这里所说的一个例子,假设我有一个名为myproject的项目,它有以下分支:

  • master
  • develop
  • feature/one
  • feature/two
  • feature/three

假设feature/onefeature/two是旧的,已经被推送到GitHub,合并到develop,并从GitHub(原点(中删除。feature/three是我目前正在做的。

他说,如果我不定期使用git remote update origin --prune,那么当我最终通过git push推送我的feature/three分支时,我将面临将feature/onefeature/two重新推送到GitHub的风险!

如果这句话是真的,不仅会让我震惊,还会让我大吃一惊它是真的、假的还是部分正确的,为什么?!

git不会自动推送分支。但是,当您推送feature/three时,当然可能会意外地推送不正确的分支。例如,您可能会意外地键入git push origin feature/one而不是git push origin feature/three。这与git没有任何关系,但这将是一个用户错误。例如,您也可能在不打算使用--all标志的情况下意外使用该标志。

此外,如果你不小心推错了branch,那么当你意识到你的错误时,就删除remote branch(git push origin :feature/one(。由于remote branch已经是merged,它不会对任何事情产生负面影响。

这也可能与git配置中的push.default设置有关(请参阅此处的详细文档(。

基本上,它用于设置git push(无参数(的预期行为。

当你明确地为push命令提供参数时,它会按照指示进行,但通常情况下,人们会忘记他们的默认设置是什么(或者忽略它的存在(,尝试push,如果他们的默认值是将每个分支推送到其远程对应方*,那么。。。这可能正是你的同事暗示的"自动推送"的东西。

*自git2.0以来,标准从matching(将每个分支推送给对应的分支(更改为simple(仅推送当前分支(。

由于Git 2.0,默认的push.default配置设置为simple。如果当前分支与远程跟踪分支连接并且名称匹配,则仅推送当前分支:https://git-scm.com/docs/git-config.

以前,在Git1.x中,默认值是matching。使用此配置,所有具有相同名称的远程跟踪分支的本地分支都被推到了一起。如果您有过时的远程跟踪分支,那么git push可能会重新创建一个已删除的远程分支。

也许您的开发负责人仍在Git1.x上,或者您的团队决定使用旧的matching行为作为默认行为。

除了别人说你可能会意外执行

git push :

来自git-push手册:

特殊的refspec:(或+:允许非快进更新(指示Git推送"匹配"分支:对于本地端存在的每个分支,如果远程端已经存在同名分支,则会更新远程端。

最新更新