Skip to content

Типовые сценарии работы c Git

smurav edited this page Sep 21, 2011 · 5 revisions

Типовые сценарии работы с Git

В этом разделе будут показаны и разобраны подробно несколько обычных и чуть меньше необычных для работы с git ситуаций.

Типовой сценарий работы с локальным репозитарием

Git обладает необычайной легкостью в использовании не только как распределенная система контроля версий, но и в работе с локальными проектами. Давайте разберем обычный цикл — начиная с создания репозитария — работы разработчика git над собственным персональным проектом:

  1. mkdir git-demo
  2. cd git-demo
  3. git init
  4. git add .
  5. git commit -m «initial commit»
  6. git branch new-feature
  7. git checkout new-feature
  8. git add.
  9. git commit -m «Done with the new feature»
  10. git checkout master
  11. git diff HEAD new-feature
  12. git merge new-feature
  13. git branch -d new-feature
  14. git log --since=«1 day»

Разберем каждое из действий...

  1. просто создаем рабочую директорию проекта;
  2. переходим в неё;
  3. создаем репозитарий в директории;
  4. индексируем все существующие файлы проекта (если, конечно, они вообще были);
  5. создаем инициализирующий коммит;
  6. новая ветка;
  7. переключение в нее (можно сделать в один шаг командой git checkout -b new-feature);
  8. после непосредственной работы с кодом, индексируем внесенные изменения;
  9. совершаем коммит;
  10. переключаемся в основную ветку;
  11. смотрим отличия между последним коммитом активной ветки и последним коммитом экспериментальной;
  12. проводим слияние;
  13. если не было никаких конфликтов, удаляем ненужную больше ветку;
  14. ну и на всякий случай оценим проведенную за последний день работу.

Почему именно так? Зачем отказываться от линейной модели? Хотя бы даже потому, что у программиста появляется дополнительная гибкость:

  1. он может переключаться между задачами (ветками);
  2. под рукой всегда остается «чистовик» — ветка master;
  3. коммиты становятся мельче и точнее.

Типовой сценарий работы с удаленным репозитарием

Предположим, что вы и несколько ваших напарников создали общественный репозитарий, чтобы заняться неким общим проектом. Как выглядит самая распространенная для git модель общей работы?

  1. git clone http://yourserver.com/~you/proj.git … возможно, прошло некоторое время.
  2. git pull
  3. git diff HEAD^
  4. git checkout -b bad-feature … работаем некоторое время.
  5. git commit -a -m «Created a bad feature»
  6. git checkout master
  7. git pull
  8. git merge bad-feature
  9. git commit -a
  10. git diff HEAD^ … запускаем тесты проекта, обнаруживаем, что где-то произошла ошибка. Упс.
  11. git reset --hard ORIG_HEAD
  12. git checkout bad-feature … исправляем ошибку.
  13. git -m bad-feature good-feature
  14. git commit -a -m «Better feature»
  15. git checkout master
  16. git pull
  17. git merge good-feature
  18. git push
  19. git branch -d good-feature

Итак...

  1. первым делом создаем копию удаленного репозитария;
  2. «Вытягиваем» последние обновления;
  3. смотрим, что же изменилось;
  4. создаем новую ветвь и переключаемся в нее;
  5. индексируем все изменения и одновременно создаем из них коммит;
  6. переключаемся в главную ветвь;
  7. обновляем ее;
  8. проводим слияние с веткой bad-feature;
  9. обнаружив и разрешив конфликт, делаем коммит слияния;
  10. после совершения коммита отслеживаем изменения, запускаем, например, юнит-тесты и с ужасом обнаруживаем, что после слияния проект валится на большей части тестов. В принципе, тесты можно было прогнать и до коммита, в момент слияния (между пунктами 8 и 9); тогда бы хватило «мягкого» резета;
  11. таким образом, приходится совершить «жесткий» сброс произошедшего слияния, ветки вернулись в исходное до состояние;
  12. переключаемся в неудачную ветку;
  13. вносим необходимые изменения и переименовываем ветку;
  14. совершаем коммит;
  15. переходим в главную ветку;
  16. опять ее обновляем;
  17. На этот раз бесконфликтно делаем слияние;
  18. закидываем изменения в удаленный репозитарий;
  19. удаляем ненужную теперь ветку.

Особенности Git

Базовая функциональность Git