git - распределенная система контроля версий
DESCRIPTION
Git - распределенная система контроля версий. Tips&tricks.TRANSCRIPT
![Page 1: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/1.jpg)
GITСистема контроля версий
![Page 2: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/2.jpg)
Вспомним
1. Git - распределенная СКВ
2. Запись в репозиторий - commit
3. Синхронизация удаленного и локального репозиториев - push, pull, fetch
![Page 3: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/3.jpg)
Git репозиторий - всего лишь директория .git
Удалить репозиторий - удалить директорию .git
Бэкап - копирование .git
![Page 4: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/4.jpg)
Анонс
1. Staging
2. Работа с коммитами
3. Ветки
4. Слияние веток
5. Stashing
6. Изменение истории
7. Решение конфликов
![Page 5: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/5.jpg)
STAGINGЖизнь до коммита
![Page 6: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/6.jpg)
![Page 7: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/7.jpg)
Staging
1. Что добавлено в staging (git add), то будет закоммичено (git commit)
2. git reset HEAD <file> - убрать файл из staging area
3. git checkout -- <file> - вернуть файл к начальному состоянию (то, что сейчас в HEAD)
![Page 8: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/8.jpg)
Staging Advanced1. git diff --staged - изменения, которые пойдут в коммит
2. git reset --hard - переходим на коммит, изменения пропадут
3. git reset --soft - переходим на коммит, изменения добавятся в staging
![Page 9: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/9.jpg)
Работа с коммитами
![Page 10: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/10.jpg)
Забыли закоммитить?
git commit --amend добавить к предыдущему коммиту
![Page 11: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/11.jpg)
Важно знать1. Все, что было закоммичено, не потеряется
2. Атомарность коммита - это образ жизни
3. Комментарии к коммиту обязательны
![Page 12: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/12.jpg)
ВЕТКИBranches
![Page 13: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/13.jpg)
Правила ветвления
1. Одна ветка - одна фича/багфикс (если не влазит в один коммит)
2. master всегда есть и в master всегда stable код
3. В dev ветке идет разработка (периодически в нее сливаются фичер-ветки)
4. dev периодически вливается в мастер, после код-ревью
![Page 14: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/14.jpg)
Управление бранчами
1. git checkout -b <name> - создать новый бранч и переключиться на него
2. git branch -d <name> - удалить бранч (-D - силой)
3. git push origin :<name> - удалить remote бранч
4. git remote show origin - посмотреть бранчи на remote
![Page 15: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/15.jpg)
СЛИЯНИЕветок
![Page 16: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/16.jpg)
Notes
1. Merge - это не боль
2. Rebase - это еще больше не боль
3. Чаще мерджим (ребэйсим) - легче жить
4. Важно не забывать переключаться между бранчами
![Page 17: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/17.jpg)
merge или rebase1. merge создает дополнительный merge-коммит слияния
2. rebase делает историю "плоской", как будто коммиты были всегда в одном бранче
![Page 18: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/18.jpg)
Как работает rebase
1. Переносит все коммиты из master, которых нет в origin/master в temp
2. Выстраивает последовательно все коммиты, которые в origin/master, в локальном master
3. За этими коммитами выстраивает те, которые в temp
![Page 19: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/19.jpg)
Например, есть бранч admin и бранч master
1. Переключается на admin
2. git rebase master - добавляем коммиты из master в admin
3. Переключаемся на master - git checkout master
4. git merge admin - не будет мердж коммитов, т.к. это простой fast-forward
![Page 20: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/20.jpg)
Например, несколько людей работали над одним бранчем
1. git fetch - синхронизируем репозиторий
2. git rebase - начинаем rebase
3. Разруливаем конфликты, делаем git add на файлы, в которых разрулили
4. git rebase --continue - завершаем rebase
В итоге никаких merge коммитов
![Page 21: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/21.jpg)
Интерактивный rebasegit rebase -i HEAD~3 - rebase над 3 последними коммитами
1. Интерактивный rebase открывает rebase скрипт
2. Все коммиты, указанные в команде перемещаются в temp
3. На коммиты в temp применяется rebase скрипт
![Page 22: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/22.jpg)
Зачем?
1. Менять коммиты местами (перестановка pick строк в скрипте)
2. Изменять комментарии к коммитам (edit)
3. Разбивать коммиты на несколько (edit)
4. Объединять коммиты в один (squash)
![Page 23: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/23.jpg)
STASH
![Page 24: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/24.jpg)
Git stash - место, куда временно можно положить изменения, чтобы в будущем их применить.
— git stash list - посмотреть весь стек стеша
— git stash - сохранить в стеш
— git stash pop - применить изменения из стеша
— git stash --keep-index - все, кроме staging
— git stash --include-untracked
— git stash <branch> <stash> - создать из стеша новый бранч
![Page 25: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/25.jpg)
Изменение истории1. Очень опасно
2. Иногда необходимо
3. Перед изменением истории всегда делать бекап
![Page 26: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/26.jpg)
Фильтрация бранчей
1. git filter-branch --tree-filter 'rm -f test.txt' - перезапустит все коммиты, выполняя команду для tree-filter
2. git filter-branch --index-filter 'git rm --cached --ignore-unmatch test.txt' - работает только со staging - быстрее, но надо пользоваться в качестве команд гитовыми командами
![Page 27: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/27.jpg)
Решение конфликтов
![Page 28: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/28.jpg)
1. Используйте тулы вашей IDE: Xcode, IDEA - они умеют 3-way merge делать
2. Хотя бы настройте стандартный для OSX FileMerge в качестве mergetool (difftool)
3. Если же нет, то результат diff - сверху то, что было, снизу то, что приехало (с чем мерджим)
![Page 29: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/29.jpg)
После rebase не пушится
git push --force origin master
Очень редко, но можно сделать принудительный пуш, если уверены, что не надо мерджить
![Page 30: Git - распределенная система контроля версий](https://reader034.vdocuments.mx/reader034/viewer/2022042518/55974f581a28abf7018b47e8/html5/thumbnails/30.jpg)