Búsqueda de Git Grep

Estoy tratando de comparar dos compromisos de un Proyecto Git. Lo que hago es clonar el repository en una carpeta de postfix, luego uso:

git --grep=xxx 

Donde xxx es el número de confirmación, recupere el hash y luego use git checkout para el hash recuperado.

Sin embargo, git grep solo devuelve los detalles de esa confirmación en particular.

Si, por ejemplo, el compromiso tenía ID 24, ¿sería suficiente recuperar el compromiso con ID 23 para get una versión del proyecto sin la corrección?

Fondo

No estoy seguro de cuáles son esas ID de las que estás hablando: las confirmaciones de Git no tienen ningún ID secuencial y solo están identificadas por sus nombres SHA-1, que son hashes calculados sobre los objects de confirmación correspondientes.

Entonces, supongo que estás hablando de un proyecto que incorpora algunos ID generados externamente . Una razón podría ser que este es un proyecto que sigue a un repository de Subversion ya que por defecto todas las confirmaciones creadas en dicho repository tendrán la URL de Subversion y la ID de revisión incorporadas artificialmente en sus posts.

Qué sacar de esto

Lo primero es lo primero: en general, la respuesta a su pregunta es no. El motivo es que cualquier confirmación de Git puede tener más de un padre, si se trata de una fusión. Por lo tanto, no es posible considerar un compromiso y simplemente retroceder (ver más abajo cómo hacerlo).

¿Cómo seleccionar una confirmación principal?

La página de manual de gitrevisions(7) enumera dos forms de seleccionar uno de los commits principales:

  • <rev>^ , por ej. HEAD^ , v1.5.1^0

    Un sufijo ^ para un parámetro de revisión significa el primer padre de ese object de confirmación. ^<n> significa que el <n> padre (es decir <rev>^ es equivalente a <rev>^1 ). Como regla especial, <rev>^0 significa el compromiso en sí y se usa cuando <rev> es el nombre del object de un object de label que hace reference a un object de confirmación.

  • <rev>~<n> , por ejemplo, master~3

    Un sufijo ~<n> para un parámetro de revisión significa el object de compromiso que es el antecesor de la generación <n> ° del object de confirmación nombrado, siguiendo solo los primeros padres. Es decir <rev>~3 es equivalente a <rev>^^^ que es equivalente a <rev>^1^1^1 . Vea a continuación una ilustración del uso de este formulario.

Como puede ver, Git le obliga a indicar el padre explícitamente o asumir el primer padre (también "izquierdo") (este es el que se ha realizado en la fusión ).

Por lo tanto, una vez que conozca el nombre SHA-1 de una confirmación, que sea 2abcde45 , puede referirse a su primer padre utilizando 2abcde45^ o 2abcde45^1 o 2abcde45~1 que son todos iguales para esta tarea.


Me gustaría volver a enfatizar el hecho de que Git se compromete a no tener "ID" en el sentido en que parece estar usando, así que tómese el time para saber con qué ID está tratando. Publicar otra pregunta aquí en SO citando el post de compromiso de una confirmación de muestra estaría bien, creo.

Una vez que haya desprotegido el compromiso, puede volver fácilmente al compromiso principal (suponiendo que solo tenga un padre):

 $ git checkout HEAD^ 

Para comparar dos commits de un repository de Git, solo use git diff :

 git diff commit1 commit2