ݺߣ

ݺߣShare a Scribd company logo
Как удержать проект от анархии с помощью 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

More Related Content

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

  • 1. Как удержать проект от анархии с помощью Git
  • 2. Ага, вот эти ребята Михаил Каморников Александр Татульченков Пропагандист и популяризатор php-джихада и медоед-стайл кодинга. Пишет SQL во вьюхах и несет $GLOBALS в массы. Не “тот самый Маршал” из сериала. Особо опасен в связке с Symfony 2.
  • 4. Недостатки? - слабости sha1 - git на windows - несвязанные файлы - кто и что редактировал? - история файла - начальное клонирование - изменчивые проекты - глобальный счетчик (svn style) - пустые подкаталоги - первоначальный коммит - причуды интерфейса (a..b, a...b)
  • 5. Явные плюсы? - всегда с кодом - “--interactive” режим в командах - возможность синхронизации с subversion, mercurial [, cvs )) ] - man всегда под рукой - формат репозитория дружелюбен к rsync, обычному HTTP и backup’ам - можно писать свои скрипты
  • 6. “ D” в DVCS - каждому по репозиторию - write access нужно заслужить
  • 9. Как устроено у нас - я ставлю задачу разработчику - разработчик создает бранч от актуального бранча из главного репозитория - в этом бранче разработчик решает поставленную задачу - бранч с выполненной задачей разработчик отправляет в свой рабочий репозиторий - я беру из рабочего репозитория этот бранч и проверяю его - если задача выполнена правильно, я сливаю этот бранч с актуальным бранчем
  • 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 diff git 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
  • 32. FIN