为什么我需要一直做`--set-upstream`?

时间:2011-05-22 16:39:50

标签: git git-branch

我在Git中创建了一个新分支:

git branch my_branch

推它:

git push origin my_branch

现在说有人在服务器上做了一些更改,我想从origin/my_branch开始。我这样做:

git pull

但我明白了:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

我了解到我可以使用它:

git branch --set-upstream my_branch origin/my_branch

但为什么我需要为我创建的每个分支执行此操作?如果我将my_branch推入origin/my_branch,那么我是否愿意将origin/my_branch拉入my_branch?如何将其设为默认行为?

22 个答案:

答案 0 :(得分:1368)

不依赖于记住git branch --set-upstream 1 的语法的快捷方式是:

git push -u origin my_branch

......你第一次推动那个分支。或者,将当前分支推送到同名分支(方便别名):

git push -u origin HEAD

您只需使用-u一次,就可以origingit branch --set-upstream一样设置分支与git branch --set-upstream-to之间的关联。

就个人而言,我认为必须明确地在分支机构和远程分支机构之间建立关联是一件好事。很遗憾,规则是different for git push and git pull


1 这可能听起来很傻,但我经常忘记指定当前分支,假设这是默认值 - 它不是,结果最令人困惑:)

更新2012-10-11 :显然我并不是唯一一个容易出错的人!感谢VonC指出git 1.8.0引入了更明显的my_branch,如果您在分支git branch --set-upstream-to origin/my_branch 上,可以按如下方式使用:

git branch -u origin/my_branch

...或使用短选项:

git branch --set-upstream origin/master

此更改及其推理在the release notes for git 1.8.0, release candidate 1

中有所描述
  

很有可能说origin/master,但这告诉Git安排本地分支--set-upstream-to与当前签出的分支集成,这是用户意味着什么的极不可能。该选项已弃用;使用新的-u(使用短而甜蜜的{{1}})选项。

答案 1 :(得分:1144)

您可以通过减少输入来实现这一目标。首先,改变推送的工作方式:

git config --global push.default current

这将推断origin my_branch部分,因此您可以这样做:

git push -u

这将创建具有相同名称的远程分支并跟踪它。

答案 2 :(得分:80)

你可以简单地

git checkout -b my-branch origin/whatever
首先是

。如果您将branch.autosetupmergebranch.autosetuprebase(我最喜欢的)设置为always(默认为true),则my-branch会自动跟踪origin/whatever

请参阅git help config

答案 3 :(得分:67)

您可以通过两种方式设置上游更简单。首先,当您创建分支时:

git branch -u origin/my-branch

或在创建分支后,您可以使用此命令。

git push -u origin my-branch

您还可以在一个命令中分支,检出和设置上游:

git checkout -b my-branch -t origin/my-branch

我个人倾向于通过两步执行此操作:

git checkout -b my-branch
git push -u origin my-branch

答案 4 :(得分:52)

这是The Fuck最常见的用途。

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

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

此外,在终端中键入脏话词也很有趣。

答案 5 :(得分:41)

您可以使用:

  

git config --global branch.autosetupmerge总是

每次创建或签出新分支时都会链接上游分支。

请参阅https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

这也适用于autosetuprebase,如果你遵循更多以rebase为重点的工作流程,但除非你知道你正在做什么,否则不要使用它,因为它会将你的拉动行为默认为rebase,这可能会导致奇怪的结果。

答案 6 :(得分:34)

顺便说一下,将当前分支推送到具有相同名称的远程的快捷方式:

$ git push -u origin HEAD

答案 7 :(得分:12)

 - (BOOL)prefersStatusBarHidden {

   return NO;
}

答案 8 :(得分:9)

您还可以明确告诉git pull要拉出哪个远程分支(如错误消息中所述):

git pull <remote-name> <remote-branch>

小心这一点,但是:如果你在一个不同的分支上并做一个明确的拉动,你拉的refspec将被合并到你正在进行的分支中!

答案 9 :(得分:9)

对于它的价值,如果你试图跟踪遥控器上已经存在的分支(例如origin / somebranch)但尚未在本地检查它,你可以这样做:

$ git checkout --track origin/somebranch

注意:' - t'是'--track'选项的缩短版本。

这样即可立即建立相同的关联。

答案 10 :(得分:9)

我个人在bash中使用以下别名

在〜/ .gitconfig文件中

[alias]
    pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"

,并在〜/ .basehrc或〜/ .zshrc文件中

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"

答案 11 :(得分:8)

我使用这个Git别名,而不是每次都复制/粘贴Git的建议:https://gist.github.com/ekilah/88a880c84a50b73bd306

下面复制的来源(将其添加到您的~/.gitconfig文件中):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"

答案 12 :(得分:7)

你可以设置一个非常好的别名来处理这个,而不需要过于冗长的语法。

我在~/.gitconfig中有以下别名:

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

在新分支上提交后,只需输入命令即可推送新分支:

git po

答案 13 :(得分:3)

对于那些寻找与git pull一起使用的别名的人来说,这就是我使用的:

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"

现在每当你得到:

$ git pull
There is no tracking information for the current branch.
...

跑步:

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull

你很高兴

答案 14 :(得分:3)

如果以下方法不起作用:

git config --global push.default current

您还应该更新项目的本地配置,因为您的项目可能具有本地git配置:

git config --local push.default current

答案 15 :(得分:2)

您也可以git push -u origin $(current_branch)

答案 16 :(得分:2)

因为git具有很强的推动/拉动不同分支到不同上游的能力。库。您甚至可以使用单独的存储库来推送和拉动 - 在同一个分支上。这可以创建一个分布式的多级流程,我可以看到这对Linux内核等项目非常有用。 Git最初是为在该项目中使用而构建的。

因此,它不会假设您的分支机构应该跟踪哪个仓库。

另一方面,大多数人不会以这种方式使用git,因此它可能是默认选项的好例子。

Git通常很低级,但令人沮丧。然而,有GUI,如果您仍想从shell中使用它,编写辅助脚本应该很容易。

答案 17 :(得分:1)

我只想做这样的事情:

git checkout -b my-branch
git commit -a -m "my commit"
git push

由于找不到更好的解决方案,因此我刚刚在~/.bashrc上创建了bash别名:

alias push="git push -u origin HEAD"

现在只需执行push命令即可​​完成工作(您也可以在别名~/.gitconfig上添加别名,例如pushup

答案 18 :(得分:1)

在 99% 的情况下,我想将上游设置为 同名分支,所以我使用它(在 *nix 或 Git Bash 中):

git branch --set-upstream-to=origin/`git branch --show-current`

这很好,因为它与分支无关。请注意,子命令 git branch --show-current 会打印您当前的分支名称,如果您已分离,则不会打印任何内容。

旁注:我的配置设置为可以使用 git push -u,所以我很少需要这样做。但有时我仍然这样做,通常是当我决定将我的本地更改重置为远程上的任何内容时,那一刻我意识到我之前没有 -u 推送。因此,通常在设置上游后我要运行的下一个命令是重置到远程分支:

git reset --hard @{u}

这也恰好是分支不可知的。 (也许我真的不喜欢输入我的分支名称。)

答案 19 :(得分:0)

由于此问题,我有点重新发现legit(仅限OS X)。现在我在分支时使用的是这两个命令:

legit publish [<branch>]     将指定分支发布到远程。 (别名:pub

legit unpublish <branch>     从远程删除指定的分支。 (别名:unp

默认情况下,

SublimeGit附带legit支持,这使得整个分支例程就像按Ctrl-b一样简单。

答案 20 :(得分:0)

使用phabricator,不使用git推。我必须创建适用于Linux / mac

的bash别名
vim ~/.bash_aliases

new_branch() {
    git checkout -b "$1"
    git branch --set-upstream-to=origin/master "$1"
}

保存

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull

答案 21 :(得分:0)

这是git push的bash别名,可以在每次推送时安全运行,并且会自动在第一次推送的上游设置和随后的正常推送之间切换。

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

Original Post