Git: cómo encontrar la primera confirmación de una rama específica

93

En el siguiente árbol de ejemplo:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)

Estoy buscando F: la primera confirmación en la rama xxx. Creo que es posible con:

git log xxx --not master

y la última confirmación en la lista debería ser F. ¿Es la solución correcta o tal vez tiene algunas desventajas?

Sé que hubo preguntas similares sobre stackoverflow, pero nadie propuso tal solución, y no estoy seguro de si lo hago bien.

usuario2699113
fuente
Posible duplicado de stackoverflow.com/questions/6058308/…
nyzm

Respuestas:

111
git log master..branch --oneline | tail -1

Donde "rama" es su nombre de rama específico. El punto-punto le da todas las confirmaciones que tiene la rama y que el maestro no tiene. tail -1devuelve la última línea de la salida anterior.

Konyak
fuente
3
esto solo funciona si existe una `` rama ''. ¿Cómo lo haría si se elimina la rama?
Oz123
2
La rama @ Oz123 puede ser reemplazada por cualquier referencia, como HEAD, sha1 o tag. Pero obviamente necesitas algún tipo de referencia.
Zitrax
3
No me da lo que esperaba. Mi rama (la anterior) ya se fusionó con la maestra, lo que significa que todas las confirmaciones en xxx ya están en la maestra. Aún así, necesito saber qué confirmación FUE la primera en esa rama, o en realidad, necesito examinar el historial de confirmaciones de esa rama solo, no me importa si están en el maestro o no.
Motti Shneor
1
@MottiShneor dependiendo de cómo se fusionó, eso podría ser complicado. Si hiciste un avance rápido, es como si la rama nunca hubiera existido. De lo contrario, es posible que le interese esta respuesta , que enumera varias formas de encontrar el punto de ramificación. Una vez que tenga su punto de bifurcación, el SHA puede reemplazarlo master, y siempre que su bifurcación no haya sido eliminada, git log <sha>..branch --oneline | tail -1aún debería brindarle los resultados que está buscando.
ND Geek
1
Puede utilizar --reversepara leer los registros al revés con colores, etc.
Dominik
8

Debe utilizar la merge-basefuncionalidad que está diseñada para resolver exactamente esto:

git merge-base remotes/origin/<branch> develop 
Fabrizio Stellato
fuente
No creo que esto funcione si desea volver al punto de bifurcación original. Si fusiona desarrollar en <branch>, la base de fusión será más nueva que el punto de bifurcación original.
Alexander Mills
5
Además, esto no apuntaría a F, sino a una confirmación en la rama maestra (aunque es difícil de ver en el dibujo de OP, parece ser B o C).
RomainValeri
5
git cherry master -v | head -n 1
Nelu
fuente
1

Si su rama (la anterior) una vez más se fusionó con la maestra no da el resultado esperado, estoy usando el script de Python para encontrar el ID de confirmación de la rama inicial.

git rev-list: conjunto de cambios del primer padre

--first-parent sigue solo a la primera confirmación principal al ver una confirmación de fusión.

Itere el conjunto de cambios del comando anterior hasta que se encuentre la rama principal.

def status_check(exec_command, exec_dir=None, background=False):
    if exec_dir:
        os.chdir(exec_dir)
    res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if not background:
        result = res.communicate()
    return result



def findNewBranchCommits(changeset=None):
    cmd = "git rev-list --first-parent "+ changeset
    rev_list = status_check(cmd,self.module_dir)
    rev_list = str(rev_list[0]).split('\n')
    rev_list = list(filter(None, rev_list))
    for x in rev_list:                      # Iterate until branch base point
        rev_cmd = "git branch --contains " + x
        rev_cmd = status_check(rev_cmd,self.module_dir)
        rev_cmd = str(rev_cmd[0]).split('\n')
        if(len(rev_cmd) > 2): 
            print "First Commit in xxx branch",x
            break

findNewBranchCommits(changeset)
Nayagam
fuente
0
git cherry master -v | tail -1   

sin embargo, esto solo le dará la primera confirmación en la rama xxx que no está en el maestro, no la primera confirmación en la rama xxx. esto último sería difícil si la rama xxx se ha eliminado y / o vuelto a crear una o más veces. en ese caso, puede intentar lo siguiente:

git reflog | grep checkout | grep xxx | tail -1   
Doc Unid
fuente
3
¿Querías escribir en head -n 1lugar de tail -1? tail -1devuelve la confirmación más reciente en lugar de la primera.
Nelu
0

Probé este comando y funcionó:

git log <source_branch> <feature_branch> --oneline | tail -1
Abderrahmen
fuente
-1

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1

wedens
fuente
En mi repositorio, esto muestra la primera confirmación desde la última fusión del maestro en la rama xxx, no la primera confirmación de la rama xxx.
jk7