Что такое патч в контроле версий git? - PullRequest
108 голосов
/ 26 ноября 2011

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

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

Ответы [ 5 ]

97 голосов
/ 26 ноября 2011

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

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

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

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

72 голосов
/ 26 ноября 2011

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 или производительность.

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

34 голосов
/ 26 ноября 2011

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

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

7 голосов
/ 25 декабря 2016

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

git diff > mypatch.patch

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

git diff --cached > mypatch.patch 

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

git apply mypatch.patch

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

7 голосов
/ 26 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...