2010-12-26 11 views
32

He usado git-culpa para encontrar una confirmación en particular. Ahora quiero encontrar la rama de la que proviene originalmente. (A partir de ahí, usaré el nombre de la bifurcación para buscar el ticket en particular)Mostrar la rama original para una confirmación

Definamos "rama original" como "la rama a la que se realizó la confirmación antes de que la rama se fusionara con otra rama".

Respuesta

40

Al igual que los demás Dicho esto, si la rama que busca no es local al repositorio en el que está culpando a esta confirmación (por ejemplo, una rama sólo en el repositorio personal de un desarrollador de distancia), que está atornillado.

Pero suponiendo que codiciados rama es algo que se puede ver, y que, por supuesto, usted tiene el hash de cometer, por ejemplo d590f2..., una respuesta parcial es que se puede hacer:

$ git branch --contains d590f2 
    tests 
* master 

Entonces, sólo para confirmar que tiene el culpable:

$ git rev-list tests | grep d590f2 

por supuesto, si d590f2 se ha fusionado en más de una rama, que tendrá que ser más sutil que esto.

7

Eso no es realmente aplicable en git. Las ramas son conceptos locales para cada repositorio: la rama de "cosas locales" de una persona puede estar bastante separada de la rama de "cosas locales" de otra persona. Si hace algo como mirar su rama de integración principal, y su consulta se compromete, y eliminando todas las bases de combinación entre los dos, debería poder obtener un subárbol del historial de confirmación que puede arrojar algo de luz ... o puede que no . p.ej. si rastrea el enlace desde el compromiso de la consulta hacia "maestro", con suerte debería encontrar las asignaciones de fusión con comentarios útiles que indiquen de dónde proviene la fusión ... pero esta información es solo informativa, no está registrada de alguna manera destinada a ser recuperada automáticamente.

p. Ej. gitk some-commit...master (que es casi una abreviatura de gitk some-commit master --not $(git merge-base some-commit master))

6

Una rama de Git no es más que un "puntero con nombre a una confirmación" (que es un concepto diferente fundamental que en otros VCS conocidos).

Esta situación es clara, cometer A está en branch-1, comprometerse B en branch-2:

o A [branch-1] 
    | 
o | B [branch-2] 
| | 

Después de la fusión está convierte en claro si A (o B) originalmente estaba en branch-1 o branch-2:

o [branch-1] [branch-2] 
| 
o merged 
|\ 
| o A 
| | 
o | B 
| | 

Quizás pueda adivinar en qué rama de Git fue la confirmación A si ha etiquetado las confirmaciones principales de A, por ejemplo, release-1 y usted sabe que esta etiqueta solo se dio para confirmaciones en branch-1.

o [branch-1] [branch-2] 
| 
o merged 
|\ 
| o A 
| | 
o | B 
| | 
| o <release-1] 
| | 
+0

Estrictamente hablando, solo es posible si la fusión se reenvía rápidamente. Si todas las fusiones se realizan con '--no-ff', entonces git también conserva el historial de la sucursal. Simplemente haz 'git log -graph $ commit_id .. HEAD' – slebetman

+5

En general, en Git, las confirmaciones no están en las ramas, las ramas están en las confirmaciones. –

6

Intento, por favor comenten que no estoy del todo seguro, pero creo que hace el trabajo.

El siguiente sólo funcionará si las ramas siguen apuntando en la punta de antes de ser fusionados en maestro, que es el caso si las ramas estaban en el mismo repo:

o [master] 
| 
o merged branch "great-feature" into master 
|\ 
| o A [great-feature] 
| | 
o | B 
| | 

Si no la caso (por ejemplo, si sacó de otro repositorio) todavía puede recrearlos a mano.

En primer lugar obtener las ramas donde su compromiso son:

$ git branch -a --contains=<sha-of-B> 
*master 
great-feature 

continuación, para cada rama obtener el número de confirmaciones que separan la cabeza a la confirmación: este es el número de líneas que git log de salida para el especificado rango:

$ git log --pretty=oneline <sha-of-B>..great-feature | wc -l 
1 
$ git log --pretty=oneline <sha-of-B>..master | wc -l 
4 

So B es lo más parecido a la gran característica, lo que significa que fue creado en ella.

Esto podría convertirse en un buen guión, siento libre para añadirlo a la respuesta (no soy bueno en esto)

+0

Creo que puedes usar 'git rev-list --count' en lugar de' git log' para 'wc'. –

1

he encontrado una manera más sencilla de hacerlo: está en el mensaje de la última commit de git log <sha>..HEAD --merges!

Este comando muestra las fusiones que han ocurrido entre el maestro y la confirmación; la última salida de confirmación por este comando es la primera confirmación de combinación que la incluyó. Por lo general, contiene el nombre de la rama, por lo que incluso si se eliminó la rama, puede encontrar su nombre.

Para obtener únicamente el nombre de la rama sólo tiene que escribir git log <sha>..HEAD --merges --oneline |tail -1

+1

Esto solo es aplicable en los casos en que no hubo una fusión de avance rápido. – meagar

+0

@meagar de acuerdo, en una nota lateral, fusionar una característica en maestra con avance rápido no es una buena práctica, por esta razón precisa: es mejor ver en la historia que una característica se ha fusionado – CharlesB

+0

Gracias CharlesB, acabas de guardar mi tocino Había borrado accidentalmente una rama remota y no tenía un reflog local porque mi proyecto estaba en otra computadora a la que no tengo acceso. Entonces necesito reconstruir el último commit antes de la fusión para que pueda resucitar la rama. –

4

En primer lugar, asegúrese de cambios capturar de los mandos a distancia

$ git fetch --all 

Y,

$ git branch -a --contains d590f2 

Sin -a opción que puede 't find commits existente solo en sucursales remotas

+0

Esta respuesta es la más correcta. – kivagant

-1

Esto funcionó lo suficientemente bien como para que consiga el nombre de la sucursal de una cabeza separada de un espacio de trabajo Jenkins:

git show -s --pretty=%d

1

Parece que esto no es una pregunta que es posible responder con una precisión del 100% a través de git .

git branch --contains --merge <sha1> 

devuelve una lista de todas las ramas a las que se fusionó la confirmación y la rama original. --no-fusionó devuelve todas las ramas posteriores que incluyen la confirmación porque se ramificaron después del punto de fusión.

Por lo tanto, se puede obtener una lista de cada fusionar, pero se pierde ninguna rama original y cualquier rama eliminada antes de la ejecución de comandos (o lo que buscas en reflogs)

Resultados

git branch --contains <sha1 for "added feature/inital 1"> 
* develop 
    feature/inital 
    feature/subsequent1 

git branch --contains <sha1 for "added feature/inital 1"> --merged 
* develop 
    feature/inital 

git branch --contains <sha1 for "added feature/inital 1"> --no-merged 
    feature/inital 

Test script

function mkbranch { 
    git checkout -b $1 
    git push --set-upstream origin $1 
} 

# Develop 
mkbranch develop 
for f in 1 2 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "added develop $f"; done 
git push 

# Initial Feature Branch 
mkbranch feature/inital 
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/inital $f"; done 
git push 

# Merge 
git checkout -b develop 
git merge feature/inital 
git push 


# Next Feature Branch 
mkbranch feature/subsequent1 
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/subsequent1 $f"; done 
git push 
1

Cuando en la rama del "rama original" se fusionó a. Puede ejecutar:

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

Este comando mostrará todos los merge compromete entre <SHA>..HEAD. Necesitas la última.

Por ejemplo, para cometer c0118fa (penúltimo) la "rama original de" es redesign_interactions

* ccfd449 (HEAD -> develop) Require to return undef if no digits found 
* 93dd5ff Merge pull request #4 from KES777/clean_api 
|\ 
| * 39d82d1 Fix tc0118faests for debugging debugger internals 
| * ed67179 Move &push_frame out of core 
| * 2fd84b5 Do not lose info about call point 
| * 3ab09a2 Improve debugger output: Show info about emitted events 
| * a435005 Merge branch 'redesign_interactions' into clean_api 
| |\ 
| | * a06cc29 Code comments 
| | * d5d6266 Remove copy/paste code 
| | * c0118fa Allow command to choose how continue interaction 
| | * 19cb534 Emit &interact event 

Debe ejecutar:

git log c0118fa..HEAD --ancestry-path --merges 

y desplácese hacia abajo para encontrar la última confirmación. Que es:

commit a435005445a6752dfe788b8d994e155b3cd9778f 
Merge: 0953cac a06cc29 
Author: Eugen Konkov 
Date: Sat Oct 1 00:54:18 2016 +0300 

    Merge branch 'redesign_interactions' into clean_api 
Cuestiones relacionadas