Нахождение различий между текущей и последней версией

671

Используя Git, как вы можете найти разницу между текущей и последней версией?

git diff last version:HEAD
Раджив
источник
1
Если вы используете GitHub для облачного хранилища репо, это очень просто: перейдите к своему проекту и щелкните заголовок «коммиты» в таблице, в которой отображается ваш проект
Дэвид
1
Значение «текущей и последней версии» действительно должно быть разъяснено в вопросе.
faintsignal

Ответы:

1171

Я не очень понимаю значение «последней версии».

Поскольку предыдущий коммит можно получить с помощью HEAD ^, я думаю, что вы ищете что-то вроде:

git diff HEAD^ HEAD

Начиная с Git 1.8.5, @это псевдоним для HEAD, так что вы можете использовать:

git diff @~..@

Следующее также будет работать:

git show

Если вы хотите узнать разницу между головой и любым коммитом, вы можете использовать:

git diff commit_id HEAD

И это запустит ваш визуальный инструмент сравнения (если настроен):

git difftool HEAD^ HEAD

Поскольку сравнение с HEAD является значением по умолчанию, вы можете его опустить (как указано Ориентом ):

git diff @^
git diff HEAD^
git diff commit_id

Предупреждения

  • @ScottF и @Panzercrisis объясняют в комментариях, что в Windows ~символ должен использоваться вместо ^.
Франциско Пуга
источник
Я хотел что-то вроде верной версии и версии до этого ... git diff head head-1
Rajeev
7
Начиная с Git 1.8.5, @это псевдоним для HEAD. А так как ~и ^то же , когда будет только один совершить назад, я считаю , git diff @~..@гораздо проще набрать.
Андрей
80
@Andrew git showеще проще, так @~..@как это показ по умолчанию.
Амаллой
3
git showпросто печатает сообщение коммита, оно не выводит diff конкретных изменений, по крайней мере, в Git 2.5.4 (Apple Git-61), так что на самом деле это не будет ответом на вопрос OP.
user1944491
1
Проблема в git showтом, что если HEADкоммит слияния, вы не получите то, что ожидаете, так как сам коммит слияния может не иметь никаких изменений сам. git diff HEAD^ HEADпокажет фактические изменения между версиями
RubenLaguna
158

Предполагая, что «текущая версия» является рабочим каталогом (незафиксированные изменения), а «последняя версия» HEAD(последние подтвержденные изменения для текущей ветви), просто выполните

git diff HEAD

Кредит на следующее идет пользователю Cerran.

И если вы всегда пропускаете область подготовки, -aкогда делаете коммит, то вы можете просто использовать git diff.

Резюме

  1. git diff показывает неустановленные изменения.
  2. git diff --cached показывает поэтапные изменения.
  3. git diff HEAD показывает все изменения (как поэтапные, так и не постановочные).

Источник: git-diff (1) Страница руководства - Cerran

CharlesB
источник
16
И если вы всегда пропускаете область подготовки, -aкогда делаете коммит, то вы можете просто использовать git diff. <1> git diffпоказывает неустановленные изменения. <2> git diff --cachedпоказывает поэтапные изменения. <3> git diff HEADпоказывает все изменения (как поэтапные, так и не поэтапные). Источник: git-diff (1) Страница руководства
Cerran
1
Это должен быть принятый ответ, потому что он отвечает цели вопроса.
tgoneil
Как называется «текущая неустановленная версия» в git? Есть ли на самом деле имя?
Матье КАРОФФ
118

Как было отмечено на комментарий по amalloy , если по «текущей и последней версии» вы имеете в виду последнюю фиксацию и фиксации до того, что вы могли бы просто использовать

git show
Nighto
источник
5
Это то, что я искал. Отличный ответ.
CodeManiak
12
Используется git show HEAD~1для отображения последнего коммита, и git show HEAD~2т. Д. Для более старых коммитов. Показать только один файл через git show HEAD~2 my_file.
Флориан Брукер
60

Разница между последним, но одним и последним коммитом (плюс текущее состояние, если есть):

git diff HEAD~

или даже (легче набрать)

git diff @~

где @это синоним HEADтекущей ветки и ~означает «дай мне родитель упомянутой ревизии».

Томилов Анатолий
источник
Мне вполне нравится git diff HEAD^(а не эквивалентная HEAD~форма). Это немного легче запомнить для такого "старого мерзавца", как я ;-)
sxc731
3
Морковь является проблемой в некоторых терминалах. Приятно иметь возможность
light24bulbs
1
Ответ можно улучшить, объяснив, что значит ~и @что.
Боб Стейн
1
Если мы просто хотим проверить, что зафиксировано в последнем коммите, не используйте его (так как грязные изменения влияют на разницу). Более короткий синтаксис действительно diff HEAD^ HEADдолжен быть git diff @^!. См. Git-scm.com/docs/gitrevisions дляr1^!
Джонни Вонг
@JohnnyWong Спасибо за разъяснения. Я упомянул «текущее состояние», чтобы не запутать читателей.
Томилов Анатолий
53

Вы также можете сделать это так:

Сравнить с предыдущим коммитом

git diff --name-status HEAD~1..HEAD

Сравните с текущим и двумя предыдущими коммитами

git diff --name-status HEAD~2..HEAD
Наоко
источник
16

Просто используйте cachedфлаг, если вы добавили, но еще не зафиксировали:

git diff --cached --color
Энди
источник
1
Это было именно то, что я искал, когда я нашел этот вопрос. Спасибо!
Уильям Роджерс
7

Быстро и просто, при условии, что вы в мастере:

    git diff (checkout_id):file.txt file.txt

Пример:

    git diff asdfioei91819280din198:file.txt file.txt
Bryan
источник
4

Во-первых, используйте " git log", чтобы вывести список журналов для хранилища.

Теперь выберите два идентификатора коммита, относящиеся к двум коммитам. Вы хотите увидеть различия ( пример - самый верхний коммит и некоторый более старый коммит (в соответствии с вашими ожиданиями текущей версии и некоторой старой версии) ).

Далее используйте:

git diff <commit_id1> <commit_id2>

или

git difftool <commit_id1> <commit_id2>
parasrish
источник
3

Если верхний коммит указан HEAD, вы можете сделать что-то вроде этого:

commit1 -> HEAD
commit2 -> HEAD~1
commit3 -> HEAD~2

Разница между первым и вторым коммитом:

git diff HEAD~1 HEAD

Разница между первым и третьим коммитом:

git diff HEAD~2 HEAD

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

git diff HEAD~2 HEAD~1

И так далее...

bit_cracker007
источник
2

Я использую Bitbucket с Eclipse IDE с установленным плагином Eclipse EGit .

Я сравниваю файл из любой версии его истории (например, SVN ).

Меню Project Explorer → Файл → щелкните правой кнопкой мыши → КомандаПоказать в истории .

Это принесет историю всех изменений в этом файле. Теперь Ctrlнажмите и выберите любые две версии → «Сравнить друг с другом» .

мандрагора
источник
2

Это также будет работать для тегов (удалите 'uniq' ниже и другие части, если вам нужно увидеть все изменения):

 git diff v1.58 HEAD 

Ниже приведено то же самое, и это может быть полезно для непрерывной интеграции (CI) для микросервисов в монолитном хранилище:

git diff v1.58 HEAD  --name-only | sort -u | awk 'BEGIN {FS="/"} {print $1}' | uniq
<Folder Name> 

(Кредит - https://dzone.com/articles/build-test-and-deploy-apps-independently-from-a-mo )

Алекс Пуннен
источник