Git do przodu / do tyłu informacji między kapitanem a oddziałem?

201

W moim lokalnym repo ( test-branch) utworzyłem gałąź do testowania, do której wypchnąłem Github.

Jeśli przejdę do mojego Githubkonta i wybiorę to test-branch, wyświetli się informacja:

This branch is 1 commit ahead and 2 commits behind master

Moje pytania to:

  1. Jak mogę wyświetlić te informacje lokalnie (tj: polecenie, które pokazuje to na terminalu, zamiast konieczności otwierania, Githubaby je zobaczyć)?
  2. Wiem, że widzę różnice między gałęziami za pomocą:

    git diff master..test-branch
    

    lub używając Meld(co wolę):

    git difftool master..test-branch
    

    ale zastanawiałem się, czy istnieje sposób, aby zobaczyć osobno przed i za zatwierdzenia. IE: czy istnieje sposób, aby pokazać, że 1 zobowiązuje się sam, a następnie 2 same się zobowiązuje ?

Gabriel
źródło
1
Git 2.5+ (Q2 2015) wprowadzi git for-each-ref --format="%(push:track)" refs/heads. Zobacz moją odpowiedź poniżej
VonC
1
Ponieważ nie mogłem znaleźć tego pytania za pomocą słów kluczowych, które zamierzam napisać, chcę tylko zauważyć, że sprowadza się to do względnego uzupełnienia (lub „różnicy zestawu”) między zestawami zatwierdzeń tworzących te gałęzie (i następnie licząc elementy). Mam nadzieję, że dzięki temu będzie to w indeksach wyszukiwarek.
pmos

Odpowiedzi:

309

Oto sztuczka, którą znalazłem, aby porównać dwie gałęzie i pokazać, ile zatwierdzeń każda gałąź wyprzedza drugą (bardziej ogólna odpowiedź na twoje pytanie 1):

Dla lokalnych oddziałów: git rev-list --left-right --count master...test-branch

Dla zdalnych oddziałów: git rev-list --left-right --count origin/master...origin/test-branch

Daje to wynik jak poniżej:

1 7

Te środki wyjściowe: „w porównaniu do master, test-branchwynosi 7 Zobowiązuje do przodu i 1 popełnić tyle.”

Możesz także porównać oddziały lokalne z oddziałami zdalnymi, np. origin/master...masterAby dowiedzieć się, ile zatwierdzeń masteroddział lokalny jest przed / za swoim zdalnym odpowiednikiem.

użytkownik1834095
źródło
1
Jest to dla mnie świetne rozwiązanie, aby dowiedzieć się, czy mogę usunąć gałąź lub czy jest jeszcze w fazie rozwoju.
Maverick1st
1
@ Maverick1st, tak, to polecenie jest szczególnie przydatne, gdy śledzisz przepływ pracy gitflow (którym jestem)
user1834095,
2
Jest to najlepszy w moim przypadku przypadek sprawdzenia, czy twoja obecna gałąź funkcji stoi za zdalnym master ( git rev-list --left-right --count origin/master...@) - pod warunkiem, że użytkownik zrobił to git fetchwcześniej; przydatne, aby zapobiec żądaniom ściągania z nieaktualnych gałęzi.
jakub.g
9
Aby sprawdzić, jak wiele zobowiązuje tyłu jest obecny oddział:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g
8
@ jakub.g nie musisz ciąć, jeśli używasz --left-onlylub--right-only
jasonkarns
39

Przede wszystkim, aby zobaczyć, ile poprawek masz za lokalnymi, powinieneś zrobić, git fetchaby upewnić się, że masz najnowsze informacje z pilota.

Domyślne wyjście git statusmówi, ile wersji masz przed sobą lub za nimi, ale zwykle uważam to za zbyt szczegółowe:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Wolę git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

W rzeczywistości alias to po prostu git si jest to główne polecenie, którego używam do sprawdzania statusu.

Aby zobaczyć różnicę w „wersjach z wyprzedzeniem” master, mogę wykluczyć „korekty z tyłu” zorigin/master :

git diff master..origin/master^

Aby zobaczyć różnicę w „wersjach za” origin/master, mogę wykluczyć „wersje przed” z master:

git diff origin/master..master^^

Jeśli jest 5 wersji przed lub za, łatwiej może być napisać w ten sposób:

git diff master..origin/master~5
git diff origin/master..master~5

AKTUALIZACJA

Aby zobaczyć wersje przed / za, oddział musi być skonfigurowany do śledzenia innego oddziału. Dla mnie jest to domyślne zachowanie, gdy klonuję zdalne repozytorium i po wypchnięciu gałęzigit push -u remotename branchname . Moja wersja to 1.8.4.3, ale tak to działa tak długo, jak pamiętam.

Od wersji 1.8 możesz ustawić gałąź śledzenia w następujący sposób:

git branch --track test-branch

Od wersji 1.7 składnia była inna:

git branch --set-upstream test-branch
janos
źródło
Jakiej wersji gitużywasz? Nie mogę odtworzyć tego, co dostajesz git statusani z, ani z git status -sb. Jeśli spróbuję wykonać dowolne polecenie (po wykonaniu git fetch), nie otrzymam żadnych informacji na temat zatwierdzeń przed / za.
Gabriel,
8
Twój sposób na zobaczenie zatwierdzeń z przodu iz tyłu jest zastosowany do masteri origin/masterchcę zobaczyć te różnice dla masteri innej gałęzi test-branch. Czy możesz sformatować swoją odpowiedź w celu rozwiązania tego problemu?
Gabriel
Różnice w wersjach „za” i „przed” działają tylko dla mnie, jeśli użyję 3 kropek między nazwami gałęzi (nie 2). I ^ i ^^ nie wydają się tutaj mieć znaczenia. Np .: git diff master ... origin / master git diff origin / master ... master W każdym razie, "git status -sb" był bardzo pomocny.
Vituel
10

W Git 2.5+ masz teraz inną opcję, aby zobaczyć przód / tył dla wszystkich gałęzi, które są skonfigurowane do przekazywania do gałęzi.

git for-each-ref --format="%(push:track)" refs/heads

Zobacz więcej w „ Wyświetlanie niepochodzących poleceń Git

VonC
źródło
Czy możesz to zrobić tylko dla bieżącej gałęzi i jej gałęzi zdalnego śledzenia?
spex
@spex tak: wraz refs/headsz nazwą bieżącego oddziału ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC
3

Możesz także użyć awkgo, aby był trochę ładniejszy:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Możesz nawet utworzyć alias, który zawsze najpierw pobiera pochodzenie, a następnie porównuje gałęzie

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"
Antonis
źródło
1

Po wykonaniu pobierania git, możesz uruchomić status git, aby pokazać, ile zatwierdzeń lokalny oddział jest przed lub za zdalną wersją oddziału.

Nie pokaże ci jednak, ile zatwierdzeń wyprzedza lub opóźnia inny oddział. Masz do dyspozycji pełną wersję, patrząc na github lub korzystając z rozwiązania takiego jak Vimhsa, do którego link znajduje się powyżej: Status Git nad wszystkimi repozytoriami

Wade Williams
źródło