Git 中分散式工作流的“简单”vs“当前”push.default

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

current将把当前分支推送到指定远程上具有相同名称的分支。对于当前分支,simple将有效地对被跟踪的和任何未被跟踪的远程执行相同的操作(它在这两种情况下都强制使用相同的分支名称)。

有人能解释一下这两种分散式工作流程之间的重要区别吗?

59793 次浏览

不同之处在于,使用 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

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

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

文件

来自 Git 配置文档:

  • 推动当前分支到它的上游分支..。

  • 类似于 simple的上游,但是如果上游分支的名称与本地分支的名称不同,则拒绝推进..。

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

不同之处在于,如果 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`