origin - ¿Cómo "mostrar git" una fusión se compromete con salida de diff combinada incluso cuando cada archivo cambiado está de acuerdo con uno de los padres?
git merge--abort (9)
Después de hacer una fusión "simple" (una sin conflictos), el git show
usualmente solo muestra algo así como
commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date: Tue Feb 22 00:27:17 2011 +0100
Merge branch ''testing'' into master
Esto se debe a que, para las fusiones, git show
usa el formato de diferencias combinado que omite los archivos que concuerdan con cualquiera de las versiones principales.
¿Hay alguna manera de obligar a Git a que muestre todas las diferencias en el modo de combinación combinada?
Al hacer git show -m
se mostrarán las diferencias (usando diferencias por pares entre la versión nueva y todas las versiones principales respectivamente), pero preferiría tener eso con las diferencias marcadas con +/- en las columnas respectivas, como en el modo combinado.
Como señaló Kris Nuttycombe, la mejor solución es
git diff fc17405...ee2de56
para el compromiso de fusión
commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date: Tue Feb 22 00:27:17 2011 +0100
para mostrar todos los cambios en ee2de56
que se puede fc17405
desde confirmaciones en fc17405
. Tenga en cuenta el orden de los hashes de confirmación: es el mismo que se muestra en la información de combinación: Merge: fc17405 ee2de56
También tenga en cuenta los 3 puntos ...
lugar de dos !
Para obtener una lista de archivos modificados, puede usar:
git diff fc17405...ee2de56 --name-only
Construí un enfoque de propósito general para hacer varias operaciones en los commit de una fusión.
Paso uno : agregue un alias a git editando ~/.gitconfig
:
[alias]
range = "!. ~/.githelpers && run_on_merge_range"
Paso dos : en ~/.githelpers
, define una función bash:
run_on_merge_range() {
cmd=$1; shift
commit=$1; shift
range=$(git show $commit | grep Merge: | awk ''{print $2 "..." $3}'')
echo "git $cmd $range $@"
if [ -z $range ]; then
echo "No merge detected"
exit 1
fi
git $cmd $range $@
}
Paso tres : ¡Ganar!
git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only
Es probable que haya MUCHO margen de mejora aquí, simplemente lo armé todo para superar una situación molesta. Siéntase libre de burlarse de mi sintaxis y / o lógica de bash.
Creo que solo necesitas ''git show -c $ ref''. Probar esto en el repositorio de git en a8e4a59 muestra un diff combinado (caracteres más / menos en una de 2 columnas). Como menciona el manual de git-show, prácticamente delega a ''git diff-tree'', por lo que esas opciones parecen útiles.
Mira el mensaje de compromiso:
commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date: Tue Feb 22 00:27:17 2011 +0100
Merge branch ''testing'' into master
fíjate en la línea:
Merge: fc17405 ee2de56
toma esos dos identificadores de commit y revésalos. entonces para obtener la diferencia que deseas, harías:
git diff ee2de56..fc17405
para mostrar solo los nombres de los archivos modificados:
git diff --name-only ee2de56..fc17405
y para extraerlos, puedes agregar esto a tu gitconfig:
exportfiles = !sh -c ''git diff $0 --name-only | "while read files; do mkdir -p /"$1/$(dirname $files)/"; cp -vf $files $1/$(dirname $files); done"''
luego úsala haciendo:
git exportfiles ee2de56..fc17405 /c/temp/myproject
No, no hay forma de hacer esto. Pero a veces sería agradable, y probablemente sería relativamente fácil de implementar en el código fuente de git (después de todo, solo tienes que decirle que no recorte lo que piensa que es salida extraña), entonces el parche para hacerlo probablemente sea aceptado por los mantenedores de git.
Tenga cuidado con lo que desea, sin embargo; fusionar una rama con un cambio de una línea que se bifurcó hace tres meses todavía tendrá una gran diferencia frente a la línea principal, por lo que una diferencia completa sería casi completamente inútil. Es por eso que git no lo muestra.
Parece respondida aquí: http://thread.gmane.org/gmane.comp.version-control.git/191553/focus=191557
Entonces, de una manera similar, corriendo
$ git diff --cc $ M $ M ^ 1 $ M ^ 2 $ (git merge-base $ M ^ 1 $ M ^ 2)
debe mostrar un parche combinado que explique el estado en $ M con respecto a los estados registrados en sus padres y la base de fusión.
Puede crear una bifurcación con HEAD configurado en una confirmación antes de la fusión. Entonces, puedes hacer:
git merge --squash testing
Esto se fusionará, pero no se comprometerá. Entonces:
git diff
Puede usar el comando diff-tree con el indicador -c. Este comando muestra qué archivos han cambiado en la confirmación de fusión.
git diff-tree -c {merged_commit_sha}
Git-Scm la descripción de la bandera -c de Git-Scm :
Este indicador cambia la forma en que se muestra una confirmación de fusión (lo que significa que es útil solo cuando el comando recibe una, o --stdin). Muestra las diferencias de cada uno de los padres con el resultado de fusión simultáneamente en lugar de mostrar la diferencia por pares entre un elemento primario y el resultado de a uno por vez (que es lo que hace la opción -m). Además, enumera solo los archivos que fueron modificados de todos los padres.
en su caso solo necesita
git diff HEAD^ HEAD^2
o simplemente hash para ti:
git diff 0e1329e55^ 0e1329e55^2