Как просмотреть файл diff в git перед коммитом

444

Это часто случается со мной:

Я работаю над парой связанных изменений одновременно в течение дня или двух, и когда приходит время коммитить, я забываю, что изменилось в конкретном файле. (Это всего лишь личное git-репо, поэтому я согласен на несколько обновлений в коммите.)

Есть ли способ предварительного просмотра изменений между моим локальным файлом, который должен быть зарегистрирован, и последним коммитом для этого файла?

Что-то вроде:

git diff --changed /myfile.txt

И это напечатало бы что-то вроде:

line 23
  (last commit): var = 2+2
  (current):     var = myfunction() + 2

line 149
  (last commit): return var
  (current):     return var / 7

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

Соус МакБосс
источник

Ответы:

733

Если вы хотите увидеть, что еще не сделали git add:

git diff myfile.txt

или если вы хотите увидеть уже добавленные изменения

git diff --cached myfile.txt
янтарный
источник
20
проверить git add -p. Проверяйте каждое изменение, выборочно одобряйте изменения на этапе, отменяйте в любое время, если вы передумали, и даже встроенное редактирование чанка. Я никогда git addбез этого.
Кайл Бейкер
2
как вы можете выйти из файла?
Kick Buttowski
3
@ Kick Попробуйте нажатьq
wjandrea
также, если вы хотите удалить глупые префиксы 'a /' и 'b /' в diff, вы можете установить git config --global diff.noprefix true.
Лян
65
git diff HEAD file

покажет вам изменения, которые вы добавили в ваше рабочее дерево с момента последнего коммита. Все изменения (поэтапно или не поэтапно) будут показаны.

ouah
источник
1
Ваше решение работает. Но я немного смущен. HEAD указывает на последний номер коммита. Итак, когда мы добавляем git add, обновляется индекс рабочего каталога, а не HEAD. Так как же это показывает разницу.
Mav55
17

Чтобы проверить местные различия:

git diff myfile.txt

или вы можете использовать инструмент сравнения (если вы хотите отменить некоторые изменения):

git difftool myfile.txt

Для git difftoolболее эффективного использования установите и используйте свой любимый инструмент с графическим интерфейсом, например, Meld, DiffMerge или OpenDiff.

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

Чтобы проверить изменения для каждой строки, используйте:, git blameкоторый покажет, какая строка была зафиксирована в каком коммите.


Чтобы просмотреть фактический файл перед фиксацией (где masterнаходится ваша ветка), выполните:

git show master:path/my_file
kenorb
источник
15

Вы пробовали -v(или --verbose) вариант для git commit? Он добавляет разницу в коммит в редакторе сообщений.

vhallac
источник
Хороший ответ. Это может предоставить информацию в редакторе коммитов, облегчает коммит. Есть ли способ закрыть информационную область, из-за Changes not staged for commit:которой редактор коммитов может стать более чистым.
Радиан Дженг
15

Другой метод, который стоит рассмотреть, если вы хотите сравнить файл с последним коммитом, который более педантичен:

git diff master myfile.txt

Преимущество этого метода в том, что вы можете сравнить его с предпоследним коммитом:

git diff master^ myfile.txt

и тот, что до этого:

git diff master^^ myfile.txt

Также вы можете заменить '~' символом каретки '^' и 'имя вашей ветки' на 'master', если вы не находитесь в главной ветке.

anisbet
источник
14

Я думаю, что это идеальный вариант использования, гарантирующий графический интерфейс. - Хотя я полностью понимаю, что это также может быть достигнуто достаточно хорошо в командной строке.

Лично каждый коммит я делаю из гит-гуй. В котором я могу сделать несколько атомарных коммитов с отдельными фрагментами / строками, если это имеет смысл.

Gut Gui позволяет просматривать различия в хорошо отформатированном цветном интерфейсе, довольно легкий. Похоже, это то, что вы должны проверить тоже.

Лакшман Прасад
источник
Я согласен - это также позволяет вам редактировать сообщение коммита, глядя на diff.
Франсуа
Приятно знать, но я бы хотел придерживаться CLI. Я использовал пару пакетов, которые имели его, но я перешел в строго терминал / VIM для моего рабочего процесса. Спасибо хоть.
Соус McBoss
Да, если вы придерживаетесь GUI, есть много интересных функций git bisect, которые на самом деле не доступны.
NoBugs
2
Я согласен - есть много вариантов, для которых это намного быстрее и имеет больше смысла использовать командную строку. Тем не менее, предварительный просмотр изменений не является одним из них.
VitalyB
Есть также текстовые пользовательские интерфейсы, которые запускаются в терминале. Стоит проверить tig«интерфейс текстового режима для Git».
smido
11

В macOS перейдите в корневой каталог git и введите git diff *

catanore
источник
4

Лучший способ, который я нашел, кроме использования выделенного графического интерфейса для коммитов, - это использовать git difftool -d- Это открывает ваш инструмент сравнения в режиме сравнения каталогов, сравнивая HEAD с текущей грязной папкой.

VitalyB
источник
именно то, что мне было нужно. Спасибо
Иван Феррер Вилла
3
git difftool -d HEAD filename.txt

Это показывает сравнение, используя окно щелевой VI в терминале.

Tomachi
источник