Как применить патч, созданный с помощью git format-patch?

У меня есть два локальных репозитория git, оба указывают на тот же удаленный репозиторий.

В одном репозитории git, если я сделаю git format-patch 1, как я могу применить этот патч к другому репозиторию?


person silverburgh    schedule 12.02.2010    source источник


Ответы (6)


Примечание: сначала вы можете предварительно просмотреть, что будет делать ваш патч:

Сначала статистика:

git apply --stat a_file.patch

Затем пробный прогон для обнаружения ошибок:

git apply --check a_file.patch

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

git am --signoff < a_file.patch 

См. Пример в этой статье:

В журнале git вы обнаружите, что сообщения о фиксации содержат тег Signed-off-by. Этот тег будет прочитан Github и другими, чтобы предоставить полезную информацию о том, как фиксация попала в код.

Пример

person VonC    schedule 12.02.2010
comment
Примечание для себя: 200-й золотой значок «Великий ответ». - person VonC; 15.05.2018
comment
git am < somepatch.patch дает фатальный результат: пустое имя идентификатора (для ‹›) не допускается. Может кто-нибудь объяснить мне, почему? - person birgersp; 03.09.2019
comment
@ gromit190, что означает плохие Author заголовки в патче и / или вы не git config user.{name,email}. - person ulidtko; 18.06.2020
comment
OK; git apply --check говорит patch does not apply, а git apply -3 говорит repository lacks the necessary blob to fall back on 3-way merge. В git перебазирование коммитов - такая легкая задача; но как люди переустанавливают свои исправления поверх обновленного кода? - person ulidtko; 18.06.2020
comment
@ulidtko Может быть, с stackoverflow.com/a/15375869/6309? - person VonC; 18.06.2020
comment
@VonC, как мне вернуться, прежде чем применить патч? - person x-rw; 10.12.2020

Или, если вы придерживаетесь старой школы:

cd /path/to/other/repository
patch -p1 < 0001-whatever.patch
person Dominic Cooney    schedule 12.02.2010
comment
Просто чтобы вы знали: это не создаст фиксацию, поэтому будет потеряно сообщение фиксации и информация об авторе. - person Caesar; 27.07.2019
comment
У меня были случаи, когда это работало, когда git apply не работает, не знаю, почему - person Sean Breckenridge; 01.11.2020
comment
Это очень полезно, если вы пытаетесь применить патч к пути или файлу, который игнорируется Git, и у вас есть патч в формате Git. - person Brady; 02.01.2021

Сначала вы должны обратить внимание на разницу между git am и git apply

Когда вы используете git am, вы обычно хотите применить много исправлений. Таким образом следует использовать:

git am *.patch

или просто:

git am

Git автоматически найдет патчи и применит их по порядку ;-)

UPD
Здесь вы можете узнать, как создавать такие исправления.

person Eugen Konkov    schedule 20.09.2018
comment
Это объяснение разницы помогло мне использовать git apply .. и --reverse :-) ???? - person Jordan Gee; 12.09.2019

Если вы хотите применить его как фиксацию, используйте git am.

person Jakub Narębski    schedule 12.02.2010
comment
Как вы обычно получаете файлы mbox? - person Ciro Santilli 新疆再教育营六四事件ۍ 06.03.2018
comment
или просто используйте git apply - person Sebi2020; 19.01.2021
comment
@ Sebi2020: git apply применяет изменения как патч, а не как фиксацию, в то время как git am предполагает, что текст электронного письма является сообщением фиксации (с некоторыми исключениями), и применяет изменения, создавая фиксацию (и может попытаться разрешить конфликты с 3- способ слиться с git am --3way. - person Jakub Narębski; 19.01.2021
comment
Я не могу заставить git am работать. Он останавливается в середине, применяя изменения, и сгенерированный коммит является неполным. - person KansaiRobot; 04.07.2021
comment
@KansaiRobot: при применении изменений может возникнуть конфликт содержимого, но в вашем комментарии недостаточно информации; опубликуйте проблему как вопрос, как можно подробнее. - person Jakub Narębski; 05.07.2021

Если вы используете IDE JetBrains (например, IntelliJ IDEA, Android Studio, PyCharm), вы можете перетащить файл патча и поместить его внутри IDE, и появится диалоговое окно, показывающее содержимое патча. Все, что вам нужно сделать сейчас, это нажать «Применить патч», и будет создана фиксация.

person ice1000    schedule 14.05.2018
comment
Спасибо за это. Это действительно полезно для всех. Есть принятый ответ. но это тоже полезно. - person Lasitha Benaragama; 23.08.2018
comment
@ambarox Но этот ответ был однажды отвергнут, я не знаю почему - person ice1000; 23.08.2018
comment
может быть кто-то думает, что единственный способ применить исправления - через командную строку. : D Я дал вам положительный голос. приветствует приятель. - person Lasitha Benaragama; 23.08.2018
comment
@LasithaBenaragama - вроде как. SO предназначен не только для помощи OP, но и для всех, кто следует. Этот ответ (хотя и полезный) не дает общего решения. Это был бы отличный небольшой пост в блоге, но не НАСТОЛЬКО хороший ответ. Объяснил бы отрицательный голос! - person OldTinfoil; 15.02.2020

person    schedule
comment
Возможно, это не ответ на исходный подробный вопрос, но он ответил на вопрос в заголовке, поэтому я на этой странице. благодарю вас! - person Rock Lee; 02.02.2017
comment
Я понимаю, что это старый вопрос и ответ ... но я подумал, что некоторым людям может быть полезно понять разница между git apply и git am. - person mgarey; 23.08.2017
comment
git apply [... полный путь к файлу ...] / name-of-file.patch - person Anton Lyhin; 11.07.2018