Показать различия между коммитами


236

Я использую Git на Ubuntu 10.04 (Lucid Lynx).

Я сделал некоторые поручения своему хозяину.

Тем не менее, я хочу получить разницу между этими коммитами. Все они в моей главной ветке.

Например:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

Я хочу получить разницу между k73ud и dj374. Однако, когда я сделал следующее, я не мог видеть изменения, которые я сделал в k73ud.

git diff k73ud..dj374 > master.patch

Ответы:


275

Пытаться

git diff k73ud^..dj374

чтобы убедиться, что включены все изменения k73udв результирующий дифференциал.

git diffсравнивает две конечные точки ( вместо диапазона фиксации ). Поскольку ОП хочет видеть изменения, внесенные им k73ud, ему / ей необходимо различать первый родительский коммит k73ud:k73ud^ (или k73ud^1илиk73ud~ ).

Таким образом, diffрезультаты будут включать изменения, начиная с k73ud родительского (то есть, включая изменения от k73udсамого себя), а не изменения, внесенные с тех пор k73ud (до dj374).

Также вы можете попробовать:

git diff oldCommit..newCommit
git diff k73ud..dj374 

и (1 пробел, не более):

git diff oldCommit newCommit
git diff k73ud dj374

И если вам нужно получить только имена файлов (например, скопировать их исправление вручную):

git diff k73ud dj374 --name-only

И вы можете применить изменения к другой ветке:

git diff k73ud dj374 > my.patch
git apply my.patch

5
Ты уверен? мерзавец дифф 275e8922ab4e995f47a753b88b75c3027444a54c..a8d9d944c32e945cbb9f60b3f724ecc580da86ae работает, но мерзавец дифференциал 275e8922ab4e995f47a753b88b75c3027444a54c ^ .. a8d9d944c32e945cbb9f60b3f724ecc580da86ae сообщение появляется ошибка - «неизвестный пересмотр или путь не в рабочем дереве»
Димас

@demas: работает на моей машине;) вы также можете использовать, git diff 275e8^ a8d9d9так как это то же самое, что и ' ..'.
VonC

4
@VonC В моей машине нет необходимости использовать ^
xi.lin

5
@ VonC Ubuntu 14.04. Только git diff k73ud..dj374все в порядке
xi.lin

1
@BradyDowling Согласен. И если вы хотите увидеть PR-разность, вы можете сделать это в командной строке с новым ghCLI: stackoverflow.com/a/62031065/6309
VonC

126

Чтобы увидеть разницу между:

Ваша рабочая копия и область подготовки:

% git diff

Стадион и последний коммит:

% git diff --staged

Ваш рабочий экземпляр и передайте 4ac0a6733:

% git diff 4ac0a6733

Коммит 4ac0a6733 и последний коммит:

% git diff 4ac0a6733 HEAD

Зафиксируйте 4ac0a6733 и закажите 826793951

% git diff 4ac0a6733 826793951

Для получения дополнительной информации см. Официальную документацию .


7
Кроме того, если вы действительно хотите видеть различия в одном файле в этих коммитах, git diff {x} {y} -- filenameгде {x}и {y}приведены любые из приведенных примеров. Смотрите также, git log -pтак как есть некоторые совпадения.
Майкл

54

Если вы хотите увидеть изменения, вносимые с каждым коммитом, попробуйте "git log -p"


13
  1. gitk --all
  2. Выберите первый коммит
  3. Щелкните правой кнопкой мыши на другой, затем выберите diff → этот

Я начинаю доверять Гитку чуть меньше, потому что он показывает другого автора коммиттера, нежели фактического.
Ciasto piekarz

10

Я использую, gitkчтобы увидеть разницу:

gitk k73ud..dj374

Он имеет режим графического интерфейса, так что обзор проще.


7

Чтобы увидеть разницу между двумя разными коммитами (назовем их aи b), используйте

git diff a..b
  • Обратите внимание, что разница между aи bпротивоположна от bи a.

Чтобы увидеть разницу между вашим последним коммитом и еще не зафиксированными изменениями, используйте

git diff

Если вы хотите иметь возможность вернуться к разнице позже, вы можете сохранить ее в файле.

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

6

Простейшая проверка изменений в последних 2 коммитах после pull:

git diff HEAD~2 

3

Я написал скрипт, который отображает diff между двумя коммитами, хорошо работает на 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)

1
Интересный сценарий. +1
VonC

2

Принято, ответ хороший.

Просто поместите это снова сюда, чтобы его было легко понять и попробовать в будущем.

git diff c1...c2 > mypatch_1.patch  
git diff c1..c2  > mypatch_2.patch  
git diff c1^..c2 > mypatch_3.patch  

Я получил такой же diff для всех вышеперечисленных команд.

Выше помогает
1. увидеть разницу между коммитом c1 и другим коммитом c2
2. также создать файл патча, который показывает diff и может быть использован для применения изменений в другой ветке

Если это не показывает разницу правильно
то c1 и c2 могут быть приняты неправильно
поэтому настройте их на a перед коммитом как c1 до c0 или на один после как c2 на c3

использование gitk для просмотра коммитов SHA, достаточно первых 8 символов, чтобы использовать их как c0, c1, c2 или c3. Вы также можете увидеть идентификаторы коммитов из Gitlab> Репозиторий> Коммиты и т. Д.

Надеюсь, это поможет.


0

Допустим, у вас есть еще один коммит внизу (самый старый), тогда это становится довольно просто:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

Теперь, использование ниже будет легко серверной цели.

git diff k73ud oldestCommit

-2

Используйте эту команду для различия между commit и unstaged:

git difftool --dir-diff
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.