У чому різниця між 'git format-patch та' git diff '?


92

Я не бачу різниці між результатом 'git format-patch' та 'git diff', чи є такий? І чи не зможу я використовувати 'git diff' для створення патча, а потім застосувати його за допомогою git apply?

Моя проблема полягає в тому, що я додав зміни до індексу, але, мабуть, git format-patch приймає лише коміти, тому, якщо я можу використовувати вивід diff, тоді я можу використовувати цю команду для створення патча для змін в індексі:

git diff --cached > index.patch

Відповіді:


129

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

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

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


12

З посібників git-format-patch готує виправлення, придатні для надсилання електронної пошти, тоді як git-diff відображає зміни.

Це дві різні речі, які мають різні цілі, вони просто виводять формат виправлення. Але git-format-patchдодає дані про коміт (дату, автора, повідомлення коміту) та об’єднує їх у формат, який підходить для надсилання як поштове повідомлення Unix (хоча це лише файли, тому їх можна надсилати іншими методами та все ще застосовувати git-am).

Також git-format-patchгенерує файл виправлення для кожного коміту в зазначеному вами діапазоні. Ці зміни будуть додані як коміти до вашого сховища за допомогою git-am.

git-diffпросто показує різницю між двома станами, які ви просите, і може бути використаний для створення файлу виправлення. Але це просто звичайний файл виправлення, і застосування виправлення просто змінить стан робочого каталогу.

І так, ви можете створити патч для вашого індексу таким чином.


Дякую. У чому особливість пошти UNIX, щоб вони розробили патч на її основі?
Рафід

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.