В продолжении этой темы http://dapi.ru/git-branching-tags-git расскажу
подробнее как создаются ветки по задачам в нашей команде.
Как показала практика переход на git затруднителен для разработчиков привыкших к subversion (svn), а тот, кто никогда ранее
не использовал системы контроля версий осваивается с git-ом за пару дней. Думаю что причина в том, что в svn все действия происходят с удаленным репозиторием, а git никак не привязан у удаленному репу. Сам каталог проекта (с подкаталогом .git в корне) является полноценным репозиторием, с ним и происходит вся работа. При этом на удаленном (тот, что на github) например могут происходить совершенно независимые вещи – ветки переименоваться илди удалиться и ваш локальный репо ничего об этом не будет знать. И не должен. В этом его преимущество – в не зависимости. Да, когда клонируете проект через git clone REPO_NAME git сохраняет в конфиге (.git/config) название склонированного источника и для краткости называет его origin. Это все что вас связывает с удаленным репом. Команды для работы с удаленным репом всего две:
> git pull origin ВЕТКА # влить последние комиты из ветки ВЕТКА репозитория origin в текущую
> git push origin ВЕТКА # затолкнуть последние изменения в текущей ветке в ветку ВЕТКА репозитория origin
На самом деле команда git pull является комбинацией git fetch + git merge но это не столь важно.
0. Настройка git
http://help.github.com/linux-set-up-git/
Также сделайте (ниже написано зачем)
> git config --global push.default current
0.1. Доступа к github
http://help.github.com/set-your-user-name-email-and-github-token/
1. Перед тем как работать с репозиторием убедиться что он чист.
git status должен возвращать что-то типа:
# On branch master
nothing to commit (working directory clean)
Заметьте что мы находимся в ветке (branch) master. Если это не так, нужно в
нее перейти:
Убедимся/Вольем в эту ветку все изменения с сервера (github)
Вообще master это ветка с которой начинаются разработка всех задач. В тоже время
сами разработчики в master никогда ни чего не заливают (за исключением
исключительных ситуаций), а все свои наработки кладут в ветки с понятными
названиями вида ИМЯ-НОМЕР_ТИКЕТА-КРАТКОЕ_ОПИСАНИЕ_ТИКЕТА. Например:
dapi-123-caching-subcribers. По названию ветки понято, что ее автор dapi и
работает он над issue 123, а именно над кешированием подписчиков.
2. Создаем новую ветку: dapi-123-caching-subscribers
> git checkout -b dapi-123-caching-subscribers
Switched to a new branch ' dapi-123-caching-subscribers'
Мы создали новую ветку, которая один в один master.
3. Кодируем.
Кодируем, меняем файлы.
4. Закрепляем изменения.
Когда мы понимаем что, возможно задачу еще до конца не выполнили, но сделали
важный участок кода, который уже работает и хотим сохранить свои изменения
(на случай чтобы откатиться к ним, при необходимости, позже) делаем так:
То есть выводим на сцена (другими словами добавляем к текущему комиту) те
файлы, изменения в которых хотим запомнить. Ну если хотите запомнить все,
пишите:
Далее делаем собственно коммит с понятным сообщением (заметьте, это не
описание, не название, а именно сообщение другим разработчикам о том что
делает этот коммит). Так как мы используем github issues, а они умеют читать
ваши commit-messages то в сообщениям мы вставляем информацию помогающую
соотносить их с этими issues. например:
> git commit -m "#123 Сделал кеширование"
Где #123 – номер issue. В случае если вы делаете завершающий коммит,
сообщение может быть вида “Fix #123” или “Closed #123” (вообще любое из слов close, closes, closed, fixes, fixed) в таком случае issue под номером 123 автоматически закроется. Также вставка номеров задач в
коммиты позволяет отображать на странице issues именно тот код, который
отвечает за решение определенной задачи. Подробнее о том как github issues читают
commit messages тут https://github.com/blog/411-github-issue-tracker
Если это ваши не последние изменния, то вы снова переходите к пункту 3, если
последние, то идем дальше.
5. Заливаем изменения на github.
Често говоря это можно делать после каждого комита.
Ключил -u нужен для того чтобы локальная ветка связалась с удаленной ( см .git/config) и при последующем git pull вам не нужно было ее указывать снова.
Конфликт при пушинге означает что вы делаете что-то не то (пушаете не ту ветку не туда)
5.1. Ребейз с master-а
В какой-то момент вы понимаете что ваша ветка далеко убежала от master-а. Да и master уже не тот и появляется желание влить к себе изменения, который в нем произошли. Правильное ощущение, чем чаще его делать тем меньше будет проблем. Делается это так:
> git checkout master
> git pull
> git checkout ВАША)ВЕТКА
> git rebase master
другой вариант:
> git pull --rebase origin master
Ваша рабочая ветка началась с мастера. Место начала называтеся HEAD. При ребейсе вы переносите ваш HEAD на последний комит в master.
Merge conflict
Если в процессе мержинга у вас возник конфликт с которым вы не можете разобраться и хотите вернуть все назад:
или
Так же тут хорошие рекомендации на эту тему: http://stackoverflow.com/questions/101752/aborting-a-merge-in-git
Если в результата отката мержинга осталось много untracked files разобраться с ними поможет git clean:
Лучше сначала запустить ее в сухую с параметром -n чтобы посмотреть что она собирается удалить.
Инфа по очистке http://stackoverflow.com/questions/61212/how-do-you-remove-untracked-files-fr...
6. Задача решена и залита, начинаем решать другую.
Дальше у нас два варианта действий. Или мы начинаем делать новую задачу, для
этого снова возвращаемся в master и т.д. все с 1-го пункта. Или вносим
изменения в уже существующие задачи (ветки). Тогда вместо мастера берем их.
Например нам надо поработать над старой задачей #001 (user authorization)
> git checkout dapi-001-user-authorization
Важное замечание
Господа виндузятники, у вас скорее всего не настроено определение веток по-умолчанию, поэтому вместо
нужно делать
git pull origin; git push origin
А иногда и указывать конкретную ветку, типа
Чтобы этого не делать выполните:
> git config --global push.default current
Шпаргалка:
Способ перейти в ветку скачав ее с сервера:
> git checkout -b ВЕТКА origin/ВЕТКА