Могу ли я получить совместимый с патчем вывод из git -diff?
Я делаю что-то очень простое. Я пытаюсь подготовить обычный файл патча, поэтому я могу повторно применить некоторые изменения:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
С something_here
blank он почти работает, но имена файлов неверны. Я думаю, что я просто упускаю какой-то вариант.
В реальной жизни я собираюсь сделать слияние после проверки, так что патч может потерпеть неудачу, но вы видите, что я получаю.
Edit
Моя ошибка здесь, чтобы задать неправильный вопрос. Фактический вопрос заключается в том, что я хочу сохранить свои изменения, выполнить слияние, а затем повторно применить изменения, если это возможно? Я спросил его не так, потому что я привык использовать патч для решения таких проблем, и git diff
выглядел так, как мне хотелось.
Комментарий Чарльза Бейли был правильным ответом. Для меня, git -apply - это правильная вещь (git -stash выглядит более тяжелым, чем мне нужно, и переполнение и комплектация определенно выше моего нынешнего уровня квалификации.) Я собираюсь принять ответ Charles (потому что вы не можете принять комментарий). Спасибо за все предложения.
Изменить, 6 лет спустя
Как известно любому знакомому с предметом, я переоценил трудность git stash
. Почти каждый день или около того, я буду использовать следующую последовательность:
$ git stash
$ git merge
$ git stash pop
Ответы
Ответ 1
Если вы хотите использовать патч, вам нужно удалить префиксы a/
b/
, которые по умолчанию использует git. Вы можете сделать это с помощью опции --no-prefix
(вы также можете сделать это с помощью параметра patch -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
Ответ 2
Просто используйте -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
Ответ 3
В параметрах git есть дополнительный сегмент пути, добавленный к пути к файлу. Вы можете удалить эту запись в пути, указав -p1 с патчем, например:
patch -p1 < save.patch
Ответ 4
Полезный трюк, чтобы избежать создания временных файлов исправлений:
git diff | patch -p1 -d [dst-dir]
Ответ 5
- Я сохраняю diff текущего каталога (включая незафиксированные файлы) против текущего HEAD.
- Затем вы можете переносить файл
save.patch
туда, где есть (включая двоичные файлы).
- На вашей целевой машине примените патч, используя
git apply <file>
Примечание: он также выполняет текущие поэтапные файлы.
$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch
Ответ 6
Как упоминалось @ndim
$ git diff > save.patch
создает патч, файл save.patch создается в том же базовом каталоге кода. Этот файл можно использовать совместно с другими. После того, как вы сохраните файл save.patch, запустите
$ patch -p1 < save.patch
применить патч к базе кода