Come elencare i rami che contengono un determinato commit?


1088

Come posso eseguire una query su git per scoprire quali rami contengono un determinato commit? gitkdi solito elencherò i rami, a meno che non ce ne siano troppi, nel qual caso si dice semplicemente "molti (38)" o qualcosa del genere. Devo conoscere l'elenco completo o almeno se alcuni rami contengono il commit.



Questione connessa per un controvalore commettere per commenti: stackoverflow.com/questions/16304574/...
UpAndAdam

Risposte:


1471

Dalla pagina del manuale di git-branch :

 git branch --contains <commit>

Elenca solo i rami che contengono il commit specificato (HEAD se non specificato). Implica --list.


 git branch -r --contains <commit>

Liste di monitoraggio a distanza rami così (come indicato nel user3941992 's risposta di seguito) che è 'rami locali che hanno una relazione diretta con un ramo remoto'.


Vedi anche questo articolo pronto per Git .

Il --containstag capirà se un certo commit è già stato inserito nel tuo ramo. Forse hai ottenuto un commit SHA da una patch che pensavi di aver applicato, o vuoi solo verificare se è ancora attivo il commit per il tuo progetto open source preferito che riduce l'utilizzo della memoria del 75%.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <nick@quaran.to>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

Nota: se il commit è su un ramo di tracciamento remoto , aggiungere l' -aopzione .
(come MichielB commenta di seguito )

git branch -a --contains <commit>

MatrixFrog commenta che mostra solo quali rami contengono quel commit esatto .
Se vuoi sapere quali rami contengono un commit "equivalente" (ovvero quali rami hanno scelto ciliegie quel commit) questo è git cherry:

Poiché git cherry confronta il changeset piuttosto che l'ID commit (sha1) , è possibile utilizzare git cherryper scoprire se un commit effettuato localmente è stato applicato <upstream>con un ID commit diverso.
Ad esempio, questo accadrà se stai inviando patch <upstream>via e-mail anziché spingere o tirare direttamente i commit.

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

(Qui, i commit contrassegnati con ' -' non si presentano git cherry, nel senso che sono già presenti <upstream>.)


3
testse master- masterè il ramo corrente, quindi l'asterisco.
azzurrato il

54
Questo mostra solo quali rami contengono quel commit esatto . Se vuoi sapere quali rami contengono un commit "equivalente" (ovvero quali rami hanno scelto cherry quel commit) è git cherry: "Poiché git cherry confronta il changeset piuttosto che il commit id (sha1), puoi usare git cherry per scoprire se un commit effettuato localmente è stato applicato <upstream> con un ID commit diverso. Ad esempio, ciò accadrà se si stanno alimentando patch <upstream> tramite e-mail invece di inviare o estrarre direttamente i commit. " kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog

62
Aggiungi un -aparametro per controllare anche i rami remoti.
Raman,

28
Puoi anche fare git tag --contains <commit>. Vedi Ricerca di tutti i tag che contengono un commit? .
Andrew Marshall,

5
Per la git cherryparte @UpAndAdam ha posto la domanda qui: stackoverflow.com/questions/16304574/… , ahimè, la domanda non ha (ancora) avuto risposta.
adeelx,

22

Puoi eseguire:

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

Dal commento dell'ultimo commit nell'output potresti trovare il nome del ramo originale

Esempio:

       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

6
Bello! Lo facevo git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1in una riga
James EJ l'

1
Se si desidera utilizzare il comando pure git, è possibile utilizzare:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz il

Nota: quando il commit sha è il commit più recente sul ramo master / foo (HEAD) ... non puoi eseguire un A..Bintervallo di commit, non usare un intervallo come questo :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode

Se questo repository git è un sottomodulo e stai cercando di risolvere il problema HEAD distaccato ... allora hai una domanda difficile su un ramo preferito ... Nel mio esempio precedente potresti facilmente dire che masterè sempre preferito se è in questo elenco . Da lì è meno chiaro. Si potrebbe provare a leggere ramo git dal file .gitmodules: git config -f .gitmodules submodule.src/foo/submodule.branch. Questa potrebbe essere una forcella / pr di vecchia data. È possibile eseguire il cd per repo root ed eseguire git config submodule.src/foo/submodule.branch. Puoi anche usare il ramo git corrente dei superprogetti.
Devin G Rhode,

Per git config submodule.src/foo/submodule.branchinciso : può essere influenzato da qualsiasi varietà di configurazioni git, incluso un file .gitconfig repo-local. (richiede corsa git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.