2013-09-23 39 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