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

Я использую 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

Ответ 1

Пытаться

git diff k73ud^..dj374

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

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

Таким образом, результаты diff будут включать изменения, начиная с k73ud parent (то есть, включая изменения от самого 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

Ответ 2

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

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

% git diff

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

% git diff --staged

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

% git diff 4ac0a6733

Фиксация 4ac0a6733 и последняя фиксация:

% git diff 4ac0a6733 HEAD

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

% git diff 4ac0a6733 826793951

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

Ответ 3

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

Ответ 4

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

gitk k73ud..dj374

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

Ответ 5

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

Ответ 6

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

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

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

git diff

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

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

Ответ 7

Я написал скрипт, который отображает 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)

Ответ 8

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

git diff HEAD~2 

Ответ 9

Для проверки полных изменений:

  git diff <commit_Id_1> <commit_Id_2>

Для проверки только измененных/добавленных/удаленных файлов:

  git diff <commit_Id_1> <commit_Id_2> --name-only

ПРИМЕЧАНИЕ. Для проверки diff без фиксации между ними вам не нужно указывать идентификаторы коммитов.

Ответ 10

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

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

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

git diff k73ud oldestCommit

Ответ 11

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

git difftool --dir-diff