我在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/mi_branch拉到my_brance,这不是很明显吗?如何将此设置为默认行为?


当前回答

我做了一些类似于许多其他用户的事情,但我想分享它作为一种替代,因为我没有看到其他人发布这篇文章。

alias gpu='git push --set-upstream origin $(git branch --show-current)'

(噢,我的zsh已经有一个gpu别名,在.oh-my-zsh/plugins/git/git.plugin.zsh中进行了编辑)

其他回答

我做了一些类似于许多其他用户的事情,但我想分享它作为一种替代,因为我没有看到其他人发布这篇文章。

alias gpu='git push --set-upstream origin $(git branch --show-current)'

(噢,我的zsh已经有一个gpu别名,在.oh-my-zsh/plugins/git/git.plugin.zsh中进行了编辑)

你可以用更少的打字来实现这一点。首先,改变推送的工作方式:

git config --global push.default current

这将推断出原点my_branch部分,因此您可以执行以下操作:

git push -u

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

显然没有支持的方法来覆盖git命令的默认选项。根据对定义与shadow原始命令同名的git别名的回答,我们可以重写bash中git push的行为,始终调用git push-u。将以下内容放在~/.bash_profile文件中,它应该相当于每次推送时都在上游运行--set。

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'

噢,我的zsh的git插件已经将其别名为gpsup。这将推送并设置分支的上游。一气呵成!

我个人喜欢标准化和一致的解决方案。建议其他人使用相同的别名。:)

您可以设置一个非常好的别名来处理这个问题,而无需过于冗长的语法。

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

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

对新分支进行提交后,只需键入以下命令即可推送新分支:

git po