Показати різницю між комісіями


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. Клацніть правою кнопкою миші на іншій, а потім вибрано різницю → це

Я починаю довіряти gitk трохи менше, тому що він відображає іншого автора, ніж власний автор, ніж фактичний.
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

5

Найпростіший для перевірки змін в останніх 2 комітетах після витягування:

git diff HEAD~2 

3

Я написав сценарій, який відображає різницю між двома комітами, добре працює на 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  

У всіх однакових команд я однаковий.

Наведене вище допомагає в
1. бачити різницю між фіксацією c1 та іншою фіксацією c2
2. також створення файлу патчу, який показує розріз і може бути використаний для застосування змін до іншої гілки

Якщо це не відображає різницю правильно,
то c1 та c2 можуть бути сприйняті неправильно,
тому відрегулюйте їх на a перед введенням, як c1 до c0, або на один після, як c2 до c3

Використовуйте gitkдля перегляду комітетів SHA, перших 8 символів достатньо, щоб використовувати їх як c0, c1, c2 або c3. Ви також можете побачити ID комісій з Gitlab> Repository> Commits тощо.

Сподіваюся, що це допомагає.


0

Скажімо, у вас є ще одна фіксація внизу (найстаріша), то це стає досить просто:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

Тепер, використовуючи нижче, легко буде сервер призначення.

git diff k73ud oldestCommit

-2

Використовуйте цю команду для різниці між фіксацією та нестандартною:

git difftool --dir-diff
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.