Я делаю что-то очень простое неправильно. Я пытаюсь подготовить обычный файл патча, чтобы я мог применить некоторые изменения:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
С something_here
пустым это почти работает, но имена файлов не верны. Я думаю, что я просто упускаю какой-то вариант.
В реальной жизни я собираюсь сделать слияние после проверки, так что патч может потерпеть неудачу, но вы видите, к чему я клоню.
Отредактируйте
Мою ошибку здесь, чтобы задать неправильный вопрос. Вопрос в том, хочу ли я сохранить свои изменения, выполнить слияние, а затем повторно применить изменения, если это возможно? Я спросил это неправильно, потому что я привык использовать патч для решения такого рода проблем и git diff
выглядел так, как будто он хотел, чтобы я это сделал.
На комментарий Чарльза Бейли был правильный ответ. Для меня git-apply - это то, что нужно делать (git-stash выглядит тяжелее, чем мне нужно, а перебазирование и связки определенно выходят за рамки моего текущего уровня навыков.) Я собираюсь принять ответ, который дал Чарльз (потому что вы не могу принять комментарий). Спасибо за все предложения.
Редактировать, 6 лет спустя.
Как любой, кто знаком с предметом, знает, я переоценил сложность git stash
. Почти каждый день я буду использовать следующую последовательность:
$ git stash
$ git merge
$ git stash pop
patch
а неgit apply
?git stash
или другие инструменты git?git stash
это самое простое решение для того, что вы пытаетесь сделать, но есть много подходов, которые работают.git-svn
.Ответы:
Если вы хотите использовать патч, вам нужно удалить
a/
b/
префиксы, используемые git по умолчанию. Вы можете сделать это с--no-prefix
опцией (вы также можете сделать это с-p
опцией патча ):Тем не менее, обычно проще использовать прямую,
git diff
а затем использовать выход для подачиgit apply
.Большую часть времени я стараюсь избегать использования текстовых патчей. Обычно один или несколько временных коммитов объединяются с ребазой,
git stash
а пакеты проще в управлении.Для вашего случая использования я думаю, что
stash
это наиболее подходит.источник
git diff --no-prefix master > diff.patch
а затемgit checkout master
patch -p0 < diff.patch
patch --dry-run < diff.patch
перед выполнением последней команды.patch
вне git (возможно, используя файл патча, сгенерированныйdiff
) в более общем случае.Просто используйте
-p1
: вам все равно придется использовать-p0
в--no-prefix
случае, так что вы можете просто пропустить--no-prefix
и использовать-p1
:источник
git diff
выводит строку, котораяpatch
игнорируетgit apply
это путьУ git diffs есть дополнительный сегмент пути перед файлами. Вы можете удалить эту запись в пути, указав -p1 с патчем, вот так:
источник
save.patch
файл куда угодно (включая двоичные файлы).git apply <file>
источник
git diff > save.patch
иgit checkout .
вместо сброса, но да ...git apply
или делал diff соответствующим вашему состоянию и указателем на последний доступный коммит. Делать простоgit diff
ничего не сделалgit apply
. Сутьgit diff
в (я думаю) в использованииgit reset
- отношения между репо, индексом и рабочей областью являются проблемой.Полезный прием, позволяющий избежать создания временных файлов исправлений:
источник
git stash show -p stash@{3} | patch -p1 -d [dst-dir]