Могу ли я получить совместимый с патчем вывод из git-diff? - PullRequest
150 голосов
/ 06 января 2011

Я делаю что-то очень простое неправильно.Я пытаюсь подготовить обычный файл патча, чтобы я мог применить некоторые изменения:

$ git diff > before
$ git diff something_here > save.patch
$ git checkout . 
$ patch < save.patch
$ git diff > after
$ diff before after
$

С something_here blank это почти работает, но имена файлов не верны,Я думаю, я просто упускаю какой-то вариант.

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

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

Чарльз Бейли комментарий имел правильный ответ.Для меня git-apply - это то, что нужно делать (git-stash выглядит тяжелее, чем мне нужно, а перебазирование и связки определенно выходят за рамки моего текущего уровня навыков.) Я собираюсь принять ответ, который дал Чарльз (потому чтоне могу принять комментарий).Спасибо за все предложения.

Редактировать, 6 лет спустя Как известно любому, кто знаком с предметом, я переоценил сложность git stash.Почти каждый день я буду использовать следующую последовательность:

$ git stash
$ git merge
$ git stash pop

Ответы [ 5 ]

211 голосов
/ 06 января 2011

Просто используйте -p1: вам все равно придется использовать -p0 в случае --no-prefix, так что вы можете просто пропустить --no-prefix и использовать -p1:

$ git diff > save.patch
$ patch -p1 < save.patch

$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch
132 голосов
/ 06 января 2011

Если вы хотите использовать патч, вам нужно удалить префиксы a/ b/, используемые git по умолчанию.Вы можете сделать это с опцией --no-prefix (вы также можете сделать это с опцией -p патча):

git diff --no-prefix [<other git-diff arguments>]

Обычно, однако, проще использовать прямую git diff и затем использовать выводдля подачи на git apply.

Большую часть времени я стараюсь избегать использования текстовых патчей.Обычно одним или несколькими временными коммитами в сочетании с rebase, git stash и пакетами легче управлять.

Для вашего случая использования я думаю, что stash является наиболее подходящим.

# save uncommitted changes
git stash

# do a merge or some other operation
git merge some-branch

# re-apply changes, removing stash if successful
# (you may be asked to resolve conflicts).
git stash pop
16 голосов
/ 06 января 2011

В git diffs есть дополнительный сегмент пути перед файлами. Вы можете удалить эту запись в пути, указав -p1 с патчем, например:

patch -p1 < save.patch
8 голосов
/ 05 сентября 2014
  1. Я сохраняю разность текущего каталога (включая незафиксированные файлы) для текущего заголовка.
  2. Затем вы можете перенести файл save.patch куда угодно (включая двоичные файлы).
  3. На целевом компьютере примените патч, используя git apply <file>

Примечание: он также относится к текущим поставленным файлам.

$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch
8 голосов
/ 14 декабря 2013

Полезный прием, позволяющий избежать создания временных файлов исправлений:

git diff | patch -p1 -d [dst-dir]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...