分散工作流程的git中的"简单"与"当前"push.default

voi*_*ter 111 git git-push git-config

从功能上讲,在分散的工作流程中,我没有看到配置设置simplecurrent选项之间的区别push.default.

current将当前分支推送到指定远程上的同名分支.simple对于当前分支的跟踪和任何未跟踪的遥控器,它将有效地做同样的事情(它在两种情况下都强制执行相同的分支名称).

有人可以解释我失去的分散工作流程之间的任何重要差异吗?

小智 169

不同之处在于simple,git push如果当前分支没有跟踪远程上游分支(即使远程上存在具有相同名称的分支),(不通过refspec)将失败:

$ git checkout -b foo
Switched to a new branch 'foo'

$ git config push.default simple
$ git push
fatal: The current branch foo has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin foo
Run Code Online (Sandbox Code Playgroud)

另一方面,current不关心当前分支是否跟踪上游,它只是想推送到任何具有相同名称的分支:

$ git config push.default current
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To /Documents/GitHub/bare
 * [new branch]      foo-> foo
Run Code Online (Sandbox Code Playgroud)

文档

Git配置文档:

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

  • simple - 像上游一样,但如果上游分支的名称与本地名称不同,则拒绝推送...

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

  • 简单似乎更安全的"安全带"选项. (6认同)
  • 我想唯一的"奖金"问题是"为什么".我想强制上游跟踪分支可以消除错误(意外覆盖错误遥控器上的那个分支). (3认同)
  • 经过很长一段时间重新审视自己的问题:-)"当前"是如何知道选择哪个遥控器的?如果您没有跟踪分支集,它会在哪里推送? (2认同)
  • 它推送到默认的遥控器->表示原点。来自man git-push:在命令行中未使用<repository>参数指定推送位置时,将查询当前分支的branch。*。remote配置以确定推送位置。如果缺少配置,则默认为原始。 (2认同)
  • 多年来,我一直使用“当前”,绝对没有问题。在大多数情况下,它有效:拉/推到一个存储库,创建新分支或检查不太可能发生命名冲突的现有分支。只是工作,没有问题。不能说它应该是默认值(因为它不安全)但谢天谢地它存在。 (2认同)

jth*_*ill 9

不同之处在于,simple如果它具有相同的名称,则推送到其跟踪分支,而current不管任何跟踪分支,它将推送到同名的分支:

$ git branch -vvv
  master 58d9fdc [origin/master: ahead 1] t1 bobo
* new    37132d3 [origin/save: ahead 1] t1 bibi   # <- tracking branch 'save'

$ git -c push.default=current push                # <- set `push.default=current`
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/jthill/sandbox/20/t1
 * [new branch]      new -> new                   # <- and push creates `new` 
Run Code Online (Sandbox Code Playgroud)