Ответ 1
git diff
для неустановленных изменений. git diff --cached
для поэтапных изменений.
Скажем, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч от тех, у кого нет необходимости создавать коммит?
git diff
для неустановленных изменений. git diff --cached
для поэтапных изменений.
Если вы еще не зафиксировали изменения, то:
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
.
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
Чтобы создать патч с измененными и новыми файлами (поэтапно), вы можете запустить:
git diff HEAD > file_name.patch
Мне нравится:
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 .
Если вы хотите сделать двоичный код, укажите --binary
при запуске git diff
.