Що таке патч у контролі версій git?


136

Я новачок як в git, так і в контролі версій, тому я намагаюся розібратися, що таке патч і чим він відрізняється від решти діяльності, яку я займаюся в git?

Коли я наношу пластир? Чи трапляється це кожен раз, коли я вчиняю?

Відповіді:


116

Ви можете побачити в цій публікації блогу, як можна створити виправлення (колекція змін, які потрібно зв’язати, та застосувати до іншого репо)

git patch
(малюнок із публікації в блозі 2008 року " Біорубі з git: як би це працювало? ", опублікований Ян AERTS )

Дивіться також Додавання до Rails with Git як іншого конкретного прикладу.

На сьогоднішній день запит на притягнення GitHub дуже просто застосувати патчі на репозиторіях GitHub, що корисно, коли ви не є прямим учасником (тобто ви не маєте права безпосередньо натискати на репо).
Насправді, зовсім недавно GitHub представив " Краще натягуйте запит електронної пошти ", щоб покращити сповіщення про нові виправлення.


4
Хороша відповідь, і одна, яка говорить мені, що «латка» GIT - це не те, що я шукаю.
RonLugge

91

Patch - це програма Unix, яка оновлює текстові файли відповідно до інструкцій, що містяться в окремому файлі, який називається патч-файлом.

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

Тепер, що таке файл виправлення? Скажімо, у вас є текстовий файл з 2 рядків:

This is line A.
This is line B, or otherwise #2.

Потім ви змінюєте перший рядок, і тепер ваш файл виглядає так:

This is SPARTA.
This is line B, or otherwise #2.

Як би ви описали зміну до вмісту файлу? Ви можете сказати, що перший рядок "Це рядок А." замінено на "Це SPARTA.", або навіть останнє слово "A" першого рядка замінено на інше слово "SPARTA". І це саме те , що диференціал говорить нам. Скажімо, у мене є дві версії цього файлу, одна називається file1.txt, а інша file2.txt, тоді я запускаю diff і отримую це:

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

Описавши зміни, ви можете застосувати її до початкового вмісту та отримати модифікований вміст. І ті зміни, викладені в уніфікованому форматі, які можуть зрозуміти "схожі" програми, називаються файлом патчу. Це як замість того, щоб дістати рибу від того, кого вони навчать, як ловити рибу, щоб ви могли викопати цю рибу з води самостійно. Тепер застосуємо наш патч до file1.txt, щоб він виглядав точно як file2.txt:

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

Ви можете подумати, що простіше просто мати дві версії цього файлу. Що ж, у цьому простому випадку це правда. Але коли у вас багато файлів, а файли дуже великі, набагато ефективніше зробити кілька рядків змін, а не дві копії всієї справи.

Якщо говорити з приводу git, файл патча все ще означає те саме, але використання патчу diff + себе було б кошмаром. Наприклад, вам завжди доведеться перевірити дві версії файлу (або навіть цілого сховища), щоб порівняти їх. Це не звучить так добре, чи не так? Таким чином, git піклується про всю важку роботу для вас - він порівнює ваш локальний файл з тим, що є у сховищі, з яким ви працюєте, і може показати це вам як "diff" або застосувати цей "diff" як патч aka здійснити ваші зміни або навіть дозволити вам застосувати якийсь файл патча, який у вас уже є. Не заглиблюючись у деталі, в цьому сенсі git абсолютно такий же, як і інші системи управління версіями, такі як SVN, або навіть CVS або perforce.

Сподіваюся, це допомагає!


Ніколи не знав, що git використовує вбудовану patchпрограму. Я думав, що git має власну реалізацію.
радіантшоу

43

Патч - це невеликий файл, який вказує на зміни, внесені у сховище. Зазвичай він використовується, коли хтось із вашої команди має доступ лише для читання, але у нього є добра зміна коду. Потім він створює патч і надсилає його вам. Ви застосовуєте його і натискаєте на сховище git. Тоді всі користуються оновленою версією, а автору патча не потрібен доступ для читання / запису.

Це дійсно в основному справа безпеки (принаймні, для цього користуються люди).


1
Додаткова інформація: Хоча git не використовує патчі внутрішньо, одна мета дизайну для git - це спростити обмін патчами (адже багато проектів працюють саме так, наприклад, Linux і git). Таким чином, git має спеціальні команди для обробки патчів ( git diffпоказує зміни як патчі за замовчуванням, git applyдозволяє застосовувати патч тощо).
sleske

Поздравлення! Ви дійсно прибивали його до того, для чого використовуються патчі, тобто засоби для подання змін у сховища, до яких автор змін не має доступу для запису. Отже, модель запиту fork and pull GitHub є заміною патч-моделі розподілу змін. Тож я вважаю, що патчі корисні лише поза контексту таких інструментів, як GitHub.
mljrg

8

Файл патча являє собою єдиний набір змін, які можна застосувати до будь-якої гілки в будь-якому порядку. Використовуючи патч, ви отримаєте відмінності між одним або кількома файлами. А пізніше ви можете застосувати відмінності (патч), щоб отримати зміни в нових файлах. У Git існує багато застосувань для виправлення. Якщо у вашому робочому каталозі залишилися зміни, і вам потрібно отримати ці зміни, щоб застосувати їх десь ще, просто створіть патч та застосуйте патч.

git diff > mypatch.patch

Якщо у вашому сховищі є нові файли (без трекінгу), слід встановити файл перед створенням виправлення (не виконувати запис) та скористатися наступною командою

git diff --cached > mypatch.patch 

Пізніше ви можете застосувати виправлення:

git apply mypatch.patch

Якщо ви хочете внести деякі зміни в сховище git, у вас немає дозволу на запис, просто внесіть зміни та створіть патч між обома, і надішліть патч тому, хто має дозвіл застосувати патч, цим ваші зміни слід додати до цього сховища git.


Кращі демонстрації: robots.thoughtbot.com/… . Мій основний приклад резюме: git format-patch <base_commit_or_branch_name>= завершіть усі комісії відтепер назад до <base_commit_or_branch_name> у гарні та акуратні файли, що містять розрізнення, а також повідомлення фіксації, для легкого надсилання (наприклад: електронною поштою) комусь, хто хоче їх виправити їх кодова база. Тоді одержувач виправляє свою систему своїм файлом:cat *.patch | git am
Габріель Штаплес

7

Патч - це набір відмінностей між одним або декількома файлами, щоб показати, що між ними відрізняється. Зазвичай ви генеруєте лише патч, щоб показати комусь, що ви змінили. Приклад, коли ви можете це зробити, - це коли ви знайдете та виправите помилку у програмі з відкритим кодом, а потім опублікуйте виправлення в їх трекері помилок.

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