Git Intro
Кампус 2013, Ижевск

Андрей Лапин
Диадок, Ижевск
Системы контроля версий

•

Распределенные

•
•
•

•

Mercurial
Bazaar

Централизованные

•
•
•

•

Git

SVN
TFS
CVS

Локальные системы управления

•

RCS
Базовые понятия
• Репозиторий
• Commit
• Hash
• Ветка
Клиенты: GitExtensions, TortoiseGit
Работа с удаленным репозиторием
Базовые операции
• git init
• git add <filename>
• git commit -a –m <message>
• git commit -a --amend –m <message>
• git status
• git log
git reflog
File moving by Git
Файл .gitignore
Пример файла .gitignore:

settings
#exceptions
!Settings/UnchangeableFiles/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Thumbs.db
*/bin/*.exe
*.bak
*.log
Клонирование репозитория
• git clone git@github.com:trurl123/test.git
• git clone git@github.com:trurl123/test.git myfolder
• SSH and HTTP
Операции с удаленным репозиторием
• git fetch --all
• git push [сервер] [ветка]
• git pull
• git remote add <alias> <url>
Хранение данных в Git
• Папка .git
• Снапшоты
• Сжатие
• Удаленные репозитории
Ветки
Ссылки на ревизии
• Revisions
•
•
•
•
•
•
•

<sha1>, e.g. dae86e1950b1277e545cee180551750029cfe735, dae86e
<refname>
HEAD, ORIG_HEAD, MERGE_HEAD
<refname>@{<date>}, e.g. master@{yesterday}, HEAD@{5 minutes ago}
<refname>@{<n>}
<rev>^, e.g. HEAD^, HEAD^1, HEAD^2
<rev>~<n>, e.g. master~3

• Ranges
•
•
•
•

r
^r1
r1^@
r1^!

• см. также «git help revisions»
Пример из крышек и тильд
G

H

I

 /
D

J
 /

E

F

|

/ 



 | /

|

|/
B

|
C



/

 /
A
A =
B = A^

= A^0
= A^1

C = A^2

= A^2

D = A^^
E = B^2

= A^1^1
= A^^2

F = B^3

Ranges

= A^^3

= A~1
= A~2

G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2
= A^^^2
I = F^

= B^3^

= A^^3^

J = F^2

= B^3^2

= A^^3^2

= A~2^2

D
D F
^G D
^D B
B...C
^D B C
C^@
F^! D

G
G
H
E
G
E
I
G

H
H
D
I
H
I
J
H

D
I J D F
J
D
J
F
D

F B
E B C
F B C
F
Команды по работе с ветками
• git merge brname
• git rebase master
Merge
Подумайте, что вы вливаете в свою
ветку
• branch vs origin/branch
Rebase
Проблемы rebase
• Не переписывайте ветки на сервере!
• Не делать rebase после merge
Pull, merge and rebase
• pull = fetch + merge
• pull --rebase == fetch + rebase
Временные ветки
• git stash
• git stash apply
Жизненный цикл ветки (real)
git checkout -b myBranch master
... commits
git push
git fetch
git merge origin/master
… fix after merge
git checkout -B master origin/master
git merge myBranch
git push
Текущий коммит в ветке
• git commit –m <message>
• git pull --rebase
• git push
ПРАКТИКА
Генерация SSH ключа
$ ssh-keygen -t rsa -C "email@example.com"
...
# Enter file in which to save the key
(/c/Users/you/.ssh/id_rsa): [Press enter]

$ clip < ~/.ssh/id_rsa.pub

Account Settings -> SSH Keys -> Add SSH key
$ ssh -T git@github.com
>yes
• См. https://github.com/kontur-edu/kampus-izh-201311/tree/master/01-git
Конфигурирование: настройки
пользователя
Имя пользователя:
$ git config --global user.name "MyName"
E-mail пользователя:
$ git config --global user.email m@il.ru
Задание
Впиши себя!

https://github.com/trurl123/test
Примеры проблем и их
решение
Откат изменений:
отмена одного старого коммита

git revert <hash>

git log
↓
commit dcb4...
Revert "+someone"
This reverts commit 6460
commit 6460...
+someone
Откат изменений:
отмена нескольких последних коммитов
git reset [--hard|--mixed] <commit>
e.g.:
git reset --hard HEAD~3
Почистить папку от результатов
компиляции
• git clean
Удалить ветку на сервере
• git push origin :brName
Удалить ветки у себя, когда на сервере
кто-то удалил ветки
• git remote prune origin
Стянуть коммит из другой ветки к себе
без мерджей
• git cherry-pick
Что бы почитать:
$ git help
$ git help <command>
Pro Git: http://git-scm.com/book
Git magic: http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/ru/
http://pcottle.github.io/learnGitBranching/

Git intro