View
808
Download
0
Category
Preview:
Citation preview
Как удержать проект от анархии
с помощью 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
Recommended