15. Git

15. Git

15. Git

9 декември 2015

Днес

Защо отделяме два часа, за да говорим за Git?

Version Control System (VCS)

Не просто система, следяща промени в код!

Познавате ли този човек?

Linus Torvalds

Бащата на Linux

Създател на Git

Малко история

Linux kernel

Какво е нужно?

Централизирана VCS

Децентрализирана VCS

Защо точно git?

В началото беше git init

git init

Създава празно хранилище в текущата директория.

Виждате папката .git - съхранява всичко, което е нужно за историята.

Клониране на хранилище

git clone https://github.com/fmi/ruby-lectures.git

Работната директория (working directory)

Хранилището

Staging област

Отдалечено хранилище

Четирите области

Четирите области

4 състояния на файл

4 състояния на файл

Staging областта

добавяне на файлове

git add new_or_modified.rb
git add lectures/11
git add .

Staging областта

информация

git status

Staging областта

промени

git diff

Staging областта

изтриване на файлове

git rm old.rb

Staging областта

премахване на промени

git reset new_or_modified.rb
git reset lectures/11

Типове обекти

Commit

Конкретна версия на дърво (snapshot)

Една конкретна версия на кода.

Състои се от:

История на промените

git log
git log --stat
git log --since=2.weeks
git log --since=5.days.15.minutes
git log --until=2013-11-30
git log --grep 'Proc.new'
git log --author 'Dimitar Dimitrov'
git log lectures/01-introduction-to-ruby.slim

Commit

Да разгледаме

git show 5fae69568cd5420e13a34c06f6f495ea9bcb9a4e
git show 5fae695
git show HEAD
git show HEAD^
git show HEAD^^^
git show HEAD~3
git diff HEAD~3..HEAD

Commit

Всичко е просто файл

git cat-file -p 5fae695

Commit

git commit
git commit -m "Fix a typo on slide 3"

Commit-вайте възможно най-малките, логически свързани промени, които не чупят нищо.

Commit съобщения

Commit съобщения

Най-важното нещо във всяка VCS

Commit съобщения

Лош пример

Update Gemfile.lock

Commit съобщения

Добър пример

Update skeptic and libv8

The skeptic update showed errors in edge cases with the "spaces around
operators" restriction.

The libv8 update was because of compile problems I had with the older
version on OS X Yosemite.

Branch-ове (клони, разклонения)

Branch-ове

Branch-ове

Особености

Създаване на branch

git branch killer-feature
git checkout -b killer-feature

Превключване между вече създадени

git checkout killer-feature
git checkout master

Създаване на branch

Демонстрация

git branch

Обновяване

git pull
git pull origin
git pull origin master

Публикуване

git push
git push origin killer-feature
git push origin local-branch-name:killer-feature # Ако са с различни имена

Сливане на разклонения

git merge killer-feature
git merge --squash killer-feature

Различни стратегии на сливане. Основните са 2:

Fast-Forward стратегия

Просто премества указателя за клона

Fast-Forward стратегия

Просто премества указателя за клона

Recursive стратегия

Слива 2 разделили се клона с обща история.

Recursive стратегия

Жълтото e merge commit-a. Той съдържа промените и от двата клона.

Обновяване 2

git pull == git fetch && git merge origin/master

Изтриване на branch

git branch -d killer-feature
git push origin --delete killer-feature # Ако сте го push-нали
git push origin :killer-feature         # В по-стари версии

Изтриване на branch

Типичен процес на работа

Заради "евтините" branch-ове на git можем да направим следното:

Типичен процес на работа

Типичен процес на работа

Резултат

Машината на времето

Или как да върнем загубени промени.

git reset
git checkout
git commit --amend
git revert
git reflog

Машината на времето

git reset <commit> <files>
git reset HEAD lectures/git.slim

Машината на времето

git checkout <files>
git checkout <commit> <files>
git checkout <branch> <files>

Машината на времето

git commit --amend
git push --force origin branch  # Ако вече сте push-нали

Въпроси