Как взять файл git diff и применить его к локальной ветке, которая является копией того же репозитория?

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

Очевидно, я мог бы идти строка за строкой и перепечатывать все заново, но я бы предпочел не подвергать систему человеческой ошибке. Как это сделать проще всего?


person Mike_K    schedule 07.09.2012    source источник
comment
У меня возникли проблемы с использованием git diff и git apply, потому что я использовал псевдоним, который переведен на git diff --ignore-all-space. Это сделало мой патч недействительным. Обязательно используйте голый git diff!   -  person Christian Oudard    schedule 02.06.2021


Ответы (2)


Скопируйте файл diff в корень вашего репозитория, а затем выполните:

git apply yourcoworkers.diff

Дополнительная информация о команде apply доступна на ее справочной странице.

Между прочим: лучший способ обмена целыми коммитами по файлам - это комбинация команд git format-patch на отправителе, а затем git am на получателе, потому что он также передает информацию об авторстве и сообщение о фиксации.

Если приложение исправления не работает, и если коммиты, из которых была сгенерирована разница, действительно находятся в вашем репо, вы можете использовать параметр -3 для apply, который пытается объединить изменения.

Он также работает с конвейером Unix следующим образом:

git diff d892531 815a3b5 | git apply
person Philipp    schedule 07.09.2012
comment
Спасибо за ответ, но это вызвало ошибку: patch failed: filename.php: 202 error: filename.php: patch not apply. Хорошей новостью является то, что это не первое имя файла в файле, поэтому он, по крайней мере, смог бы обработать часть файла. Есть предположения? - person Mike_K; 07.09.2012
comment
У вас также есть изменения в этом файле, которые мешают работе патча. Чтобы решить эту проблему, вы можете зафиксировать свои изменения, создать новую ветку, сбросить ее до фиксации, в которой вы и ваш коллега разошлись, применить патч, зафиксировать его, а затем объединить две ветки. - person Philipp; 07.09.2012
comment
Файл слишком отличался от того, что существовал в этом случае, чтобы использовать файл diff. Я пошел дальше и сделал это вручную, но +1 для правильной команды, и я согласен, что это должен был быть правильный ответ. - person Mike_K; 07.09.2012
comment
Как отменить разницу? - person orlybg; 16.09.2014
comment
@orlybg Если вы еще не зафиксировали его, сделайте git reset --hard, чтобы вернуть ваше рабочее дерево к последней фиксации. Когда вы уже зафиксировали его, добавьте ревизию, к которой хотите вернуться. - person Philipp; 16.09.2014
comment
Спасибо, @Philipp, но как насчет того, чтобы у вас были другие незавершенные изменения в ветке, и вы просто хотите избавиться от тех, которые поступают из diff? - person orlybg; 17.09.2014
comment
@orlybg Извините, но тогда вы облажались. Git создает только контрольную точку, к которой вы можете вернуться, когда делаете коммит. Вот почему многие руководства по git рекомендуют совершать рано и часто.. - person Philipp; 17.09.2014
comment
По крайней мере, @orlybg запустите git stash, прежде чем выполнять какое-либо действие, которое вы, возможно, захотите отменить после. В любом случае вы можете вернуть свой тайник и зафиксировать его позже. - person maurice; 29.09.2015
comment
@Philipp Это не совсем точно, см. git apply --reverse. - person Radon Rosborough; 26.05.2017
comment
Мне кажется, что format-patch намного стабильнее, чем diff. Я только 3 раза потерпел неудачу с использованием diff, но мгновенный успех с использованием format-patch. - person cwhsu; 07.03.2019
comment
Замечательно! работал у меня, мне нужно было применить в мастере отличия от другой ветки, связанные только с определенным путем, поэтому я сделал: git diff master other_branch -- my_dir_path | git apply - person herrera; 19.03.2019
comment
Работает отлично. Хотя нет необходимости помещать файл diff в корень репо. Его можно разместить где угодно (например, ~ / Desktop) - person Jose_GD; 30.04.2019
comment
если при запуске этой команды вы получаете xcrun: error: неверный путь активного разработчика (/ Library / Developer / CommandLineTools), отсутствует xcrun в: / Library / Developer / CommandLineTools / usr / bin / xcrun, вам необходимо установить команду XCode или XCode линейные инструменты. studytonight.com/ post / - person 1.21 gigawatts; 04.02.2021
comment
флаг --binary также может быть полезен, если у вас есть двоичные файлы, добавленные в связанные коммиты - person ktsangop; 10.03.2021
comment
У меня возникли проблемы с этим, потому что я использовал псевдоним, который переводился как git diff --ignore-all-space. Обязательно используйте просто git diff! - person Christian Oudard; 02.06.2021

Похоже, вы также можете использовать команду patch. Поместите diff в корень репозитория и запустите patch из командной строки.

patch -i yourcoworkers.diff

or

patch -p0 -i yourcoworkers.diff

Вам может потребоваться удалить ведущую структуру папок, если они создали разницу без использования --no-prefix.

Если да, то вы можете удалить части папки, которые не применяются, используя:

patch -p1 -i yourcoworkers.diff

-P (n) указывает, сколько частей структуры папок нужно удалить.

Подробнее о создании и применении исправлений здесь .

Вы также можете использовать

git apply yourcoworkers.diff --stat 

чтобы увидеть, применит ли к различию какие-либо изменения по умолчанию. Он может сказать, что затронуты 0 файлов, если исправление применено неправильно (другая структура папок).

person 1.21 gigawatts    schedule 04.02.2021