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 branche 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 apportées dans 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 ) . Comme le PO veut voir les modifications introduites par k73ud
, il doit différencier le premier commit parent de k73ud
: k73ud^
(ou k73ud^1
OU k73ud~
).
De cette façon, les résultats de diff
incluront les modifications depuisk73ud
parent (ce qui inclut les modifications apportées depuis k73ud
lui-même), au lieu des modifications introduites depuisk73ud
(jusqu'à dj374
).
Aussi, vous pouvez essayer:
git diff oldCommit..newCommit
git diff k73ud..dj374
et (1 espace, pas plus):
git diff oldCommit newCommit
git diff k73ud dj374
Et si vous devez obtenir uniquement les noms de fichiers (par exemple, pour les copier manuellement, corrigez-les):
git diff k73ud dj374 --name-only
Et vous pouvez obtenir des modifications appliquées à une autre branche:
git diff k73ud dj374 > my.patch
git apply my.patch
Pour voir la différence entre:
Votre copie de travail et votre espace de travail:
% git diff
Zone de transit et le dernier commit:
% git diff --staged
Votre copie de travail et commettez 4ac0a6733:
% git diff 4ac0a6733
Commit 4ac0a6733 et le dernier commit:
% git diff 4ac0a6733 HEAD
Commit 4ac0a6733 et commet 826793951
% git diff 4ac0a6733 826793951
Pour plus d'explications, voir la documentation officielle .
Si vous voulez voir les modifications introduites avec chaque commit, essayez "git log -p"
gitk --all
J'utilise gitk
pour voir la différence:
gitk k73ud..dj374
Il a un mode graphique, ce qui facilite la révision.
Pour voir la différence entre deux commits différents (appelons-les a
et b
), utilisez
git diff a..b
a
et b
est opposée à b
et a
.Pour voir la différence entre votre dernière validation et les modifications non encore validées, utilisez
git diff
Si vous voulez 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]).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 = 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)
Le plus simple pour vérifier les modifications dans les 2 derniers commits après extraction:
git diff HEAD~2
Disons que vous avez un autre commit en bas (le plus ancien), alors cela devient assez facile:
commit dj374
made changes
commit y4746
made changes
commit k73ud
made changes
commit oldestCommit
made changes
Maintenant, utiliser ci-dessous servira facilement le but.
git diff k73ud oldestCommit