Что такое патч в контроле версий git?

137

Я новичок в git и в управлении версиями, поэтому я пытаюсь выяснить, что такое патч и чем он отличается от остальных действий, которые я выполняю в git?

Когда я могу применить патч? Это происходит каждый раз, когда я фиксирую?

Амит Эрандол
источник

Ответы:

116

В этом посте вы можете увидеть, как создать патч (набор изменений, о которых вы хотите сообщить и применить к другому репо).

мерзкий патч
(картинка из поста в блоге 2008 года " Bioruby with git: как это будет работать? ", опубликованная Jan AERTS )

Смотрите также Вклад в Rails с помощью Git в качестве другого конкретного примера.

В настоящее время пул-запрос GitHub позволяет очень просто применять патчи к репозиториям GitHub, что полезно, когда вы не являетесь непосредственным участником (т. Е. У вас нет права напрямую продвигаться к репо).
На самом деле, совсем недавно GitHub представил « Better Pull Request Emails » для улучшения уведомления о новых патчах.

VonC
источник
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.

Как бы вы описали изменение содержимого файла? Вы можете сказать, что первая строка «Это строка А.» его заменили на «Это СПАРТА», или даже последнее слово «А» в первой строке заменили другим словом «СПАРТА». И это именно то, что говорит нам diff . Допустим, у меня есть две версии этого файла, одна называется 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 + patch самостоятельно было бы кошмаром. Например, вам всегда нужно иметь две версии файла (или даже весь репозиторий), чтобы сравнить их. Звучит не так хорошо, правда? Итак, git берет на себя всю тяжелую работу за вас - он сравнивает ваш локальный файл с тем, что находится в репозитории, с которым вы работаете, и может показать его вам как «diff», или применить этот «diff» как patch aka фиксирует ваши изменения или даже позволяет вам применить какой-либо файл исправлений, который у вас уже есть. Не вдаваясь в детали, git в этом смысле абсолютно такой же, как и другие системы контроля версий, такие как SVN, или даже CVS или производительность.

Надеюсь, поможет!


источник
Никогда не знал, что Git использует встроенную patchпрограмму. Я думал, что у Git есть своя реализация.
Radiantshaw
43

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

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

Том ван дер Вёрдт
источник
1
Дополнительная информация: Хотя git не использует патчи для внутреннего использования, одной из целей разработки git является облегчение обмена патчами (потому что многие проекты работают таким образом, например, Linux и сам git). Так что в git есть специальные команды для обработки патчей ( git diffпоказывает изменения как патчи по умолчанию, git applyпозволяет применять патчи и т. Д.).
Слеське
Congratullations! Вы действительно отметили, для чего используются патчи, то есть средство для отправки изменений в репозитории, к которым у автора изменений нет прав на запись. Следовательно, модель запроса ветвления и извлечения GitHub является заменой модели патча распределения изменений. Поэтому я считаю, что патчи полезны только вне контекста таких инструментов, как GitHub.
mljrg
8

Файл исправления представляет собой единый набор изменений, которые можно применить к любой ветви в любом порядке. С помощью патча вы получите различия между одним или несколькими файлами. А позже вы можете применить различия (патч), чтобы получить изменения для новых файлов. Есть много вариантов использования патча в Git. Если у вас есть незафиксированные изменения в вашем рабочем каталоге, и вам нужно, чтобы эти изменения применялись где-то еще, просто создайте исправление и примените исправление.

git diff > mypatch.patch

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

git diff --cached > mypatch.patch 

Позже вы можете применить патч:

git apply mypatch.patch

Если вы хотите внести некоторые изменения в репозиторий git, для которого у вас нет разрешения на запись, просто внесите изменения и создайте исправление между ними, и отправьте исправление тому, у кого есть разрешение на применение исправления, этим Ваши изменения должны быть добавлены в этот репозиторий git.

Anuraj
источник
Лучшие демки: robots.thoughtbot.com/… . Резюме моего основного примера: git format-patch <base_commit_or_branch_name>= оберните все коммиты с этого момента обратно в <base_commit_or_branch_name> в красивые и аккуратные файлы, содержащие diff, а также сообщения коммитов, для легкой отправки (например, по электронной почте) кому-то еще, кто хочет их пропатчить их кодовая база. Затем получатель исправляет свою систему с помощью вашего файла:cat *.patch | git am
Габриэль Стейплс
7

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

Стив Рукутс
источник