2010-03-11 8 views
90

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 qué otra persona se comprometió con un archivo en particular.git: ¿Cómo se difieren los archivos cambiados en comparación con versiones anteriores después de un tirón?

¿Cómo se hace eso?

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

+1

Puede encontrar la herramienta gráfica de gitk más a su gusto. – crazyscot

+0

http://stackoverflow.com/questions/61002/how-can-i-generate-a-git-diff-of-whats-changed-since-the-last-time-i-pulled podría ser similar a este – VonC

Respuesta

124

Existen varias formas maravillosas de especificar compromisos: consulte la sección de man git-rev-parse para obtener más información. En este caso, es probable que desee:

git diff [email protected]{1} 

Los @{1} significa "la posición anterior de que el árbitro he especificado", por lo que se evalúe como lo que había comprobado previamente - justo antes de la extracción. Puede marcar HEAD al final si también tiene algunos cambios en su árbol de trabajo y no quiere ver los difficiles para ellos.

No estoy seguro de lo que está pidiendo con "la identificación de confirmación de mi última versión del archivo" - la "ID" de confirmación (SHA1 hash) es ese hex de 40 caracteres justo en la parte superior de cada entrada en la salida de git log. Es el hash para la confirmación completa, no para un archivo dado. Usted realmente no necesita nunca más - si quieres diff sólo un archivo a través de la atracción, hacer

git diff [email protected]{1} filename 

Esto es una cosa en general - si usted quiere saber sobre el estado de un archivo en un determinado comprometerse , especifica el compromiso y el archivo, no un ID/hash específico del archivo.

+0

La publicación anterior relacionada de VonC dice esencialmente lo mismo que esto, pero la explicación es un poco diferente, así que lo dejo por ahora. (También usa '@ {1}' como una abreviatura de 'HEAD @ {1} ') – Cascabel

+0

cierto, pero también me gusta la explicación. +1 – VonC

+0

Esto es exactamente lo que estaba buscando. Gracias por la explicación. – lucapette

11

Si hace una recta git pull, entonces será "reenviado rápidamente" o fusionará un número desconocido de confirmaciones desde el repositorio remoto. Sin embargo, esto sucede como una acción, por lo que la última confirmación que se realizó inmediatamente antes de la extracción será la última entrada en el reflog y se puede acceder como [email protected]{1}. Esto significa que usted puede hacer:

git diff [email protected]{1} 

Sin embargo, no te recomiendo que si esto es algo que se encuentra haciendo un montón, entonces debería considerar simplemente haciendo un git fetch y el examen de la rama descabellada antes de la fusión o cambio de base en forma manual eso. P.ej. si estás en amo y se va a tirar de origen/maestra:

git fetch 

git log HEAD..origin/master 

# looks good, lets merge 

git merge origin/master 
+0

Buen uso de 'git log' en lugar de' git diff' aquí (incluso si la sintaxis es un poco incoherente entre el '..' para 'git log' y el '...' para' git diff';) + 1 Ver http://stackoverflow.com/questions/53569/how-to-get-the-changes-on-a-branch-in-git/53573#53573 y http://stackoverflow.com/questions/850607/ diferencia-en-git-registro-origen-maestro-vs-git-registro-origen-maestro/850695 # 850695 – VonC

+0

Afortunadamente, si utiliza la sintaxis '..' en un comando git diff, git "hace lo correcto". –

42

me gusta usar:

git diff HEAD^ 

O si sólo quiero diff un archivo específico:

git diff HEAD^ -- /foo/bar/baz.txt 
+3

-1: 'HEAD ^' es la confirmación primaria, no la confirmación antes de 'pull' – CharlesB

+0

Si' HEAD' es una confirmación de fusión, 'HEAD ^' es la primera confirmación primaria, entonces sí, puede ser la confirmación antes de la 'tirar'. Para obtener el otro padre (para una fusión bidireccional), use 'HEAD^2'. Pero, por encima de la respuesta, en realidad no está respondiendo la pregunta, dejando el -1 ;-) –

+0

Gracias por la aclaración. No leí la pregunta con mucho cuidado, ya que buscaba en Google otra cosa y este enlace apareció en la página de resultados. Pensé que tocaría desde que soy un nuevo usuario y no tengo ningún karma (si eso es lo que se llama en SO). Mi error =) – cadizm

Cuestiones relacionadas