Question Comment voir les changements entre deux commits sans commits entre-deux?


Comment faites-vous git diff seulement montrer la différence entre deux commits, en excluant les autres commits entre-deux?


497
2017-07-28 00:02


origine


Réponses:


vous pouvez simplement passer les 2 commits à git diff comme:

-> git diff 0da94be  59ff30c > my.patch
-> git apply my.patch

489
2017-07-28 01:11



Demander la différence / entre / deux commits sans inclure les commits intermédiaires n'a pas beaucoup de sens. Les validations ne sont que des instantanés du contenu du référentiel; demander la différence entre deux les inclut nécessairement. Alors la question est, qu'est-ce que vous cherchez vraiment?

Comme William l'a suggéré, la cueillette des cerises peut vous donner le delta d'un seul engagement rebasé au-dessus d'un autre. C'est:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached

Cela prend commit 'abcdef', le compare à son ancêtre immédiat, puis applique cette différence sur le dessus de '012345'. Cette nouvelle différence est alors montrée - le seul changement est que le contexte vient de '012345' plutôt que de 'l'ancêtre immédiat d'abcdef. Bien sûr, vous pouvez avoir des conflits, etc., ce n'est donc pas un processus très utile dans la plupart des cas.

Si vous êtes simplement intéressé par abcdef lui-même, vous pouvez faire:

$ git log -u -1 abcdef

Ceci compare abcdef à son ancêtre immédiat, seul, et est habituellement ce que vous voulez.

Et bien sûr

$ git diff 012345..abcdef

vous donne toutes les différences entre ces deux commits.

Cela aiderait à avoir une meilleure idée de ce que vous essayez d'accomplir - comme je l'ai mentionné, demander la différence entre deux commits sans ce qui est entre les deux n'a pas vraiment de sens.


108
2017-07-28 16:24



Pour comparer deux commits git 12345 et abcdef en tant que patches, on peut utiliser la commande diff

diff <(git show 123456) <(git show abcdef)

57
2018-05-07 20:21



git diff <a-commit> <another-commit> path

Exemple:

git diff commit1 commit2 config/routes.rb

Il montre la différence sur ce fichier entre ces commits.


53
2017-08-01 16:11



Supposons que vous voulez voir la différence entre les validations 012345 et abcdef. Ce qui suit devrait faire ce que vous voulez:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cache

9
2017-07-28 16:14



Disons que vous avez ceci

A
|
B    A0
|    |
C    D
\   /
  |
 ...

Et vous voulez vous assurer que A est le même que A0.

Ça fera l'affaire:

$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff

9
2018-04-14 18:54



Et ça:

git diff abcdef 123456 | less

Il est pratique de le réduire à un niveau inférieur si vous voulez comparer plusieurs différences à la volée.


7
2018-01-05 12:53



ma alias paramètres dans ~/.bashrc fichier pour 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

L'anglais n'est pas ma langue maternelle, veuillez excuser les fautes de frappe


0
2018-06-28 09:38



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 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)

0
2017-07-02 10:27