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


1549

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

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


Ответы:


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? ».


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 вы хотите увидеть.


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>

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


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>

Будет ли это работать с git log? (из-за stackoverflow.com/a/18585297/6309 )
VonC

16

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

git log -p COMMIT -1

1
@GrantMcLean Да, и это уже в самом высоком ответе, поэтому я не упоминаю об этом.
John_West

11

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

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


Это то, что вы имеете в виду, 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^-

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 без фиксации между ними вам не нужно указывать идентификаторы коммитов.


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сообщу вам об этом.


1

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

$gitk (Mention your commit id here)

например:

$gitk HEAD~1 

Я не понимаю, почему этот ответ был отклонен. Я согласен, что командная строка и текстовые материалы - это путь, но gitk дает много полезной информации.
ShellFish
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.