Cómo diferenciar entre cambios locales no confirmados y origen

141

Digamos que cloné un repositorio y comencé a modificar archivos. Sé que si tengo cambios locales no confirmados, puedo hacer una diferencia de la siguiente manera git diff test.txty me mostrará la diferencia entre el HEAD local actual y los cambios modificados y no confirmados en el archivo. Si confirmo esos cambios, puedo diferenciarlos del repositorio original usandogit diff master origin/master

Pero, ¿hay alguna forma de diferenciar los cambios locales con el repositorio original en el servidor antes de comprometerse localmente? Probé varias permutaciones git diff --cached master origin/mastersin suerte.

Chaitanya
fuente
Quería saber cuánto ha cambiado mi archivo desde la última versión confirmada en mi local. La respuesta a mi pregunta fue esta pregunta. ¡Gracias!
Souvik Ghosh

Respuestas:

133

Dado que el repositorio remoto ha sido almacenado en caché git fetch, debería ser posible compararlo con estos commits. Intenta lo siguiente:

$ git fetch origin
$ git diff origin/master
JJD
fuente
55
Ah excelente. La clave era dejar al maestro fuera. Había intentado una combinación en la que estaba haciendo una búsqueda antes, pero cuando lo hice git diff master origin/mastertodavía se comparaba con la versión comprometida (obvio en retrospectiva). Pero dejar de lado al maestro ahora compara los cambios locales con la versión obtenida.
Chaitanya
@Chaitanya Bueno, podría ayudar. En realidad, los diferentes estilos que Git usa son un poco irritantes: una vez que tienes que escribir origin mastery en otro lugar origin/master. Todavía hay trabajo por hacer, en mi humilde opinión.
JJD
Esto no parece funcionar: git diff origin/mastervuelve fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.existe en el origen principal, sin embargo, por ejemplo, git fetch origin masterfunciona bien,
mikemaccana
42

Sé que no es una respuesta a la pregunta exacta formulada, pero encontré que esta pregunta buscaba diferenciar un archivo en una rama y un archivo no confirmado local y pensé que compartiría

Sintaxis:

git diff <commit-ish>:./ -- <path>

Ejemplos:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Gracias Eric Boehs por no tener que escribir el nombre de archivo dos veces)

Nate
fuente
Me gusta la solución general mejor que la estrecha y específica de arriba. ¿Te importaría compartir dónde encontraste eso?
fbicknel
Parece que no puedo encontrar la documentación sobre los detalles commit-ishy el separador de dos puntos. Los documentos en git-diff no parecen mencionarlo. Lo he usado durante tanto tiempo que no recuerdo dónde lo encontré por primera vez. Probablemente los ejemplos de otras personas sobre otros comandos y con los que acabo de experimentar git-diff. Me temo que otra respuestacommit-ish es la mejor que puedo encontrar en este momento.
Nate
3
Una buena adición a esto es git diff master:./ -- README.md. De esta forma, no tiene que escribir README.mddos veces y puede agregarlo a un alias más fácilmente.
Eric Boehs
Gracias @EricBoehs, esa es una gran sugerencia.
Nate
1
Que la sintaxis no está funcionando para mí ... y no git diff master: -- README.mdla ./crea una /dev/nullfuente en lugar de la rama remota. Usando git versión 2.19.0
rustyDev
21

Para ver cambios no escalonados (no agregados) en archivos existentes

git diff

Tenga en cuenta que esto no rastrea nuevos archivos. Para ver cambios por etapas, no comprometidos

git diff --cached

pepestar
fuente
9

Si desea comparar archivos visualmente, puede usar:

git difftool

Iniciará su aplicación diff automáticamente para cada archivo modificado.

PD: Si no configuró una aplicación diff, puede hacerlo como en el ejemplo a continuación (uso Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false
Caner
fuente
¿Este cambio surte efecto de inmediato?
Dilip Raghunathan
Solo tengo curiosidad, ¿cómo se relaciona esto con la pregunta que se hace? ¿No compararía git difftool los cambios locales con el maestro? Sin embargo, el OP lo quiere entre los cambios locales y el maestro remoto.
infoclogged
Con mucho, la solución más fácil
Chris Johnson el