Как увидеть изменения в коммите Git?

1549

Когда я это git diff COMMITвижу, я вижу изменения между этим коммитом и HEAD (насколько я знаю), но я бы хотел видеть изменения, которые были внесены этим единственным коммитом.

Я не нашел никаких очевидных опций для diff/ log, которые дадут мне такой вывод.

laktak
источник
4
возможный дубликат Сокращения для diff из git commit с его родителем?
Крис Мэйс

Ответы:

1975

Чтобы увидеть разницу для конкретного COMMITхэша:

git diff COMMIT~ COMMITпокажет вам разницу между этим COMMITпредком и COMMIT. См. Справочные страницы для git diff для получения подробной информации о команде и gitrevisions о ~нотации и ее друзьях.

В качестве альтернативы git show COMMITсделаем что-то очень похожее. (Данные коммита, включая его diff - но не для коммитов слияния.) Смотрите man-страницу git show .

Невик Рехнел
источник
17
Обратите внимание, что ^необходимо указывать в оболочках Томсона и Борна (синоним для |них) и rcего производных (оператор каретки), а также zshс включенным extendedglob ( notоператор глобинга)
Стефан Шазелас
3
Обратите внимание, что HEAD^подразумевается первый родитель в случае, если коммит имеет несколько родителей (т.е. коммит слияния).
Мансур
23
git diff COMMIT~ COMMITработает для меня, обратите внимание на тильду вместо карета. Я использую git версии 2.6.1.windows.1 в Windows 10.
Юусо Охтонен,
14
@tradetree: слово COMMIT должно быть заменено именем какого-либо коммита, например, суммы SHA.
Ник Маттео
91
Я чувствую, что git show больше подходит для этого вопроса и должно быть предложено первым.
pypmannetjies
497

Как упоминалось в « Сокращении для diff из git commit с его родителем? », Вы также можете использовать git diffс:

git diff COMMIT^!

или

git diff-tree -p COMMIT

С git show вам нужно (чтобы сосредоточиться только на diff) сделать:

git show --color --pretty=format:%b $COMMIT

COMMITПараметр является МОГ-фиксации :

Объект фиксации или объект, который может быть рекурсивно разыменован в объекте фиксации. Ниже перечислены все коммиты: объект фиксации, объект тега, который указывает на объект фиксации, объект тега, который указывает на объект тега, который указывает на объект фиксации, и т. Д.

Смотрите gitrevision "УКАЗАНИЯ ПЕРЕСМОТРОВ", чтобы ссылаться на коммит.
Смотрите также « Что означает древовидность в Git? ».

VonC
источник
371

Вы также можете попробовать этот простой способ:

git show <COMMIT>
Лакхан
источник
2
Кажется, это делает что-то совсем другое
Miserable Variable
3
Он показывает только сообщение о коммите. Не разница изменений кода, применяемых для этого коммита.
k0pernikus
1
Да, это так? Наконец в последних версиях Git ...
Дэви
2
Это должен быть обновленный правильный ответ
Скотт Скилес
1
Это должно быть ответом.
Рол
77

git show показывает изменения, сделанные в последнем коммите.

Эквивалент git show HEAD.

git show HEAD~1 возвращает 1 коммит.

Адам Сальма
источник
45

Я обычно делаю:

git diff HEAD~1

Чтобы показать изменения, касающиеся последнего коммита. Если у вас больше коммитов, просто увеличьте число 1 до того, сколько коммитов diff вы хотите увидеть.

Alex
источник
34

Сначала получите идентификатор фиксации, используя,

git log #to list all

Или

git log -p -1 #last one commit id

Скопируйте идентификатор фиксации.

Теперь мы используем два метода, чтобы вывести список изменений из определенного коммита,

Способ 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Способ 2:

git show commit_id
For example: git show 1c6a600a
Мохидин бен Мухаммед
источник
2
Что ^!значит ??
Мартин Колл
2
^! это сокращение для коммита ^ .. commit, что означает исключение всех родителей и проверку
Mohideen bin Mohammed
Я не эксперт, но у меня есть случай (с участием нескольких ветвей), где git log c ^! это не совсем то же самое, что git log c ^ .. c. На самом деле все намного лучше: в git log c ^ .. c перечислено слишком много записей, а в git log c ^! поступил правильно, так вот это я долго
искал
32
git show <commit_sha>

Это покажет вам, что в этом коммите. Я думаю, что вы можете сделать это, просто поместив пробел между двумя коммитами.

git show <beginning_sha> <ending_sha>

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

Iwnnay
источник
25

Со страницы руководства для git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Используйте третий в середине:

git diff [options] <parent-commit> <commit>

Также из той же справочной страницы, внизу, в разделе примеров :

$ git diff HEAD^ HEAD      <3>

Сравните версию перед последним коммитом и последним коммитом.

По общему признанию это сформулировано немного запутанно, это было бы менее запутанно, поскольку

Сравните самый последний коммит с коммитом перед ним.


источник
3
Ваша редакция будет применяться к git diff HEAD HEAD^.
Ричард
git diff HEAD ^ HEAD не отображает никаких изменений.
user3690202
@ user3690202, так что это означает, что нет никаких изменений для отображения. Это действительно так?
Как не может быть никаких изменений для отображения? Если вы хотите просмотреть последний коммит, конечно, если это не совершенно новый репозиторий, будут ли отображаться некоторые изменения?
user3690202
@ user3690202 можно сделать «пустой коммит» с помощью Git, который на самом деле не содержит каких-либо изменений от родителя, хотя есть встроенная защита, которая проверяет и предотвращает это, хотя она может быть переопределена с помощью параметра командной строки. Я сомневаюсь, что вы намеренно создадите пустой коммит, так что другая возможность состоит в том, что вы каким-то образом выполняете преобразование конца строки перед коммитом (или другой забавный пробел), что заставляет Git думать, что никаких изменений на самом деле не было сделано. На какой платформе вы используете Git?
22

Следующее, кажется, делает работу; Я использую это, чтобы показать, что было внесено слиянием.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
MichaelMoser
источник
Будет ли это работать с git log? (из-за stackoverflow.com/a/18585297/6309 )
VonC
16

Другая возможность:

git log -p COMMIT -1
John_West
источник
1
@GrantMcLean Да, и это уже в самом высоком ответе, поэтому я не упоминаю об этом.
John_West
11

Вы могли бы использовать git diff HEAD HEAD^1 чтобы увидеть diff с родительским коммитом.

Если вы хотите видеть только список файлов, добавьте эту --statопцию.

Irshu
источник
Это то, что вы имеете в виду, git diff HEAD ^ 1 HEAD
Shibir Basak
Обратите внимание, что это покажет то, что вы добавили как удаленные, так как будет выполнено обратное сравнение. Вы должны прочитать diffкоманду следующим образом: что мне нужно изменить в файле, чтобы получить от commit HEADдо commit HEAD^1?
мозговой заговор
9
git difftool COMMIT^ <commit hash>

также возможно, если вы настроили свой difftool.

Смотрите здесь, как настроить difftool. Или страницу руководства здесь.

Кроме того, вы можете использовать, git diff-tree --no-commit-id --name-only -r <commit hash>чтобы увидеть, какие файлы были изменены / зафиксированы в хеше данного подтверждения.

Чанд Приянкара
источник
9

Мне нравится команда ниже, чтобы сравнить конкретный коммит и его последний коммит:

git diff <commit-hash>^-

Пример:

git diff cd1b3f485^-
starcwl
источник
6

Чтобы увидеть автора и время использования коммитов git show COMMIT. Что приведет к чему-то вроде этого:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <you@you.com>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Если вы хотите увидеть, какие файлы были изменены, запустите следующее со значениями из строки слияния выше git diff --stat a2a2894 3a1ba8f.

Если вы хотите увидеть фактический diff, запустите git --stat a2a2894 3a1ba8f

Никита Г.
источник
Msgstr "Если вы хотите увидеть фактическое сравнение, запустите git --stat a2a2894 3a1ba8f". Я думаю, что вы имеете в виду git diff a2a2894 3a1ba8fили иначе unknown option: --stat.
Фрукты
5

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

  git diff <commit_Id_1> <commit_Id_2>

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

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

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

bit_cracker007
источник
4

Я использую Git версии 2.6.1.windows.1 в Windows 10, поэтому мне нужно было немного изменить ответ Невика (тильда вместо каретки):

git diff COMMIT~ COMMIT

Другой вариант - процитировать карету:

git diff "COMMIT^" COMMIT
Юусо Охтонен
источник
3

Эта команда получит хэш родительского коммита Git:

git log -n 2 <commit-hash>

После того git diff-tool <commit-hash> <parent-commit-hash>

Пример:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <souparno.majumder@gmail.com>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <souparno.majumder@gmail.com>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

После этого

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Супарно Маюмдер
источник
2

Если вы просто хотите увидеть изменения в последнем коммите, просто git showсообщу вам об этом.

MyrionSC2
источник
1

В случае проверки изменения источника в графическом представлении,

$gitk (Mention your commit id here)

например:

$gitk HEAD~1 
user272390
источник
Я не понимаю, почему этот ответ был отклонен. Я согласен, что командная строка и текстовые материалы - это путь, но gitk дает много полезной информации.
ShellFish