tipos - git ver archivos modificados
¿Cómo ver los cambios entre dos confirmaciones sin confirmaciones intermedias? (10)
¿Qué pasa con esto?
git diff abcdef 123456 | less
Es práctico simplemente canalizarlo a menos si desea comparar diferentes diferencias sobre la marcha.
¿Cómo hacer que git diff
solo muestre la diferencia entre dos confirmaciones, excluyendo las otras confirmaciones intermedias?
Desde Git 2.19, simplemente puedes usar:
git range-diff <rev1>...<rev2>
Digamos que tienes esto
A
|
B A0
| |
C D
/ /
|
...
Y quieres asegurarte de que A
sea lo mismo que A0
.
Esto hará el truco:
$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff
Escribí un script que muestra diff entre dos confirmaciones, funciona bien en Ubuntu.
https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc
#!/usr/bin/env python
import sys, subprocess, os
TOOLS = [''bcompare'', ''meld'']
def getTool():
for tool in TOOLS:
try:
out = subprocess.check_output([''which'', tool]).strip()
if tool in out:
return tool
except subprocess.CalledProcessError:
pass
return None
def printUsageAndExit():
print ''Usage: python bdiff.py <project> <commit_one> <commit_two>''
print ''Example: python bdiff.py <project> 0 1''
print ''Example: python bdiff.py <project> fhejk7fe d78ewg9we''
print ''Example: python bdiff.py <project> 0 d78ewg9we''
sys.exit(0)
def getCommitIds(name, first, second):
commit1 = None
commit2 = None
try:
first_index = int(first) - 1
second_index = int(second) - 1
if int(first) < 0 or int(second) < 0:
print "Cannot handle negative values: "
sys.exit(0)
logs = subprocess.check_output([''git'', ''-C'', name, ''log'', ''--oneline'', ''--reverse'']).split(''/n'')
if first_index >= 0:
commit1 = logs[first_index].split('' '')[0]
if second_index >= 0:
commit2 = logs[second_index].split('' '')[0]
except ValueError:
if first != ''0'':
commit1 = first
if second != ''0'':
commit2 = second
return commit1, commit2
def validateCommitIds(name, commit1, commit2):
if commit1 == None and commit2 == None:
print "Nothing to do, exit!"
return False
try:
if commit1 != None:
subprocess.check_output([''git'', ''-C'', name, ''cat-file'', ''-t'', commit1]).strip()
if commit2 != None:
subprocess.check_output([''git'', ''-C'', name, ''cat-file'', ''-t'', commit2]).strip()
except subprocess.CalledProcessError:
return False
return True
def cleanup(commit1, commit2):
subprocess.check_output([''rm'', ''-rf'', ''/tmp/''+(commit1 if commit1 != None else ''0''), ''/tmp/''+(commit2 if commit2 != None else ''0'')])
def checkoutCommit(name, commit):
if commit != None:
subprocess.check_output([''git'', ''clone'', name, ''/tmp/''+commit])
subprocess.check_output([''git'', ''-C'', ''/tmp/''+commit, ''checkout'', commit])
else:
subprocess.check_output([''mkdir'', ''/tmp/0''])
def compare(tool, commit1, commit2):
subprocess.check_output([tool, ''/tmp/''+(commit1 if commit1 != None else ''0''), ''/tmp/''+(commit2 if commit2 != None else ''0'')])
if __name__==''__main__'':
tool = getTool()
if tool == None:
print "No GUI diff tools"
sys.exit(0)
if len(sys.argv) != 4:
printUsageAndExit()
name, first, second = None, 0, 0
try:
name, first, second = sys.argv[1], sys.argv[2], sys.argv[3]
except IndexError:
printUsageAndExit()
commit1, commit2 = getCommitIds(name, first, second)
if not validateCommitIds(name, commit1, commit2):
sys.exit(0)
cleanup(commit1, commit2)
checkoutCommit(name, commit1)
checkoutCommit(name, commit2)
try:
compare(tool, commit1, commit2)
except KeyboardInterrupt:
pass
finally:
cleanup(commit1, commit2)
sys.exit(0)
Mis configuraciones de alias
en el archivo ~/.bashrc
para git diff
:
alias gdca="git diff --cached" # diff between your staged file and the last commit
alias gdcc="git diff HEAD{,^}" # diff between your recent tow commits
El inglés no es mi idioma nativo, disculpe los errores tipográficos.
Para comparar dos git commit 12345 y abcdef como parches, se puede usar el comando diff como
diff <(git show 123456) <(git show abcdef)
Pedir la diferencia / entre / dos confirmaciones sin incluir las confirmaciones intermedias tiene poco sentido. Los compromisos son solo instantáneas de los contenidos del repositorio; Preguntar por la diferencia entre dos necesariamente los incluye. Entonces la pregunta es, ¿qué estás buscando realmente?
Como William sugirió, la selección de cerebros puede darte el delta de un solo compromiso basado en otro. Es decir:
$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached
Esto toma la confirmación ''abcdef'', la compara con su antecesor inmediato, luego aplica esa diferencia sobre ''012345''. Luego se muestra esta nueva diferencia: el único cambio es que el contexto proviene de ''012345'' en lugar del ''ancestro inmediato de abcdef''. Por supuesto, puede tener conflictos y etc., por lo que no es un proceso muy útil en la mayoría de los casos.
Si solo estás interesado en abcdef, puedes hacer:
$ git log -u -1 abcdef
Esto compara abcdef con su antepasado inmediato, solo, y generalmente es lo que usted desea.
Y por supuesto
$ git diff 012345..abcdef
Te da todas las diferencias entre esos dos compromisos.
Ayudaría a tener una mejor idea de lo que está tratando de lograr, como mencioné, pedir la diferencia entre dos confirmaciones sin lo que está en medio no tiene sentido.
Supongamos que desea ver la diferencia entre confirmaciones 012345 y abcdef. Lo siguiente debe hacer lo que quieras:
$ git checkout 012345 $ git cherry-pick -n abcdef $ git diff --cached
simplemente puede pasar los 2 compromisos a git diff como:
-> git diff 0da94be 59ff30c > my.patch
-> git apply my.patch
git diff <a-commit> <another-commit> path
Ejemplo:
git diff commit1 commit2 config/routes.rb
Muestra la diferencia en ese archivo entre esas confirmaciones.