git: ¿Cómo diferenciar archivos modificados frente a versiones anteriores después de una extracción?

117

Cuando ejecuto "git pull", a menudo quiero saber qué cambió entre la última versión de un archivo y la nueva. Digamos que quiero saber lo que otra persona comprometió con un archivo en particular.

¿Cómo se hace eso?

Supongo que es "git diff" con algunos parámetros para la confirmación x versus la confirmación y, pero parece que no puedo obtener la sintaxis. También encuentro "git log" un poco confuso y no estoy seguro de dónde obtener el ID de confirmación de mi última versión del archivo frente a la nueva.

doug
fuente
1
Es posible que encuentre la herramienta gráfica gitk más a su gusto.
crazyscot
stackoverflow.com/questions/61002/… podría ser similar a este
VonC

Respuestas:

158

Hay todo tipo de formas maravillosas de especificar confirmaciones; consulte la sección de especificación de revisiones de man git-rev-parsepara obtener más detalles. En este caso, probablemente quieras:

git diff HEAD@{1}

Los @{1}medios "la posición anterior de la referencia que he especificado", por lo que se evalúa a lo que había verificado anteriormente, justo antes de la extracción. Puede virar HEADal final allí si también tiene algunos cambios en su árbol de trabajo y no desea ver las diferencias para ellos.

No estoy seguro de lo que está pidiendo con "el ID de confirmación de mi última versión del archivo": el "ID de confirmación" (hash SHA1) es ese hexadecimal de 40 caracteres justo en la parte superior de cada entrada en la salida de git log. Es el hash de toda la confirmación, no de un archivo determinado. Realmente nunca necesita más: si desea diferenciar solo un archivo en la extracción, haga

git diff HEAD@{1} filename

Esto es algo general: si desea saber sobre el estado de un archivo en una confirmación determinada, especifique la confirmación y el archivo, no un ID / hash específico del archivo.

Cascabel
fuente
La publicación anterior vinculada de VonC dice esencialmente lo mismo que esto, pero la explicación es un poco diferente, así que dejaré esto por ahora. (También se usa @{1}como abreviatura de HEAD@{1})
Cascabel
cierto, pero también me gusta la explicación. +1
VonC
Esto es exactamente lo que estaba buscando. Gracias por la explicación.
lucapette
+1 por lo que estaba buscando en Google. Sería increíble si esto fuera seleccionado como la respuesta y saliera a la cima ... :)
longda
@longda Si está ordenando por votos (que pensé que era el predeterminado), ya debería estar en la parte superior.
Cascabel
57

Me gusta usar:

git diff HEAD^

O si solo quiero diferenciar un archivo específico:

git diff HEAD^ -- /foo/bar/baz.txt
cadizm
fuente
5
-1: HEAD^es la confirmación principal, no la confirmación anteriorpull
CharlesB
1
Si HEADes una confirmación de fusión, HEAD^es la primera confirmación principal, así que sí, puede ser la confirmación antes de pull. Para obtener el otro padre (para una combinación bidireccional), use HEAD^2. Pero entonces, la respuesta anterior no es realmente responder a la pregunta en primer lugar, así que dejando el -1 ;-)
Michael Wild
Gracias por la aclaración. No leí la pregunta con mucho cuidado, ya que estaba buscando en Google algo más y este enlace apareció en lo alto de la página de resultados. Pensé en intervenir ya que soy un nuevo usuario y no tengo ningún karma (si eso es lo que se llama en SO). Mi culpa =)
cadizm
3
@MichaelWild puede que no sea lo que preguntaba el autor de la pregunta, pero era lo que estaba buscando cuando encontré esto. Me fue útil. Voto a favor.
John Dvorak
Esto es lo que hace TortoiseGit "Diff con la versión anterior". Y es lo que estaba buscando.
Fabien Haddadi
15

Si lo hace directamente git pull, será 'reenviado rápidamente' o fusionará un número desconocido de confirmaciones del repositorio remoto. Sin embargo, esto sucede como una acción, por lo que la última confirmación en la que estaba inmediatamente antes de la extracción será la última entrada en el reflog y se puede acceder como HEAD@{1}. Esto significa que puede hacer:

git diff HEAD@{1}

Sin embargo, recomendaría encarecidamente que si esto es algo que se encuentra haciendo mucho, debería considerar simplemente hacer una git fetchy examinar la rama obtenida antes de fusionar o rebasar manualmente en ella. Por ejemplo, si está en el maestro y va a extraer el origen / maestro:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master
CB Bailey
fuente
Buen uso de en git loglugar de git diffaquí (incluso si la sintaxis es un poco incoherente entre el '..' para git logy el '...' para git diff;) +1 Ver stackoverflow.com/questions/53569/… y stackoverflow.com/questions / 850607 /…
VonC
Afortunadamente, si usa la sintaxis '..' en un comando git diff, git "hace lo correcto".
CB Bailey