В чем разница между git format-patch и git diff?

92

Я не вижу разницы между выводом 'git format-patch' и 'git diff', есть ли? И не смогу ли я использовать git diff для создания патча, а затем применить его с помощью git apply?

Моя проблема в том, что у меня есть изменения, добавленные в индекс, но, очевидно, git format-patch принимает только коммиты, поэтому, если я могу использовать вывод diff, я могу использовать эту команду для создания патча для изменений в индексе:

git diff --cached > index.patch
Рафид
источник

Ответы:

130

Патч, созданный с помощью git format-patch, также будет включать некоторую метаинформацию о фиксации (коммиттер, дату, сообщение фиксации, ...) и будет содержать различие двоичных данных. Все будет отформатировано как электронное письмо, чтобы его можно было легко отправить. Затем человек, который его получит, может воссоздать соответствующий коммит, git amи все метаданные останутся нетронутыми. Его также можно применять, так git applyкак это супернабор простого diff.

Патч с git diffдобавлением будет простой разницей с контекстом (подумайте diff -u). Его также можно применить, git applyно метаданные не будут воссозданы (так как их нет).

Таким образом, git format-patchполезно передать фиксацию, в то время git diffкак полезно получить разницу между двумя деревьями.

Сильвен Дефресн
источник
13

Из руководств git-format-patch подготавливает исправления, подходящие для отправки по электронной почте, а git-diff показывает изменения.

Это две разные вещи и имеют разные цели, они просто выводят формат патча. Но git-format-patchдобавляет данные о фиксации (дата, автор, сообщение фиксации) и объединяет их в формат, подходящий для отправки в качестве почтового сообщения Unix (хотя это просто файлы, поэтому их можно отправлять другим методам и по-прежнему применять с помощью git-am).

Также git-format-patchгенерирует файл исправления для каждой фиксации в указанном вами диапазоне. Эти изменения будут добавлены в ваш репозиторий как коммиты с расширением git-am.

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

И да, таким образом вы можете создать патч для своего индекса.

Abizern
источник
Спасибо. Что особенного в почте UNIX, что на ее основе был разработан патч?
Rafid 07
7
В этом нет ничего особенного. Просто git был разработан Линусом Торвальдсом, рабочий процесс которого включал отправку и получение исправлений по электронной почте для проверки перед интеграцией в ядро ​​Linux.
Sylvain Defresne
Git был разработан Линусом Торвальдсом для хранения ядра Linux. Обычным форматом была почта Unix.
Abizern
1

Файл патча можно сгенерировать с помощью git diffкоманды, но по сравнению с патчем, созданным git format-patchкомандой, основные отличия заключаются в следующем:

  1. Нет метаданных о фиксации (таких как дата, автор, сообщение фиксации и т. Д.);
  2. Нет статистики о различиях (diffstat, например, x файлов изменено, y вставок (+), z удалений (-));
  3. Никаких двоичных различий, только текстовые различия.

введите описание изображения здесь

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

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

Чтобы применить сгенерированный файл патча:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
К. Символ
источник