Распределённая
cистема контроля версий файлов
            Git

                      Никита Шультайс
                      http://shultais.ru
Зачем мне это?
Распределённая? Что это значит?
У нас уже есть проект, но оне еще не в Git'e




             cd /path/to/project/
             git init
Но не все файлы должны быть под VCS!
Зачем нам *.pyc, *.*~ и тестовые аватарки?




     echo *.pyc >> .git/info/exclude
     или


     vim .git/info/exclude
Это все?




git add .
git commit -a -m «Первый коммит»
И что теперь?




Ничего, программируем как и раньше.
Но не забываем делать коммиты.
Я изменил файл и добавил новый?
            Что делать?


git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: first.txt
# new file: second.txt
#
Зафиксируем изменения




git commit -a -m "Добавил второй файл."
[master e951bad] Добавил второй файл.
 2 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 second.txt
И это все?
Я просто отмечаю изменения, которые сделал,
    чтобы в один момент к ним вернуться?




            Вся сила в ветках
Мой сайт уже 6 месяцев работает стабильно, зачем...
Бля-я-я, что-то сломалось.
Что делать, ведь я уже внес столько изменений?
Сила копирования




realty
new_realty
old_realty
super_new_realty
realty_v2
new_realty_v2
Затеял новую фичу или правишь баг?
Создай ветку.




      git branch new-feature
      git checkout new-feature
Опять упал ваш стабильный сайт?




      git checkout master
Правило 1. В master всегда должна
находится текущая рабочая версия продукта.


      Следствие: правки кода в master запрещены.
На каждый баг я буду создавать ветку?




       git branch hotfixes
       git checkout hotfixes
Правим баг, тестируем




git commit -a -m «fix #341»
git checkout master
git merge hotfixes
Я закончил новую фичу, что теперь?


  git commit -a -m «Закрыл #76»
  git checkout master
  git merge new-feature
  Опять баг?
  git checkout hotfiexes
  git merge master
  Правим баг
  git commit -a -m «fix #1245»
  git checkout master
  git merge hotfixes
А есть какие-то хорошие практики?




Hotfixes — правка багов
Develop — текущая разрабатываемая версия
Сегодня я много кодил. Все зря.
Что делать?
CTRL+Z
git checkout .
Правило 2. Постоянно делайте коммиты
Я обнаружил, что случайно
удалил важный файл 10 коммитов назад.
Что делать?




git checkout HEAD~10 важный_файл
Ок, релиз готов, как мне его залить на сайт?
Скопировать весь репозиторий?



     git diff HEAD~1 > update.patch
     patch -p1 < update.patch


    git archive -o update.zip HEAD 
    $(git diff --name-only HEAD~1)
Мы наняли еще одного программиста


  Вариант 1. Равноправный доступ.
  Новый разработчик копирует ваш репозиторий


git clone /home/username/project myrepo

git clone ssh://user@somehost:port/~user/repository

git clone git://user@somehost:port/~user/repository/project.git
Правило 3.
В любом новом репозитории, действуют правила 1 и 2
Новый разработчик написал новую фичу.
Но ветка master его репозитория уже отличается
от ветки master центрального.




          git checkout master
          git pull
          git merge new-feature
          git push
Мы наняли еще одно программиста-
стажера и не можем дать ему доступ на
изменение главного репозитория
Мы наняли удаленного верстальщика.
Хранить главный репозиторий
на моей машие уже неудобно.
GitHub $12/месяц
Gitent-scm.com
На корпоративном сайте
А если разместить репозиторий
прямо на сервере с сайтом?




                git push
Читайте «Магия Git» и Хабр
Спасибо

Никита Шультайс. "Система управления версиями git"