2013-09-23 38 views
7

作为一个例子,假设您要编写一个git别名,它显示当前分支与其origin合作伙伴之间的差异。参考当前分支和起源/ <current>在git别名

在主人的特殊情况下,它看起来如下:

[alias] 
    top = log --oneline --graph --decorate master ^origin/master 

如何更换master

回答

16

如果你的git版本不是很古怪,字符串@{u}意味着“上游”,即无论当前分支正在跟踪的origin/foo。 (并且:HEAD表示“当前分支,如果在一个分支”,并省略东西在..语法意味着HEAD。)因此,@{u}..的意思是“在HEAD一切不是在其上游”:

[alias] 
    top = log --oneline --graph --decorate @{u}.. 
+2

你能链接一些文件吗?你怎么知道'@ {u}'意味着上游?还有其他的'@ {...}'选项吗? – erikbwork

+2

是的,要查看的地方在['git-rev-parse']的文档中(https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html)和['git-rev-list'](https://www.kernel.org/pub/software/scm/git/docs/git-rev-list.html)。有很多时髦的语法选项,例如,我总是使用'rev ^',而很少使用'rev^{commit}',并且仍尝试着更多地使用'branch @ {n}'。 – torek

+0

+1:你先生是某种巫师...... –

2

一种方式做到这一点:

[alias] 
    top = "!git log --oneline --graph --decorate `git rev-parse --abbrev-ref HEAD` ^origin/`git rev-parse --abbrev-ref HEAD`" 

果然别名到一个shell命令,它给你的能力嵌套命令。

+2

这假定如果你在分支'foo'上,上游版本是'origin/foo',考虑到问题的方式,这是合理的。但是,实际的上行链路(如果有的话)可能是'origin/bar'或者可能是'other-remote/foo'或甚至'other-remote/bar'。另外我会建议在'HEAD'分离的情况下使用'git symbolic-ref --abbrev HEAD',但这会带来如何优雅地失败的问题:-) – torek

+1

@torek你的意思是'git symbolic-ref - 短HEAD',对吗? – erikbwork

+1

@ erikb85:呃,是的,有'--abbrev-ref'卡在我的脑海里或什么东西;符号需求'--short'在这里.. – torek