Скажем, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч от тех, у кого нет необходимости создавать коммит?
Создайте патч git из изменений в текущем рабочем каталоге
Ответ 1
git diff
для неустановленных изменений. git diff --cached
для поэтапных изменений.
Ответ 2
Если вы еще не зафиксировали изменения, то:
git diff > mypatch.patch
Но иногда случается, что часть того, что вы делаете, - это новые файлы, которые не отслеживаются и не будут отображаться в вашем git diff
. Итак, один из способов сделать патч состоит в том, чтобы подготовить все для нового коммита (git add
каждый файл или просто git add.
), Но не делать коммит, а затем:
git diff --cached > mypatch.patch
Добавьте опцию "двоичный", если вы хотите добавить двоичные файлы в патч (например, mp3 файлы):
git diff --cached --binary > mypatch.patch
Позже вы можете применить патч:
git apply mypatch.patch
Примечание. Вы также можете использовать --staged
как синоним --cached
.
Ответ 3
git diff
и git apply
будут работать для текстовых файлов, но не будут работать для двоичных файлов.
Вы можете легко создать полный двоичный патч, но вам придется создать временную фиксацию. После того, как вы сделали свою временную фиксацию, вы можете создать патч с помощью:
git format-patch <options...>
После того, как вы сделали патч, запустите эту команду:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Это приведет к откату вашей временной фиксации. Конечный результат оставляет вашу рабочую копию (намеренно) грязной с теми же изменениями, которые вы изначально имели.
На стороне приема вы можете использовать тот же трюк, чтобы применить изменения к рабочей копии, не имея истории фиксации. Просто примените патч и git reset --mixed <SHA of commit *before* the patches>
.
Обратите внимание, что вам, возможно, придется хорошо синхронизировать эту работу. Я видел некоторые ошибки при применении патчей, когда человек, делающий их, не сбрасывал столько изменений, сколько у меня было. Вероятно, есть способы заставить его работать, но я не смотрел далеко в него.
Здесь, как создать те же патчи в Tortoise Git (не то, что я рекомендую использовать этот инструмент):
- Зафиксируйте свои рабочие изменения.
- Щелкните правой кнопкой мыши корневой каталог ветки и нажмите
Tortoise Git
→Create Patch Serial
- Выберите, какой диапазон имеет смысл (
Since
:FETCH_HEAD
будет работать, если вы хорошо синхронизированы) - Создайте патч (ы)
- Выберите, какой диапазон имеет смысл (
- Щелкните правой кнопкой мыши корневой каталог ветки и нажмите
Tortise Git
→Show Log
- Щелкните правой кнопкой мыши фиксацию перед вашей временной фиксацией и нажмите
reset "<branch>" to this...
- Выберите опцию
Mixed
И как их применять:
- Щелкните правой кнопкой мыши корневой каталог ветки и нажмите
Tortoise Git
→Apply Patch Serial
- Выберите правильный патч и примените их
- Щелкните правой кнопкой мыши корневой каталог ветки и нажмите
Tortise Git
→Show Log
- Щелкните правой кнопкой мыши фиксацию перед фиксацией патча и нажмите
reset "<branch>" to this...
- Выберите опцию
Mixed
Ответ 4
Чтобы создать патч с измененными и новыми файлами (поэтапно), вы можете запустить:
git diff HEAD > file_name.patch
Ответ 5
Мне нравится:
git format-patch HEAD~<N>
где <N>
- число последних коммитов для сохранения в виде патчей.
Подробности использования команды находятся в DOC
UPD
Здесь вы можете найти, как их применять.
UPD Для тех, кто не получил представление о format-patch
Добавьте псевдоним:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
Затем в любом каталоге вашего репозитория проекта запустите:
git make-patch
Эта команда создаст 0001-uncommited.patch
в вашем текущем каталоге. Патч будет содержать все изменения и неотслеживаемые файлы, которые видны следующей команде:
git status .
Ответ 6
Если вы хотите сделать двоичный код, укажите --binary
при запуске git diff
.