«git diff» всегда показывает разницу между двумя коммитами (или коммитом, и рабочим каталогом и т. д.).
Якуб Наребски
21
@ JakubNarębski, он спрашивает, как увидеть разницу между изменениями, внесенными одной командой, и изменениями, внесенными другим коммитом. Другими словами, diff из diffs или interdiff.
Псуси
1
и если вы добавите параметр --dirstat = files к команде diff, вы получите очень хороший скриншот с точными проектами и файлами, которые были изменены, вместе с процентом изменений. Например: git diff [номер-коммита] [номер-коммита] --dirstat = files
Преимущество использования git apply и patch заключается в том, что вы можете включать переименования и некоторые другие изменения, относящиеся к git. Мне нравится использовать git format-patch и git am.
Рассел
58
Этот ответ совершенно не отвечает на вопрос, поэтому я понятия не имею, почему у него так много голосов. ОП конкретно спрашивает, как НЕ получить первую команду, которую вы даете, а вторая не имеет никакого отношения к чему-либо.
Псуси
3
Этот ответ не в состоянии ничего не ответить. Работает отлично. Если вы разветвите последний из двух коммитов, о котором идет речь, то примените этот diff к этой новой ветке, вы увидите изменения между двумя коммитами без головной боли прерывистых коммитов.
Крейг Лабенс
142
Запрашивать разницу / между / двумя коммитами без учета промежуточных коммитов не имеет большого смысла. Коммиты - это просто снимки содержимого хранилища; просить разницу между двумя обязательно включает их. Итак, вопрос в том, что вы действительно ищете?
Как предположил Уильям, сбор вишни может дать вам дельту одного комбита, перебазированного поверх другого. Это:
Это принимает коммит 'abcdef', сравнивает его с его непосредственным предком, затем применяет эту разницу поверх '012345'. Затем показывается это новое отличие - единственное изменение заключается в том, что контекст происходит от «012345», а не от «непосредственного предка» abcdef. Конечно, вы можете столкнуться с конфликтами и т. Д., Поэтому в большинстве случаев это не очень полезный процесс.
Если вы просто заинтересованы в самом abcdef, вы можете сделать:
$ git log -u -1 abcdef
Это сравнивает abcdef с его непосредственным предком, в одиночку, и обычно это то, что вы хотите.
И конечно
$ git diff 012345..abcdef
дает вам все различия между этими двумя коммитами.
Это помогло бы получить лучшее представление о том, чего вы пытаетесь достичь - как я уже говорил, просить разницу между двумя коммитами без того, что между ними, на самом деле не имеет смысла.
Я согласен, что в общем случае не имеет смысла сравнивать два коммита. Но Git действительно не умеет говорить, как вы должны думать. Предположим, у вас есть две ветви, каждая с разными фиксациями, которые выглядят так, как будто они вносят одинаковые изменения в одни и те же наборы файлов. Я хотел бы иметь возможность использовать git, чтобы сказать мне, являются ли эти два исправления одинаковыми, не доверяя моим глазам. Я думаю, что есть полезность в этом.
Крис Кливленд
9
@ChrisCleeland, утилита interdiff может пригодиться в этом случае. Используйте git diff, чтобы получить diff каждого коммита против его непосредственного родителя, затем используйте interdiff, чтобы сравнить diff.
bdonlan
3
@ChrisCleeland, git не хранит патчи. Хранит содержимое файла. У него действительно есть схема сжатия, которая использует дельты, но источники дельты не обязательно связаны с фактической историей файлов.
bdonlan
11
Разница между двумя коммитами, исключая другие коммиты на их соответствующих ветвях, имеет смысл: один коммит был выбран из другого, но может иметь некоторые тонкие различия. Вы хотите увидеть, что они из себя представляют, не будучи загромождены всем другим несвязанным дерьмом, которое отличается между двумя ветвями.
Псуси
2
Или, скажем, вы перебазируете master на ветку функций и должны разрешать конфликты. Впоследствии сравнение origin/featurebranch#HEADс local/featurebranch#HEADможет помочь вам убедиться, что вы ничего не испортили во время разрешения конфликта.
Lefnire
91
Для сравнения двух коммитов git 12345 и abcdef как патчей можно использовать команду diff:
@OneOfOne git diff <(git show 123456) <(git show abcdef)не работает; diff <(...) <(...)делает. (Я только что попробовал).
Менахем
@Menachem git diff 123456 abcdef.
OneOfOne
15
@OneOfOne Это не делает то же самое. То, что вы предложили, будет сравнивать деревья каждого коммита, показывая один патч . То, что я (и @plexoos) делаю, сравнивает два патча , каждый из которых был введен отдельными коммитами - другими словами, diffвыводит результат из двух diffs. Это включает в себя чтение и сравнение двух входных потоков. diff(GNU или Unix diff) может это сделать, а git diffне может. Некоторые могут задаться вопросом, почему кто-то хотел бы сделать это. Я сейчас занимаюсь этим, убирая слияние, которое пошло плохо.
Менахем
1
не будет ли это включать в себя разницу между всеми метаданными в git diff?
Джоэлб
61
git diff <a-commit> <another-commit> path
Пример:
git diff commit1 commit2 config/routes.rb
Он показывает разницу в этом файле между этими коммитами.
Спасибо, это хорошая идея, чтобы проверить ваш результат после фиксации. Например, вы можете оформить свою ветвь коммитами без сдавливания, а вишня выбрать свой сдавленный коммит, чтобы увидеть, все ли гладко с интерактивной перебазировкой. Кроме того, когда мастер вышел впереди ветви.
Акостадинов
10
Что насчет этого:
git diff abcdef 123456 | less
Это удобно, если вы хотите сравнить множество различных различий на лету.
alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your latest two commits
Ответы:
вы можете просто передать 2 коммита в git diff:
источник
my.patch
в другую ветку?Запрашивать разницу / между / двумя коммитами без учета промежуточных коммитов не имеет большого смысла. Коммиты - это просто снимки содержимого хранилища; просить разницу между двумя обязательно включает их. Итак, вопрос в том, что вы действительно ищете?
Как предположил Уильям, сбор вишни может дать вам дельту одного комбита, перебазированного поверх другого. Это:
Это принимает коммит 'abcdef', сравнивает его с его непосредственным предком, затем применяет эту разницу поверх '012345'. Затем показывается это новое отличие - единственное изменение заключается в том, что контекст происходит от «012345», а не от «непосредственного предка» abcdef. Конечно, вы можете столкнуться с конфликтами и т. Д., Поэтому в большинстве случаев это не очень полезный процесс.
Если вы просто заинтересованы в самом abcdef, вы можете сделать:
Это сравнивает abcdef с его непосредственным предком, в одиночку, и обычно это то, что вы хотите.
И конечно
дает вам все различия между этими двумя коммитами.
Это помогло бы получить лучшее представление о том, чего вы пытаетесь достичь - как я уже говорил, просить разницу между двумя коммитами без того, что между ними, на самом деле не имеет смысла.
источник
origin/featurebranch#HEAD
сlocal/featurebranch#HEAD
может помочь вам убедиться, что вы ничего не испортили во время разрешения конфликта.Для сравнения двух коммитов git 12345 и abcdef как патчей можно использовать команду diff:
источник
git diff <(git show 123456) <(git show abcdef)
не работает;diff <(...) <(...)
делает. (Я только что попробовал).git diff 123456 abcdef
.diff
выводит результат из двухdiff
s. Это включает в себя чтение и сравнение двух входных потоков.diff
(GNU или Unixdiff
) может это сделать, аgit diff
не может. Некоторые могут задаться вопросом, почему кто-то хотел бы сделать это. Я сейчас занимаюсь этим, убирая слияние, которое пошло плохо.Пример:
Он показывает разницу в этом файле между этими коммитами.
источник
Для проверки полных изменений:
Для проверки только измененных / добавленных / удаленных файлов:
ПРИМЕЧАНИЕ . Для проверки diff без фиксации между ними вам не нужно указывать идентификаторы коммитов.
источник
Допустим, у вас есть это
И вы хотите убедиться, что
A
это так же, какA0
.Это сделает свое дело:
источник
diff <(git diff B A) <(git diff D A0)
(тот же результат, что и с git show)Предположим, вы хотите увидеть разницу между коммитами 012345 и abcdef. Следующее должно делать то, что вы хотите:
источник
Что насчет этого:
Это удобно, если вы хотите сравнить множество различных различий на лету.
источник
Начиная с Git 2.19, вы можете просто использовать:
git range-diff rev1...rev2
- сравнить два дерева коммитов, начиная с их общего предкаили
git range-diff rev1~..rev1 rev2~..rev2
- сравнить изменения, внесенные двумя данными коммитамиисточник
Мои
alias
настройки в~/.bashrc
файле дляgit diff
:источник
Мои
alias
настройки в~/.zshrc
файле дляgit diff
:Спасибо @Jinmiao Ло
git diff HEAD~2 HEAD
полное изменение между последним 2-м коммитом и текущим.
HEAD
это удобноисточник
Я написал скрипт, который отображает diff между двумя коммитами, хорошо работает на Ubuntu.
https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc
источник