如何避免执行“git branch --setup-upstream”命令,而是默认自动设置远程跟踪?

1960
我在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中。我怎样才能将此设置为默认行为呢?

34
branch.autosetupmerge 的默认设置意味着,当从远程跟踪分支(例如 <remote-name>/<branch-name>) 创建分支时,新分支的上游配置才会自动设置 (参见 git-config(1)). 你可能是从现有的本地分支创建分支。如果你要直接从远程分支的最新提交(尽管你在本地分支上)创建分支,则可以使用 git branch my_branch <remote-name>/<branch-name> 自动设置上游配置。 - Chris Johnsen
27
FYI,--set-upstream选项已被弃用。应使用--track--set-upstream-to代替。 - Sean the Bean
215
如果--set-upstream已经被弃用,那么Git开发者应该从帮助信息中移除它,这样当你在没有设置上游分支的情况下运行git push时,就不会再显示该选项了。 - Christopher Hunter
24
自从你发表评论以来已经过了一年,但是它仍然没有改变。这只是一个草率的反馈意见,还是可能有一个我们不知道的技术上明智的原因让它保留下来? - Konrad Viltersten
50
git branch --set-upstream 已经被废弃,git push --set-upstream 没有被废弃。 - Rag
显示剩余7条评论
29个回答

3

您可以通过运行以下任一git命令,让git自动创建上游分支:

  1. git config --global --add push.default current
  2. git config --global --add push.autoSetupRemote true

注:请保留html标签。

2
由于git具有将不同分支推送/拉取到不同的“上游”存储库的酷炫功能。 甚至可以在相同分支上使用单独的存储库进行推送和拉取。 这可以创建分布式,多层次的流程,我可以看到这在像Linux内核这样的项目中非常有用。 Git最初就是为该项目而构建的,因此它不会假设您的分支应该跟踪哪个存储库。
另一方面,大多数人并不以这种方式使用git,因此默认选项可能是一个好主意。
Git通常相当低级,并且可能令人沮丧。 但是有GUI和辅助脚本应该很容易编写,如果您仍然想从shell中使用它。

1

我们使用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

1
这里是一个针对git push的bash别名,可以安全地用于每次push,并且会自动在第一次push时切换到设置upstream,之后进行正常的push操作。
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

原始帖子


出现错误:所请求的上游分支“origin/test”不存在。 - Vitaly Zdanevich

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)。


1
你也可以执行 git push -u origin $(current_branch)

0

这里有很多好的答案,但是在运行git pull之前,它们都需要你正确地执行其他操作。

当然,拥有像“通过创建一个远程分支来使git push按照应有的方式工作,并使本地分支正确跟踪”这样的别名肯定会有所帮助。但是,当你忘记使用它们或者使用了不同的工作流程时,这些都没有帮助。

这里有一个bash函数,可以检测到您没有配置远程合并目标,但是远程存在与本地分支同名的分支,并将该分支设置为合并目标,然后进行拉取,以便按照应有的方式执行拉取操作。

git-pulldown() {
    head="$(git rev-parse --abbrev-ref HEAD)"

    if [[ $(git config "branch.$head.merge") ]]; then #there's already a merge target configured, just pull as normal from there
        git pull
    else
        if [[ $(git ls-remote --heads origin $head) ]]; then #there is an upstream branch existing with the same name as our branch
            git branch --set-upstream-to origin/$head #set merge target to upstream branch with same name
            git pull
        else #fail with explanation
            echo "Branch $head has no upstream or merge target! You will likely have to push first, or manually configure it"
            return 1
        fi
    fi
}

0

因为这个问题(仅限于OS X),我重新发现了legit。现在,我在分支时只使用以下两个命令:

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

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

SublimeGit默认支持legit,使得整个分支过程就像按下Ctrl-b一样简单。


-1

显然没有支持的方法来覆盖git命令的默认选项。根据这个答案使用相同名称定义git别名以遮蔽原始命令,我们可以在bash中覆盖git push的行为,使其总是调用git push -u。将以下内容放入您的~/.bash_profile文件中,它应该等同于每次推送时运行--set-upstream。

function do_git {
  cmd=$1
  shift
  myArgs=( "$@" )

  if [ "$cmd" == "push" ]; then
    myArgs=( "-u" "${myArgs[@]}" )
  fi
  myArgs=( "$cmd" "${myArgs[@]}" )

  $(which git) "${myArgs[@]}"
}
alias  git='do_git'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接