2013-09-23 13 views
7

Jako przykład załóżmy, że chcesz napisać alias git, który pokazuje różnicę między bieżącą gałęzią a jej partnerem origin.Odnośnik bieżący i początek/<current> w git alias

W konkretnym przypadku pana to wyglądać następująco:

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

Jak wymienić master?

Odpowiedz

16

Jeśli twoja wersja git nie jest absurdalnie stara, ciąg @{u} oznacza "w górę", tj. Niezależnie od pochodzenia/foo bieżącego odgałęzienia jest śledzenie. (A: HEAD oznacza „bieżący oddziału, jeśli na gałęzi”, i pomijając coś w składni .. oznacza HEAD). Tak więc, @{u}.. oznacza „wszystko w głowie, który nie jest w jego upstream”:

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

Czy możesz połączyć trochę dokumentacji? Skąd wiesz, że "@ {u}" oznacza "upstream"? Czy są jeszcze inne opcje "@ {...}"? – erikbwork

+2

Tak, miejsca do zobaczenia znajdują się w dokumentacji dla ['git-rev-parse'] (https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html) i ['git-rev-list'] (https://www.kernel.org/pub/software/scm/git/docs/git-rev-list.html). Istnieje mnóstwo ciekawych opcji składni, ja używam 'rev ^' przez cały czas i 'rev^{commit}' na przykład rzadko i wciąż próbuję zacząć używać 'branch @ {n}' more. – torek

+0

+1: Pan jest jakimś czarodziejem ... –

2

Jednym ze sposobów, aby to zrobić:

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

który zamienia alias do polecenia powłoki, co daje zdolność do poleceń gniazdowych.

+2

ten Zakłada się, że jeśli korzystasz z oddziału 'foo', jego wersja źródłowa to' origin/foo', co jest uzasadnione ze względu na sposób zadawania pytania. Jednak możliwe jest, że rzeczywisty upstream, jeśli taki istnieje, to 'origin/bar' lub może' other-remote/foo' lub nawet 'other-remote/bar'. Sugerowałbym też użycie 'git symbolic-ref --abbrev HEAD' w przypadku odłączenia HEAD, chociaż to prowadzi do pytania, jak nieudolnie zawodzić :-) – torek

+1

@torek Masz na myśli' git symbolic-ref - krótki HEAD', prawda? – erikbwork

+1

@ erikb85: er, tak, miał '--abbrev-ref' utknął w mojej głowie lub coś; potrzeby symboliczne '--short' tutaj .. – torek