2008-09-14 6 views
61

me gustaría guión, preferiblemente en rastrillo, las siguientes acciones en un solo comando:¿Cómo puedo generar un git diff de lo que ha cambiado desde la última vez que lo sacó?

  1. obtener la versión de mi repositorio git local.
  2. Git extrae el código más reciente.
  3. Git diff de la versión que extraje en el paso # 1 a lo que ahora está en mi repositorio local.

En otras palabras, quiero obtener el último código del repositorio central y generar inmediatamente una diferencia de lo que ha cambiado desde la última vez que lo sacó.

Respuesta

70

Puede hacer esto simplemente con refspecs.

git pull origin 
git diff @{1}.. 

Eso le dará una diferencia de la rama actual tal como existía antes y después de la extracción. Tenga en cuenta que si la extracción no actualiza realmente la rama actual, la diferencia le dará los resultados incorrectos. Otra opción es registrar explícitamente la versión actual:

current=`git rev-parse HEAD` 
git pull origin 
git diff $current.. 

Yo personalmente uso un alias que simplemente me muestra un registro, en orden inverso (es decir, más antigua a la más reciente), sans fusiona, de todas las confirmaciones desde mi último tirón . Corro esto cada vez que mi tirón actualiza la rama:

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}.. 
+0

'git diff HEAD' también funciona. (Tal vez hace 4 años que no ...) – leemes

+1

@leemes: Hmm? 'git diff HEAD' le mostrará qué ha cambiado entre HEAD y su copia de trabajo actual. Eso no es lo que Teflon Ted estaba pidiendo. –

+0

Lo siento, he entendido mal la pregunta. Estaba buscando un comando para mostrar mis cambios desde la última vez que bajé y aterricé aquí. 'git diff HEAD' funcionó para lo que necesitaba (al menos supongo que era lo que estaba buscando: D) – leemes

10

Esto es muy similar a una pregunta que hice sobre how to get changes on a branch in git. Tenga en cuenta que el comportamiento de git diff vs. git log es incoherentemente diferente cuando se usan dos puntos contra tres puntos. Pero, para su aplicación puede utilizar:

git fetch 
git diff ...origin 

Después de eso, un git pull fusionará los cambios en su cabeza.

+0

No veo el origen definido como una palabra clave especial para git-diff o git-rev-parse. ¿Quiso decir que necesito conectar el hash del paso n. ° 1 como valor de origen? Si es así, ¿cómo extraigo programáticamente ese valor? Me gustaría combinar todos estos pasos en un solo comando/script para mayor comodidad. –

+2

Otra forma de hacerlo es usar el encabezado especial FETCH_HEAD, que refleja el resultado de la búsqueda anterior. Entonces: "git fetch && git diff ... FETCH_HEAD". –

+0

Creo que esta es la respuesta más apropiada: 'git fetch' seguido de' git diff origin/branchname' es la mejor manera de verificar la diferencia antes de tirar. –

12

Greg's manera debería funcionar (no yo, otro Greg: P). Con respecto a su comentario, el origen es una variable de configuración que establece Git cuando clona el depósito central en su máquina local. Esencialmente, un repositorio de Git recuerda de dónde vino. Sin embargo, puede establecer estas variables manualmente si necesita usar git-config.

git config remote.origin.url <url> 

donde url es la ruta remota a su repositorio central.

Aquí hay un ejemplo de archivo por lotes que debería funcionar (no lo he probado).

@ECHO off 

:: Retrieve the changes, but don't merge them. 
git fetch 

:: Look at the new changes 
git diff ...origin 

:: Ask if you want to merge the new changes into HEAD 
set /p PULL=Do you wish to pull the changes? (Y/N) 
IF /I %PULL%==Y git pull 
+1

Normalmente usaría 'git remote set-url origen ' en lugar de 'git config' para cambiar la URL de un Git * remote *. ¿Hay una diferencia? No lo sé, pero parece que 'git remote' es una herramienta más apropiada para el trabajo. –

+0

@ColinDBennett Tienes razón, 'git remote set-url' sería la forma más adecuada de hacerlo. Usé 'git config' porque' set-url' no era una opción cuando originalmente escribí esto. – Greg

4

Si se le cae esto en su golpe del perfil que va a ser capaz de ejecutar sonrisa (GIT entrante a distancia) y la lechada (GIT saliente a distancia) para ver las diferenciaciones de confirma que son entrantes y salientes para el maestro de origen.

function parse_git_branch { 
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' 
} 
function gd2 { 
echo branch \($1\) has these commits and \($2\) does not 
git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local 
} 
function grin { 
git fetch origin master 
gd2 FETCH_HEAD $(parse_git_branch) 
} 
function grout { 
git fetch origin master 
gd2 $(parse_git_branch) FETCH_HEAD 
} 
+0

¿Qué es gd2? ¿Algún tipo de alias para git diff? – arved

+0

Es una función bash definida en el script anterior justo después de parse_git_branch – Clintm

Cuestiones relacionadas