четверг, 18 октября 2012 г.

Особенности использования git subtree

В Git есть замечательная возможность по внедрению в проект внешних проектов, называемая Subtree Merging. Её плюсы в том, что можно править код этого внешнего проекта и при необходимости/возможности вносить эти изменения в его хранилище. так же легко и прозрачно сливать новые изменения из этого внешнего проекта к себе.
Но не все так просто. В приведенной выше ссылке на главу книги, посвященной под-деревьям, не говорится о том, при сливании в свой проект свежих изменений из внешнего проекта вы теряете свои локальные изменения данного проекта.  Единственное упоминание об этом я нашел только в документации по модулю git-subtree, который является альтернативным способом использования под-деревьев.
merge::
 Merge recent changes up to <commit> into the <prefix> subtree. As with normal 'git merge', this doesn't remove your own local changes; it just merges those changes into the latest <commit>. With '--squash', creates only one commit that contains all the changes, rather than merging in the entire history.
Правильной стратегией использования под-деревьев является следующее:
  1. влить в свой проект внешний проект, как это описано в инструкции
  2. если требуются изменения в локальной копии внешнего проекта - делаем их и коммитим.
  3. если требуется слить к себе изменения внешнего проекта, то в начале нужно слить локальные изменения этого проекта в бранч (созданный на шаге 1). Cливать той же командой, что и из бранча к себе
     git merge --squash -s subtree --no-commit your_branch
    Ну а затем делаем pull из внешнего проекта, в результате которого локальные изменения сливаются с внешними. Далее сливаем бранч к себе.
Жаль, что данное поведение не описано было. Начал проект, опираясь на под-деревья. И пройдя много коммитов напоролся на такую проблему. Ушло много времени, чтобы разобраться.

0 коммент.:

Отправить комментарий