¿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.


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

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.


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


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

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]

¿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


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


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)

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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.