没有指定分支的"git push"的默认行为

Pla*_*mer 1339 git branch git-push git-branch

我使用以下命令推送到我的远程分支:

git push origin sandbox
Run Code Online (Sandbox Code Playgroud)

如果我说

git push origin
Run Code Online (Sandbox Code Playgroud)

这会推动我的其他分支的变化,还是只更新我当前的分支?我有三个分支:master,productionsandbox.

git push文件是不是这个很清楚,所以我想澄清这一点为好.

哪些分支和遥控器可以git push完全更新以下命令?

git push 
git push origin
Run Code Online (Sandbox Code Playgroud)

origin 上面是一个遥控器.

据我所知,git push [remote] [branch]只会将该分支推送到远程.

Bri*_*n L 1561

您可以通过在git config中设置push.default来控制默认行为.从git-config(1)文档:

push.default
Run Code Online (Sandbox Code Playgroud)

如果在命令行上没有给出refspec,在远程中没有配置refspec,并且命令行上给出的任何选项都没有暗示refspec,则定义git push应采取的操作.可能的值是:

  • nothing:不要推任何东西

  • matching:推送所有匹配的分支

    两端具有相同名称的所有分支都被认为是匹配的.

    这是Git 1.x中的默认值.

  • simple:将当前分支推送到其上游分支(upstream是上游的弃用同义词)

  • tracking:将当前分支推送到同名分支

  • current:(在Git 1.7.11中新增),如上游,但如果上游分支的名称与本地分支不同,则拒绝推送

    这是最安全的选择,非常适合初学者.

    这将成为Git 2.0中的默认设置.

简单,当前和上游模式适用于那些想要在完成工作后推出单个分支的人,即使其他分支尚未准备好被推出

命令行示例:

要查看当前配置:

git config --global push.default
Run Code Online (Sandbox Code Playgroud)

要设置新配置:

git config --global push.default current
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,从Git 1.7.11开始,有一种新的"简单"模式.此模式将在未来成为默认模式.`simple`的工作方式类似于`upstream`,但像`current`要求两端的分支名称相同. (20认同)
  • "tracking"是"上游"的弃用同义词:http://www.kernel.org/pub/software/scm/git/docs/git-config.html (13认同)
  • 值得注意的是,这是v1.6.3中的新功能:http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt (11认同)
  • 值得注意的是,从Git 2.0开始,`simple`行为现在是默认行为. (9认同)
  • 这个"push.default"是处理多个回购的最好的事情.将其设置为"跟踪",你们都很好.结合分支 - 上游这些使得推拉方式更加方便. (8认同)
  • 有很多值得注意的事情 (6认同)
  • `git config --global push.default` 没有为我显示任何内容。 (3认同)
  • 根据git doc'git push origin HEAD'也应该有效. (2认同)
  • "上游"同义词在Git 1.7.0.4(Ubuntu 10.04 LTS中的版本)中不可用. (2认同)
  • @Tiago,您可以通过在推送选项中显式命名配置来推送单个分支,而无需修改配置,例如`git push origin master:master`。 (2认同)
  • 我想知道在哪种情况下“push.default=upstream”可能是错误的。Kyralessa 指出了上面的一个例子,但这是一个甚至可能不是“错误”的例子。所以我想知道为什么不总是使用“push.default=upstream”;这有什么问题? (2认同)
  • 默认行为应该是“无”,而不是“简单”。不要让初学者犯任何错误,...(也适用于高级用户,他们可能会忽略一些东西,...) (2认同)

Chr*_*fer 204

您可以使用push.default为您的git设置默认行为

git config push.default current
Run Code Online (Sandbox Code Playgroud)

或者如果您有许多存储库并希望所有存储库都相同

git config --global push.default current
Run Code Online (Sandbox Code Playgroud)

此设置中的当前流量意味着默认情况下,只有在执行git push才会推送当前分支

其他选择是:

  • 没有:不要推动任何东西
  • 匹配:推送所有匹配的分支(默认)
  • 跟踪:将当前分支推送到跟踪的任何分支
  • current:推送当前分支

更新 - 新方式做到这一点

从Git 1.7.11开始,执行以下操作:

git config --global push.default simple
Run Code Online (Sandbox Code Playgroud)

这是一个引入的新设置,其工作方式与当前相同,并且根据谣言将从v 2.0默认为git

  • 是的我读了你所指的答案,但那个答案只说明要做什么,而不是怎么做.所以我添加了我的答案,所以设置它所需的所有信息都在同一页面上. (29认同)
  • 好; 最好建议对该帖子进行编辑,因为没有人会看到你的答案,因为它不太可能获得尽可能多的票数 (3认同)

bau*_*ack 198

git push origin将推送具有匹配远程分支的本地分支上的所有更改为originAsgit push

类似于git push <remote>,<remote>当前分支的远程(或原点,如果没有为当前分支配置远程)的位置.

手册页的"示例"部分git-push

  • 这个问题很老,但对于任何新人来说,@ docgnome都是对的.只运行'git push origin'将推送所有分支而不是仅当前分支.使用'git push -f -v -n origin development'强制推送一个名为development的分支.使用-n标志来模拟git push结果,以便您可以预先看到哪些分支将受到影响.如果它看起来不错那么运行'git push -f -v origin development'.这可能是有用的http://stackoverflow.com/questions/3741136/git-push-f-vs (5认同)
  • 是的,这说清楚了.我可能正在运行旧版本的git(1.6.1.1 Mac OS X),但在手册页中没有这些示例. (2认同)
  • 因此,在我的情况下,所有本地分支具有相同的远程"origin","git push"将与"git push origin"完全相同,"git push origin"将仅推送在远程中具有相应分支的本地分支. (2认同)

neo*_*eye 54

我只是将我的代码提交到分支并将其推送到github,如下所示:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments
Run Code Online (Sandbox Code Playgroud)

  • 这个答案与这个问题有什么关系吗?:? (15认同)
  • 您可以将提交压缩为`git commit -am"..."` (3认同)

Muk*_*ain 25

这是关于Git Push的非常方便和有用的信息: Git Push:Just the Tip

git push最常见的用途是将本地更改推送到公共上游存储库.假设上游是名为"origin"的远程(如果您的存储库是克隆,则为默认远程名称),并且要更新到/来自的分支名为"master"(默认分支名称),这可以通过以下方式完成:git push origin master

git push origin 将所有本地分支的更改推送到原始远程的匹配分支.

git push origin master 将更改从本地主分支推送到远程主分支.

git push origin master:staging 将更改从本地主分支推送到远程分段分支(如果存在).


Von*_*onC 19

(2012年3月)
注意:默认的" matching"策略可能很快就会改变
(有时在git1.7.10 +之后)
:

请参阅" 请讨论:什么"git push"应该做什么,当你不说什么推? "

在当前设置(即push.default=matching)中,git push不带参数将推送本地和远程使用相同名称存在的所有分支.
这通常适用于开发人员推送到自己的公共存储库时,但在使用共享存储库时可能会造成混淆.

该提案是为了改变默认为" upstream",即只推当前分支,并将其推到分支的git拉将从拉.
另一位候选人是' current'; 这会将当前分支仅推送到同名的远程分支.

到目前为止所讨论的内容可以在这个帖子中看到:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

以前的相关讨论包括:

要加入讨论,请将您的消息发送至:git@vger.kernel.org


Mat*_*fer 18

我只是把它放在我的.gitconfig别名部分,并喜欢它的工作原理:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"
Run Code Online (Sandbox Code Playgroud)

将当前分支推送到原点git pub或与另一个回购git pub repo-name.可口.

  • 这很好,但不幸的是,假设分支在另一个存储库中具有相同的名称.试试`git push -u --repo ="origin"$ 1;`代替.它工作得很好,除非你推送到另一个存储库,分支名称将是另一个存储库使用的名称,而不是你推送的名称 (4认同)

And*_* F. 9

您可以使用命令推送当前分支

git push origin HEAD
Run Code Online (Sandbox Code Playgroud)

(从这里开始)


Cod*_*lan 8

git push会尝试将所有本地分支推送到远程服务器,这可能是你不想要的.我有几个便利设置来处理这个:

别名"gpull"和"gpush":

在我的〜/ .bash_profile中

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'
Run Code Online (Sandbox Code Playgroud)

因此,执行"gpush"或"gpull"将仅推送我的"当前打开"分支.

  • 如果您通过"Brian L"查看上面的帖子,则没有必要这样做. (5认同)
  • 如果你总是想要gpush的行为,你也可以设置remote.origin.push = HEAD(例如"git config remote.origin.push HEAD"),如git-push手册页的examples部分所述. (3认同)

ken*_*orb 7

您可以更改您的默认行为.gitconfig,例如:

[push]
  default = current
Run Code Online (Sandbox Code Playgroud)

要检查当前设置,请运行:

git config --global --get push.default
Run Code Online (Sandbox Code Playgroud)