Могу ли я получить совместимый с патчем вывод из 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

применить патч к базе кода