¿Cómo enumerar las ramas que contienen un commit dado?

1088

¿Cómo puedo consultar git para averiguar qué ramas contienen una confirmación dada? gitkgeneralmente enumerará las ramas, a menos que haya demasiadas, en cuyo caso solo dice "muchas (38)" o algo así. Necesito saber la lista completa, o al menos si ciertas ramas contienen el commit.

Andrew Arnott
fuente
Pregunta relacionada para una confirmación equivalente por comentarios: stackoverflow.com/questions/16304574/…
UpAndAdam

Respuestas:

1471

Desde la página de manual de git-branch :

 git branch --contains <commit>

Enumere solo las ramas que contienen el commit especificado (HEAD si no se especifica). Implica --list.


 git branch -r --contains <commit>

Enumera también las ramas de seguimiento remoto (como se menciona en la respuesta del usuario 3941992 a continuación) que son "ramas locales que tienen una relación directa con una rama remota".


Vea también este artículo de git ready .

La --containsetiqueta determinará si una determinada confirmación se ha introducido aún en su rama. Quizás tenga un SHA de confirmación de un parche que pensó que había aplicado, o simplemente desea verificar si la confirmación para su proyecto de código abierto favorito que reduce el uso de memoria en un 75% todavía está disponible.

$ 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

Nota: si el commit está en una rama de seguimiento remota , agregue la -aopción .
(como comenta MichielB a continuación )

git branch -a --contains <commit>

MatrixFrog comenta que solo muestra qué ramas contienen esa confirmación exacta .
Si desea saber qué ramas contienen una confirmación "equivalente" (es decir, qué ramas han seleccionado esa confirmación) eso es git cherry:

Debido a que git cherry compara el conjunto de cambios en lugar de la ID de confirmación (sha1) , puede usar git cherrypara averiguar si una confirmación que realizó localmente se ha aplicado <upstream>bajo una ID de confirmación diferente.
Por ejemplo, esto sucederá si está alimentando parches <upstream>por correo electrónico en lugar de empujar o extraer confirmaciones directamente.

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

(Aquí, los commits marcados como ' -' no aparecerían git cherry, lo que significa que ya están presentes <upstream>).

VonC
fuente
3
testsy master- masteres la rama actual, por lo tanto, el asterisco.
azulado
54
Esto solo muestra qué ramas contienen esa confirmación exacta . Si desea saber qué ramas contienen una confirmación "equivalente" (es decir, qué ramas han seleccionado esa confirmación) eso es git cherry: "Debido a que git cherry compara el conjunto de cambios en lugar de la identificación de confirmación (sha1), puede usar git cherry para averiguar si una confirmación que realizó localmente se ha aplicado <upstream> bajo una identificación de confirmación diferente. Por ejemplo, esto sucederá si está alimentando parches <upstream> por correo electrónico en lugar de enviar o extraer confirmaciones directamente ". kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog
62
Agregue un -aparámetro para verificar también las ramas remotas.
Raman el
28
También puedes hacer git tag --contains <commit>. Consulte ¿ Buscar todas las etiquetas que contienen una confirmación? .
Andrew Marshall
55
Por la git cherryparte @UpAndAdam hizo la pregunta aquí: stackoverflow.com/questions/16304574/… , por desgracia, la pregunta (todavía) no ha sido respondida.
adeelx
22

Puedes ejecutar:

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

En el comentario de la última confirmación en la salida, puede encontrar el nombre de la sucursal original

Ejemplo:

       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
fuente
66
¡Agradable! Solía git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1poner esto en una línea
James EJ
1
Si desea utilizar el comando git puro, puede utilizar:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz el
Nota: Cuando su commit sha es el commit más reciente en la rama master / foo (HEAD) ... no puede hacer un A..Brango de commit, simplemente no use un rango como este :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode
Si este repositorio de git es un submódulo y está tratando de resolver el problema HEAD separado ... entonces tiene una pregunta difícil sobre una rama preferida ... En mi ejemplo anterior, podría decir fácilmente que mastersiempre es preferible si está en esta lista . A partir de ahí está menos claro. Se podría tratar de leer git branch de archivo .gitmodules: git config -f .gitmodules submodule.src/foo/submodule.branch. Esto podría ser un tenedor / pr de larga data. Puede cd para repo root y ejecutar git config submodule.src/foo/submodule.branch. También puedes usar la rama git actual de superproyectos.
Devin G Rhode
Como pequeño detalle: git config submodule.src/foo/submodule.branchpuede verse influenciado por cualquier variedad de configuraciones de git, incluido un archivo .gitconfig repo-local. (requiere correr git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode