Как удержать проект от анархии с помощью Git
Ага, вот эти ребята Михаил Каморников Александр Татульченков Пропагандист и популяризатор php-джихада и медоед-стайл кодинга. Пишет SQL во вьюхах и несет $GLOBALS в массы.  Не “тот самый Маршал” из сериала. Особо опасен в связке с Symfony 2.
Опять про GIT ...
Недостатки? - слабости sha1 - git на windows - несвязанные файлы - кто и что редактировал? - история файла - начальное клонирование - изменчивые проекты  - глобальный счетчик (svn style) - пустые подкаталоги - первоначальный коммит - причуды интерфейса (a..b, a...b)
Явные плюсы? - всегда с кодом - “--interactive” режим в командах - возможность синхронизации с subversion, mercurial [, cvs )) ] - man всегда под рукой - формат репозитория дружелюбен к rsync, обычному HTTP и backup’ам - можно писать свои скрипты
“ D” в DVCS - каждому по репозиторию - write access нужно заслужить
Integration Manager Workflow
Dictator and Lieutenants Workflow
Как устроено у нас - я ставлю задачу разработчику - разработчик создает бранч от актуального бранча из главного репозитория - в этом бранче разработчик решает поставленную задачу - бранч с выполненной задачей разработчик отправляет в свой рабочий репозиторий - я беру из рабочего репозитория этот бранч и проверяю его - если задача выполнена правильно, я сливаю этот бранч с актуальным бранчем
Social coding
Хорошо, что есть github
Хорошо, что есть github
Пусть git работает за меня - стоит посмотреть git flow - есть утилита лучше git-овской - заставьте git работать через нее - надоела рутина – пишем скрипты на все случаи жизни - не забываем про хуки
Я устал … слово медоеду
На старт, внимание, Git! $ git init $ git add . $ git commit -m "Люк, я тво..."
Репозиторий разработчика $ cd /project/ $ git clone me@trololo.git $ git push origin master:stage $ git checkout -b stage origin/stage
Добавляем aliases .gitconfig [alias] st = status ci = commit br = branch co = checkout df = diff lg = log -p git config --global alias.rb rebase
Я имел в виду совсем не это... :-) Ошиблись в комменте $ git commit --amend Ой, еще и файл добавить забыли $ git commit --amend -a Если все в 10 раз хуже $ git rebase -i HEAD~10
Вон там направо и за угол $ git checkout 1b6d^^2~10 -b ancient $ git log HEAD^2 $ git diff HEAD^
Найдите 10 отличий $ git diff $ git diff --cached $ git diff HEAD $ git diff HEAD^ $ git diff master..experimental $ git diff experimental
к0нфликт git diff git mergetool # fix, fix, fix git commit
Назад в прошлое   и в будущее $ git reset HEAD~3  -- soft $ git reset 1b6d $ git reset ORIG_HEAD
Убить коммиты, жесточайше… $ git reset --hard 1b6d $ git reset --hard HEAD $ git reset --hard HEAD^
Изменяем состав смеси, добавим вишенку $ git checkout -b sanitized $ git cherry-pick medley^^
Вас здесь не стояло! # переключаемся на ветку bug1 $  git checkout bug1 # пересадить историю изменений  $  git rebase master #  глобальный  amend $  git rebase  -i HEAD~7 pick 41cf624 Added connection pick a14e959 Added timeouting to cli pick 1934b6e Added disconnect event pick 0e8a050 Changed connections
Все секреты по карманам, я гуляю с  доберманом $ git stash $ git stash list   $ git stash show $ git stash apply $ git stash drop   $ git stash pop   $ git stash clear
А оно само сломалось ! $ git blame README $ git gui blame README Можно указать и конкретные строки для отображения: $ git blame -L 2,+3 README  Вывести строки и информацию о коммитах, их коснувшихся: $ git annotate README
Немного уличной магии Переписываем историю в духе сталинизма $ git filter-branch --tree-filter 'rm secretfile' HEAD Обучаем git игре в карты $ git rerere Стопитсотый раз тебе говорю $ git submodule foreach 'git pull || :'
Когда же все пошло не так? только что обнаружили, что функционал не работает, но вы совершенно отчетливо помните, что он работал всего несколько месяцев назад $ git bisect start $ git bisect bad HEAD $ git bisect good 1b6d для полного счастья $ git bisect reset
Много букаф, неасилил $ git for-each-ref --shell --format="ref=%(refname); commitDate=%(authordate:short)" refs/heads/my* | \ while read entry do eval "$entry"; branch=${ref:11}; untilStamp=$(date +%s -d "$1"); commitStamp=$(date +%s -d "$commitDate");  compare=$(expr $untilStamp - $commitStamp); if [ $compare -gt 0 ] then echo ‘branch $branch date: $commitDate‘; if [ "$2" == "-d" ] then echo "git branch -D $branch"  eval "git branch -D $branch" else echo "git branch -D $branch" fi fi done
Вопросы
FIN

Как удержать проект от анархии с помощью Git

  • 1.
    Как удержать проектот анархии с помощью Git
  • 2.
    Ага, вот этиребята Михаил Каморников Александр Татульченков Пропагандист и популяризатор php-джихада и медоед-стайл кодинга. Пишет SQL во вьюхах и несет $GLOBALS в массы. Не “тот самый Маршал” из сериала. Особо опасен в связке с Symfony 2.
  • 3.
  • 4.
    Недостатки? - слабостиsha1 - git на windows - несвязанные файлы - кто и что редактировал? - история файла - начальное клонирование - изменчивые проекты - глобальный счетчик (svn style) - пустые подкаталоги - первоначальный коммит - причуды интерфейса (a..b, a...b)
  • 5.
    Явные плюсы? -всегда с кодом - “--interactive” режим в командах - возможность синхронизации с subversion, mercurial [, cvs )) ] - man всегда под рукой - формат репозитория дружелюбен к rsync, обычному HTTP и backup’ам - можно писать свои скрипты
  • 6.
    “ D” вDVCS - каждому по репозиторию - write access нужно заслужить
  • 7.
  • 8.
  • 9.
    Как устроено унас - я ставлю задачу разработчику - разработчик создает бранч от актуального бранча из главного репозитория - в этом бранче разработчик решает поставленную задачу - бранч с выполненной задачей разработчик отправляет в свой рабочий репозиторий - я беру из рабочего репозитория этот бранч и проверяю его - если задача выполнена правильно, я сливаю этот бранч с актуальным бранчем
  • 10.
  • 11.
  • 12.
  • 13.
    Пусть git работаетза меня - стоит посмотреть git flow - есть утилита лучше git-овской - заставьте git работать через нее - надоела рутина – пишем скрипты на все случаи жизни - не забываем про хуки
  • 14.
    Я устал …слово медоеду
  • 15.
    На старт, внимание,Git! $ git init $ git add . $ git commit -m "Люк, я тво..."
  • 16.
    Репозиторий разработчика $cd /project/ $ git clone me@trololo.git $ git push origin master:stage $ git checkout -b stage origin/stage
  • 17.
    Добавляем aliases .gitconfig[alias] st = status ci = commit br = branch co = checkout df = diff lg = log -p git config --global alias.rb rebase
  • 18.
    Я имел ввиду совсем не это... :-) Ошиблись в комменте $ git commit --amend Ой, еще и файл добавить забыли $ git commit --amend -a Если все в 10 раз хуже $ git rebase -i HEAD~10
  • 19.
    Вон там направои за угол $ git checkout 1b6d^^2~10 -b ancient $ git log HEAD^2 $ git diff HEAD^
  • 20.
    Найдите 10 отличий$ git diff $ git diff --cached $ git diff HEAD $ git diff HEAD^ $ git diff master..experimental $ git diff experimental
  • 21.
    к0нфликт git diffgit mergetool # fix, fix, fix git commit
  • 22.
    Назад в прошлое и в будущее $ git reset HEAD~3 -- soft $ git reset 1b6d $ git reset ORIG_HEAD
  • 23.
    Убить коммиты, жесточайше…$ git reset --hard 1b6d $ git reset --hard HEAD $ git reset --hard HEAD^
  • 24.
    Изменяем состав смеси,добавим вишенку $ git checkout -b sanitized $ git cherry-pick medley^^
  • 25.
    Вас здесь нестояло! # переключаемся на ветку bug1 $ git checkout bug1 # пересадить историю изменений $ git rebase master # глобальный amend $ git rebase -i HEAD~7 pick 41cf624 Added connection pick a14e959 Added timeouting to cli pick 1934b6e Added disconnect event pick 0e8a050 Changed connections
  • 26.
    Все секреты покарманам, я гуляю с доберманом $ git stash $ git stash list $ git stash show $ git stash apply $ git stash drop $ git stash pop $ git stash clear
  • 27.
    А оно самосломалось ! $ git blame README $ git gui blame README Можно указать и конкретные строки для отображения: $ git blame -L 2,+3 README Вывести строки и информацию о коммитах, их коснувшихся: $ git annotate README
  • 28.
    Немного уличной магииПереписываем историю в духе сталинизма $ git filter-branch --tree-filter 'rm secretfile' HEAD Обучаем git игре в карты $ git rerere Стопитсотый раз тебе говорю $ git submodule foreach 'git pull || :'
  • 29.
    Когда же всепошло не так? только что обнаружили, что функционал не работает, но вы совершенно отчетливо помните, что он работал всего несколько месяцев назад $ git bisect start $ git bisect bad HEAD $ git bisect good 1b6d для полного счастья $ git bisect reset
  • 30.
    Много букаф, неасилил$ git for-each-ref --shell --format="ref=%(refname); commitDate=%(authordate:short)" refs/heads/my* | \ while read entry do eval "$entry"; branch=${ref:11}; untilStamp=$(date +%s -d "$1"); commitStamp=$(date +%s -d "$commitDate"); compare=$(expr $untilStamp - $commitStamp); if [ $compare -gt 0 ] then echo ‘branch $branch date: $commitDate‘; if [ "$2" == "-d" ] then echo "git branch -D $branch" eval "git branch -D $branch" else echo "git branch -D $branch" fi fi done
  • 31.
  • 32.