当前分支上的Git别名

40
我希望您能改进我的当前别名,大部分别名都适用于一个分支。 有没有一种方法可以在git别名中引用当前分支,以便我无需每次都传递它?
像这样的一个:
git config alias.po "push origin"

用法如下:

git po foo_branch

我希望只运行git po,并将当前分支作为参数传递。


2
git rev-parse --abbrev-ref HEAD 是我用来获取当前分支的命令。 - Learath2
1
一个简单的(在别名中)git push origin HEAD不就足够了吗?我不明白所有这些rev-parsing的意义...我错过了什么吗? :-) - Romain Valeri
4个回答

86
[alias]
  po = "!git push --set-upstream origin \"$(git rev-parse --abbrev-ref HEAD)\""

很棒的答案!唯一的注意事项是我直接从命令行执行,它将我的当前分支硬编码到了命令行中 :)在配置文件中直接操作就可以正常工作。 - CubanX
2
为什么!git中要使用感叹号?我知道在bash中的任何感叹号都是做什么用的,但不确定这里使用它的原因。 - Jared Beck
3
感叹号允许您在shell中执行其后的所有内容,即允许您执行任何命令而不仅仅是别名中的git命令。 - Patricia Garcia
2
太好了。此外,在https://gist.github.com/robmiller/6018582上,您可以找到一个漂亮的别名集合(包括一个适合作为OP问题答案的别名)。 - Frederik Struck-Schøning
太好了,谢谢。每次输入 git push origin -u BranchName 太麻烦了! - LeOn - Han Li
显示剩余2条评论

15

git symbolic-ref --short HEAD 命令可以打印当前分支,因此您可以定义一个简单的 shell 别名:

alias gpo='git push origin "$(git symbolic-ref --short HEAD)"'

似乎没有必要将错误消息打印到标准错误输出,最后再将其重定向到/dev/null中丢弃。虽然我猜这可能是一个复制粘贴的情况。 - Victor Zamanian
git config --global alias.po "push origin '$(git symbolic-ref --short HEAD)'" 对我起了作用。 - Ramon Dias

7

从Git 2.0开始,default push行为将是simple

除非push.default设置为matching,否则不指定参数的git push始终会推送当前分支,所以在这种情况下您无需指定它。


3
我认为这不正确。git push 的默认操作取决于 .gitconfig 中的 push.default 设置。 - user355252
是的,但只有在设置为“匹配”时才是这种情况。 - CharlesB
实际上,matching 是当前 push.default 的默认值,所以我已经修改了我的答案。 - CharlesB
4
还有一个“current”值:git config --global push.default current。这是我处理它的方式(对于我的Git版本1.8)。 - plus-

0

从你的问题中并不完全清楚你需要哪个别名。

这将推送当前检出的分支:

git config alias.po !f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git push origin $tmp_branch; unset $tmp_branch; }; f

这将推送给定的分支名称(git po branchName):
git config alias.po !f() { git push origin $1; }; f

1
使用 git symbolic-ref HEAD 获取当前分支。这样应该会更快。 - user355252
1
@lunaryorn为什么不用git rev-parse --abbrev-ref HEAD呢?它可以返回不带refs前缀的分支名称。 - vladkras
感谢您发布函数别名,这对我创建需要将分支名称保存在变量中的别名非常有用。 - James Ehly

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