GIT: Применение изменений файлов для ранних коммитов

На работе сложилась такая ситуация, что выпуск нового релиза содержал некоторые ошибки, репозиторий GIT имел одну ветку master. Уже было добавлена целая куча “плюшек”, изменена структура конфигов, в общем alarm’а! Надо было решать ошибки… Сначала был выработан план действий:
  1. Создаем и переходим на новую ветку
  2. Делает жесткий резет на необходимый коммит
  3. Создаем патчи для применения
  4. Применяем патчи
  5. PROFIT!
Конечно же первым делом наткнулся на команду, позволяющую накладывать изменения разницей между коммитами: $ git cherry-pick <commit> Только, как оказалось, git cherry-pick не умеет делать коммиты для отдельных файлов… Но на тех нарвались! ) После еще недольшого серфинга, оказалось, что GIT способен создвать и накладывать патчи для отдельных файлов, для отправки, например, по почте – то что нужно! В итоге получились примерно следующие действия: $ git checkout -b other_way_commit $ git reset --hard HEAD^^^ $ git format-patch 3953a311d1f6a5aa31b3f2bf35cc2a5e9e7b9f7a..ca777165fad4ed3955aad34188ddaeabe68334d2 <file> Далее производим выборку необходимых изменений файлов (или коммита целиком) из разницы определенных коммитов, используя git format-patch. Применяем остальные полученные патчи. $ git am < 0001-Comment-on-commit.patch Возможно будет необходимо вручную внести изменения, при ошибке патчинга, в этом случае закрепление патча производится командой: $ git am --resolved Затем, после применения патчей командой git am, можно удалить все созданные нами патчи. UPD: Позже было найдено еще более простое решение: $ git diff HEAD..HEAD^^^^ | patch -p В помощь при понимании процесса: http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/ru/ch06.html

Leave a Reply

Your email address will not be published. Required fields are marked *