Jak wyświetlić listę gałęzi zawierających dane zatwierdzenie?

1087

Jak mogę zapytać git, aby dowiedzieć się, które gałęzie zawierają dane zatwierdzenie? gitkzwykle wypisuje gałęzie, chyba że jest ich zbyt wiele, w takim przypadku mówi tylko „wiele (38)” lub coś w tym rodzaju. Muszę znać pełną listę, a przynajmniej to, czy niektóre gałęzie zawierają zatwierdzenie.

Andrew Arnott
źródło
Podobne pytanie dotyczące równoważnego zatwierdzenia dla komentarzy: stackoverflow.com/questions/16304574/…
UpAndAdam

Odpowiedzi:

1470

Na stronie podręcznika git-branch :

 git branch --contains <commit>

Wyświetlaj tylko gałęzie zawierające określone zatwierdzenie (HEAD, jeśli nie zostało określone). Implikuje --list.


 git branch -r --contains <commit>

Listy zdalne śledzenie oddziałów , jak również (jak wspomniano w user3941992 „s odpowiedź poniżej), który jest«lokalne oddziały, które mają bezpośredni związek ze zdalną gałąź».


Zobacz także ten artykuł gotowy do użycia z Git .

--containsTag będzie dowiedzieć się, czy dany commit została wniesiona w jeszcze do swojego oddziału. Być może masz zatwierdzenie SHA z łatki, którą myślałeś, że zastosowałeś, lub po prostu chcesz sprawdzić, czy zatwierdzenie dla twojego ulubionego projektu open source, który zmniejsza zużycie pamięci o 75%, jest już dostępne.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <[email protected]>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

Uwaga: jeśli zatwierdzenie znajduje się w gałęzi zdalnego śledzenia , dodaj -aopcję .
(jak komentuje MichielB poniżej )

git branch -a --contains <commit>

MatrixFrog komentuje, że pokazuje tylko, które gałęzie zawierają to dokładne zatwierdzenie.
Jeśli chcesz wiedzieć, które gałęzie zawierają „równoważne” zatwierdzenie (tj. Które gałęzie wybrały tę opcję) git cherry:

Ponieważ git cherry porównuje zestaw zmian zamiast identyfikatora zatwierdzenia (sha1) , możesz użyć, git cherryaby dowiedzieć się, czy zatwierdzenie dokonane lokalnie zostało zastosowane <upstream>pod innym identyfikatorem zatwierdzenia.
Dzieje się tak na przykład, jeśli dodajesz łatki <upstream>pocztą e-mail zamiast bezpośrednio wypychać lub wyciągać zatwierdzenia.

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>

(Tutaj zatwierdzenia oznaczone „ -” nie pojawiałyby się git cherry, co oznacza, że ​​są już obecne <upstream>.)

VonC
źródło
3
testsoraz master- masterjest bieżącą gałęzią, dlatego gwiazdka.
niebieskawy
54
To pokazuje tylko, które gałęzie zawierają to dokładne zatwierdzenie . Jeśli chcesz wiedzieć, które gałęzie zawierają „ekwiwalentne” zatwierdzenie (tj. Które gałęzie wybrały ten zatwierdzenie), to znaczy git cherry: „Ponieważ git cherry porównuje zestaw zmian zamiast identyfikatora zatwierdzenia (sha1), możesz użyć git cherry, aby się dowiedzieć jeśli zatwierdzenie, które dokonałeś lokalnie, zostało zastosowane <upstream> pod innym identyfikatorem zatwierdzenia. Na przykład stanie się tak, jeśli będziesz podawać łatki <upstream> pocztą elektroniczną zamiast bezpośrednio wypychać lub wyciągać zatwierdzenia. " kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog
62
Dodaj -aparametr, aby również sprawdzić zdalne gałęzie.
Raman
28
Możesz też zrobić git tag --contains <commit>. Zobacz Wyszukiwanie wszystkich tagów zawierających zatwierdzenie? .
Andrew Marshall,
5
W git cherryczęści @UpAndAdam zadałem pytanie tutaj: stackoverflow.com/questions/16304574/… , niestety, na pytanie (jeszcze) nie udzielono odpowiedzi.
adeelx,
22

Możesz uruchomić:

git log <SHA1>..HEAD --ancestry-path --merges

Z komentarza ostatniego zatwierdzenia w danych wyjściowych można znaleźć oryginalną nazwę gałęzi

Przykład:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master
Eugen Konkov
źródło
6
Miły! Kiedyś git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1, aby dostać to w jednej linii
James EJ
1
Jeśli chcesz użyć czystego polecenia git, możesz użyć:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz
Uwaga: Gdy twoje zatwierdzenie sha jest ostatnim zatwierdzeniem w gałęzi master / foo (HEAD) ... nie możesz wykonać A..Bzakresu zatwierdzeń, po prostu nie używaj takiego zakresu :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode,
Jeśli to repozytorium git jest submodułem i próbujesz rozwiązać odłączony problem HEAD ... to masz trudne pytanie o preferowaną gałąź ... W moim poprzednim przykładzie można łatwo powiedzieć, że masterzawsze jest preferowane, jeśli jest na tej liście . Stamtąd jest mniej jasne. Można spróbować odczytać git oddział z pliku .gitmodules: git config -f .gitmodules submodule.src/foo/submodule.branch. Może to być długo stojący widelec / pr. Możesz cd repo root i uruchomić git config submodule.src/foo/submodule.branch. Możesz również użyć superprojektu bieżącej gałęzi git.
Devin G Rhode,
Na marginesie: git config submodule.src/foo/submodule.branchmoże mieć na nią wpływ dowolna konfiguracja git, w tym lokalny plik .gitconfig repo. (wymaga uruchomienia git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode,