Afficher les différences entre les commits

J’utilise Git sur Ubuntu 10.04 (Lucid Lynx).

J’ai fait des commits à mon maître.

Cependant, je veux faire la différence entre ces commits. Tous sont sur ma twig principale.

Par exemple:

commit dj374 made changes commit y4746 made changes commit k73ud made changes 

Je veux faire la différence entre k73ud et dj374. Cependant, lorsque j’ai fait ce qui suit, je ne pouvais pas voir les modifications que j’avais apscopes à k73ud .

 git diff k73ud..dj374 > master.patch 

Essayer

 git diff k73ud^..dj374 

pour vous assurer d’inclure toutes les modifications de k73ud dans le diff résultant.

git diff compare deux points de terminaison ( au lieu d’une plage de validation ). Puisque l’OP veut voir les modifications introduites par k73ud , il doit faire la différence entre le premier commit parent de k73ud : k73ud^ (ou k73ud^1 ou k73ud~ ).

De cette manière, les résultats de diff incluront les changements depuis le parent k73ud (signifiant incluant les modifications de k73ud lui-même), au lieu des changements introduits depuis k73ud (jusqu’à dj374 ).

Pour voir la différence entre:

Votre copie de travail et zone de transit:

 % git diff 

Zone de transit et la dernière validation:

 % git diff --staged 

Votre copie de travail et validez 4ac0a6733:

 % git diff 4ac0a6733 

Commencez 4ac0a6733 et le dernier commit:

 % git diff 4ac0a6733 HEAD 

Commettre 4ac0a6733 et valider 826793951

 % git diff 4ac0a6733 826793951 

Pour plus d’explications, voir la documentation officielle .

Si vous voulez voir les modifications apscopes à chaque validation, essayez “git log -p”

J’utilise gitk pour voir la différence:

 gitk k73ud..dj374 

Il a un mode GUI pour que la révision soit plus facile.

  1. gitk --all
  2. Sélectionnez le premier commit
  3. Clic droit sur l’autre, puis diff sélectionné → this

Pour voir la différence entre deux commits différents (appelons-les a et b ), utilisez

 git diff a..b 
  • Notez que la différence entre a et b est opposée à b et a .

Pour voir la différence entre votre dernier commit et les modifications non encore validées, utilisez

 git diff 

Si vous souhaitez pouvoir revenir à la différence plus tard, vous pouvez l’enregistrer dans un fichier.

 git diff a..b > ../project.diff 

J’ai écrit un script qui affiche diff entre deux commits, fonctionne bien sur Ubuntu.

https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc

 #!/usr/bin/env python import sys, subprocess, os TOOLS = ['bcompare', 'meld'] def execute(command): return subprocess.check_output(command) def getTool(): for tool in TOOLS: try: out = execute(['which', tool]).ssortingp() if tool in out: return tool except subprocess.CalledProcessError: pass return None def printUsageAndExit(): print 'Usage: python bdiff.py   ' print 'Example: python bdiff.py  0 1' print 'Example: python bdiff.py  fhejk7fe d78ewg9we' print 'Example: python bdiff.py  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 = execute(['git', '-C', name, 'log', '--oneline', '--reverse']).splitlines() if first_index >= 0: commit1 = logs[first_index].split(' ')[0] if second_index >= 0: commit2 = logs[second_index].split(' ')[0] except ValueError: if first is not '0': commit1 = first if second is not '0': commit2 = second return commit1, commit2 def validateCommitIds(name, commit1, commit2): if not commit1 and not commit2: print "Nothing to do, exit!" return False try: if commit1: execute(['git', '-C', name, 'cat-file', '-t', commit1]) if commit2: execute(['git', '-C', name, 'cat-file', '-t', commit2]) except subprocess.CalledProcessError: return False return True def cleanup(commit1, commit2): execute(['rm', '-rf', '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')]) def checkoutCommit(name, commit): if commit: execute(['git', 'clone', name, '/tmp/'+commit]) execute(['git', '-C', '/tmp/'+commit, 'checkout', commit]) else: execute(['mkdir', '/tmp/0']) def compare(tool, commit1, commit2): execute([tool, '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')]) if __name__=='__main__': tool = getTool() if not tool: print "No GUI diff tools, install bcompare or meld" sys.exit(0) if len(sys.argv) is not 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 validateCommitIds(name, commit1, commit2) is False: sys.exit(0) cleanup(commit1, commit2) try: checkoutCommit(name, commit1) checkoutCommit(name, commit2) compare(tool, commit1, commit2) except KeyboardInterrupt: pass finally: cleanup(commit1, commit2) sys.exit(0) 

Utilisez cette commande pour faire la différence entre commit et nonstaged:

 git difftool --dir-diff