¿Cómo veo las diferencias de compromiso entre ramas en git?

341

Estoy en la rama X y he agregado un par de confirmaciones más. Quiero ver todas las diferencias entre MASTER y la rama en la que estoy en términos de commits. Podría hacer un

git checkout master
git log

y luego un

git checkout branch-X
git log

y visualmente difieren estos, pero espero un método más fácil y menos propenso a errores.

Avery
fuente

Respuestas:

324

Puede obtener una salida visual muy agradable de cómo sus ramas difieren con esto

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative master..branch-X
tom
fuente
13
Sin embargo, eso no le mostrará diferencias entre las ramas, que es lo que se le pide.
Pablo Fernández heelhook
47
git log --oneline --graph --all --decorate --abbrev-commitle dará una salida similar en un comando más corto / más legible
Pablo Fernández heelhook
44
Me gusta esto:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
Avery
66
Extremadamente complicado.
Shawn Erquhart
12
git log --oneline --graph --all --decoratees suficiente, --abbrev-commitno es obligatorio, --onelinees la abreviatura de--pretty=oneline --abbrev-commit
avmohan
720

Puedes hacerlo fácilmente con

git log master..branch-X

Eso le mostrará los compromisos que la rama X tiene pero el maestro no.

Anzuelo de Pablo Fernández
fuente
99
¿Existe una opción si ambas ramas contienen confirmaciones que la otra no? En este momento, debe voltear los argumentos y ejecutarlos en ambos sentidos para ver las confirmaciones que la otra rama no contiene.
Elliott Slaughter
38
Si ya ha cambiado branch-X, puede usargit log master..
Dave
8
@ElliottSlaughter: si desea encontrar commit que estén en master o branch-X pero no en ambos, puede usar git log master...branch-X(tres puntos en lugar de dos). Ver man gitrevisionspara más información.
Xavier T.
3
Es realmente solo la mitad de la respuesta. Cualquier compromiso en master que haga que las ramas
diverjan
99
Si los commits han sido seleccionados de la rama X para dominar, esto no los filtrará. Todavía estarán en la lista de confirmaciones "En la rama X pero no en la maestra", aunque en realidad estén en ambas ..
Tuffwer
87

Creo que es cuestión de elección y contexto. Prefiero usar

git log origin/master..origin/develop --oneline --no-merges

Mostrará confirmaciones en desarrollo que no están en la rama maestra.

Si desea ver qué archivos están realmente modificados, use

git diff --stat origin/master..origin/develop --no-merges

Si no especifica argumentos, mostrará la diferencia completa. Si desea ver la diferencia visual, instálela melden Linux o WinMergeen Windows. Asegúrese de que sean las herramientas de herramientas predeterminadas. Luego use algo como

git difftool -y origin/master..origin/develop --no-merges

En caso de que quiera compararlo con la rama actual. Es más conveniente usar HEAD en lugar del nombre de la rama como el uso:

git fetch
git log origin/master..HEAD --oneline --no-merges

Te mostrará todos los commits, a punto de fusionarse

zainengineer
fuente
1
Si compara una rama de lanzamiento que podría tener fusiones. Es posible que desee eliminar las confirmaciones de fusión (que no agregan ningún valor) con la ayuda del --no-mergesgit log origin/master..HEAD --oneline --no-merges
parámetro
15

Si estás en Linux, gitg es un camino a seguir para hacerlo de manera muy rápida y gráfica.

Si insiste en la línea de comando puede usar:

git log --oneline --decorate

Para hacer git logmás agradable por defecto, normalmente establezco estas preferencias globales:

git config --global log.decorate true
git config --global log.abbrevCommit true
mvp
fuente
14

Sugeriría lo siguiente para ver la diferencia "en commits". Para diferencia simétrica, repita el comando con args invertidos:

git cherry -v master [your branch, or HEAD as default]
mmaruska
fuente
¿Es esto diferente de git master..branch-X?
ilmirons
2
Claro, "git cherry" es inteligente: se traduce de "commits" en "parches / diffs" y puede evitar reportar un "parche" que está en ambas ramas pero aplicado en un orden diferente.
mmaruska
8

si quieres usar gitk:

gitk master..branch-X

tiene una bonita GUi de la vieja escuela

nevado
fuente
4

No es la respuesta perfecta, pero funciona mejor para las personas que usan Github:

ingrese la descripción de la imagen aquí

Ve a tu repositorio: Insights -> Network

AIon
fuente
Además, crear una solicitud de extracción también mostrará las diferencias de rama.
pkamb
Dios mío, quiero abrazarte.
esseara
@esseara También soy un gran abrazador :)) De
nada
2

Si desea comparar en función de los mensajes de confirmación, puede hacer lo siguiente:

git fetch
git log --oneline origin/master | cut -d' ' -f2- > master_log
git log --oneline origin/branch-X | cut -d' ' -f2- > branchx_log
diff <(sort master_log) <(sort branchx_log)
Maroun
fuente
1
En lugar de usar --oneliney canalizar cut, puede usargit log --format='%s'
opticyclic el
0
#! /bin/bash
if ((2==$#)); then
  a=$1
  b=$2
  alog=$(echo $a | tr '/' '-').log
  blog=$(echo $b | tr '/' '-').log
  git log --oneline $a > $alog
  git log --oneline $b > $blog
  diff $alog $blog
fi

Contribuyendo esto porque permite que los registros ayb se diferencien visualmente, uno al lado del otro, si tiene una herramienta de diferencia visual. Reemplace el comando diff al final con el comando para iniciar la herramienta visual diff.

Kim Briggs
fuente
0

Utilicé algunas de las respuestas y encontré una que se ajustaba a mi caso (asegúrese de que todas las tareas estén en la rama de lanzamiento).

Otros métodos también funcionan, pero descubrí que podrían agregar líneas que no necesito, como las confirmaciones de fusión que no agregan ningún valor.

git fetch
git log origin/master..origin/release-1.1 --oneline --no-merges

o puedes comparar tu actual con el maestro

git fetch
git log origin/master..HEAD --oneline --no-merges

git fetch está ahí para asegurarse de que está utilizando información actualizada.

De esta manera, cada confirmación estará en una línea y puede copiarla / pegarla en un editor de texto y comenzar a comparar las tareas con las confirmaciones que se fusionarán.

claudiu.f.marginean
fuente