La list se compromete entre 2 hashes de commit en git

Sé que ha habido preguntas muy similares aquí, pero no resolvieron mi problema. Quizás hay algo que no entiendo bien.

Esta es una parte del historial de commit de fitnesse ( https://github.com/unclebob/fitnesse/ ):

* | | | | | | | | | | | | | | | fa86be8 Avoid possible issue when using CachingPage under heavy memory load. |/ / / / / / / / / / / / / / / * | | | | | | | | | | | | | | 7b4a07a Merge pull request #256 from barnetworkingijkstra/fitnesse_issue_250 |\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ | * | | | | | | | | | | | | | | ecf5891 Fixed test checking for OS specific exception message. | * | | | | | | | | | | | | | | 082236e Added rendering of cause exceptions. Fix for unclebob/fitnesse#250 * | | | | | | | | | | | | | | | a92b37f Merge pull request #243 from amolenaar/fix/243-hash-table-rendering 

Quiero la list de confirmaciones entre 2 hashes de confirmación. En este caso particular, quiero las confirmaciones entre ecf5891 y 7b4a07a , y espero que el resultado sea:

 ecf5891 7b4a07a 

Hasta ahora he estado usando git rev-list commit_hash_from_here^..commit_hash_up_to_here y ha funcionado bien con el historial lineal. Sin embargo, en este caso, me comprometo mucho más.

Lo intenté y funciona de la manera esperada:

 git log --since='<date ecf5891>' --until='<date 7b4a07a>' 

(He buscado manualmente esas 2 dates).

Una posible solución es get las 2 dates y simplemente hacer eso, pero creo que debería haber una mejor manera.

Edición: los padres 7b4a07a son ecf5891 y a92b37f . Hasta ahora, las soluciones funcionan bien si quiero pasar de ecf5891 a 7b4a07a , pero si quiero pasar de a92b37f a 7b4a07a quiero get:

 7b4a07a ecf5891 082236e a92b37f 

pero no consigo a92b37f

"Between" es una noción algo resbaladiza, cuando se trata de git commits.

El text que muestra arriba, con un fragment de salida de gráfico, muestra por qué from^..to produce más que solo esos dos commits: the to parte es un commit de fusión.

La notación A..B es solo una abreviatura de B ^A Es decir, "todo comenzando desde B y trabajando hacia atrás, less todo comenzando desde A y trabajando hacia atrás". Pero B es un compromiso de fusión, por lo que "todo comienza allí y funciona al revés" usa ambos padres .

Aquí el primer elemento primario de 7b4a07a es a92b37f (no en el fragment [original] anterior, pero cloné el repository vinculado y lo encontré). Sin embargo, podemos referirnos a esto simbólicamente, y lo haré a continuación. El segundo padre de 7b4a07a es ecf5891 , la parte "de" que le interesa.

Cuando pides:

 ecf5891^..7b4a07a 

eso significa:

 7b4a07a ^ecf5891^ 

que es lo mismo que:

 7b4a07a ^082236e 

lo que hace que ambos padres se fusionen y luego recorta todo desde 082236e . Necesita recortar todo desde 7b4a07a^ -el primer padre-y viceversa también:

 git rev-list 7b4a07a ^ecf5891^ ^7b4a07a^ git log --oneline 7b4a07a ^ecf5891^ ^7b4a07a^ 

Sin embargo, en general, debe averiguar qué línea descendente cortar.

Editar: puede seguir con la notación A..B , pero necesita agregar el "excluir" adicional. Entonces la respuesta de Jthill también funciona, una vez que mueves el sombrero al frente.


a92b37f a su edición ("si quiero pasar de a92b37f a 7b4a07a "): volvemos a la cuestión de que "entre" es una noción resbaladiza. ¿Qué compromisos son "entre"? Hay una línea directa desde a92b37f a 7b4a07a , porque a92b37f es uno de los dos padres de la combinación commit 7b4a07a . Entonces, según la lógica anterior ("se compromete directamente en una línea ancestral", tal vez "inclusiva"), eso sería solo uno, o tal vez ambos, de esos dos compromisos. Pero dices que quieres dos commits que, en ningún sentido ancestral, a92b37f relacionados con a92b37f . ¿Por qué quieres esos dos compromisos particulares? ¿Qué hace que 082236e sea ​​"interesante" y 082236e^ , su padre, "poco interesante"?

Creo que estás buscando –ancestry-path , en tu caso:

 git rev-list --ancestry-path 7b4a07a..ecf5891 

Agregue ^ 7b4a07a ~ para excluir también todo accesible desde el primer elemento primario de la fusión. Solo excluyes lo que se puede alcanzar de su segundo padre.

Primero identifique los 2 hashes de confirmación relevantes que necesita para get la list de hash de confirmación entre ellos mediante el uso de

 git log --oneline 

Luego puedes elegir los dos hashes de commit relevantes y encontrar los hashes de commit entre ellos usando

 git log <commit hash 1> <commit hash 2> --oneline | cut -d " " -f 1