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

492

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

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

mike_k
источник

Ответы:

747

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

git apply yourcoworkers.diff

Более подробная информация о applyкоманде доступна на ее странице руководства .

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

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

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

git diff d892531 815a3b5 | git apply
Philipp
источник
3
Спасибо за ответ, но это вызвало ошибку: исправление не удалось: filename.php: 202 ошибка: filename.php: исправление не применяется. Хорошая новость заключается в том, что это не первое имя файла в файле, поэтому, по крайней мере, он смог бы обработать часть файла. Какие-нибудь мысли?
Mike_K
4
У вас также, кажется, есть изменения в этом файле, которые мешают работе патча. Чтобы решить эту проблему, вы можете зафиксировать свои изменения, создать новую ветку, сбросить ее до коммита, где вы и ваш коллега разошлись, применить исправление, зафиксировать его, а затем объединить две ветви.
Филипп
3
@orlybg Когда вы еще этого не сделали, git reset --hardверните свое рабочее дерево к последнему. Если вы уже зафиксировали его, добавьте ревизию, к которой хотите вернуться.
Филипп
5
@orlybg Извините, но тогда вы облажались. Git создает только контрольную точку, к которой вы можете вернуться, когда делаете коммит. Вот почему многие руководства по git рекомендуют делать это рано и часто .
Филипп
4
@orlybg, по крайней мере, запустите git stashперед тем, как выполнить какое-либо действие, после которого вы, возможно, захотите вернуться . В любом случае, вы можете вернуть свой тайник и зафиксировать его на более позднем этапе.
Морис