Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Про Гит

Ulric Wilfred
July 27, 2017
100

Про Гит

На русском, про использование git из командной строки.

Ulric Wilfred

July 27, 2017
Tweet

Transcript

  1. git pull 1b. Магическая команда Простые (атомарные) команды Каждая команда

    выполняет одно и только одно действие git fetch git checkout git merge git reset git rebase git push . . . Может смёржить как надо, 
 а может и не как надо
  2. 1c. Простые (атомарные) команды Каждая команда выполняет одно и только

    одно действие git fetch git checkout git merge git reset git rebase git push . . . (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо)
  3. git init 2a. Zayac Kisunya Slowpoke > git init .

    > git config user.name “kisunya” > git config user.email “[email protected]” Кисуня создаёт и настраивает репозиторий. > git config receive.denyCurrentBranch updateInstead Последняя команда: Гит на всякий пожарный “защищает” репозитории 
 на файловой системе от пушей в текущий бранч, а мы экспериментируем
 и Кисуне (только Кисуне!) этой защиты не нужно.
  4. git init 2a. Zayac Kisunya Slowpoke > git init .

    > git config user.name “kisunya” > git config user.email “[email protected]” > echo “# Я Кисуня” >> README.md > git add README.md > git status README.md > git status README.md README.md Кисуня добавляет файл.
  5. git commit 2b. Zayac Kisunya Slowpoke > git init .

    > git config user.name “kisunya” > git config user.email “[email protected]” > echo “# Я Кисуня” >> README.md > git add README.md > git status README.md > git status > git commit -m “Добавлен файлик README” > git status README.md Кисуня коммитит.
  6. README.md git clone 2c. Zayac Kisunya Slowpoke > git clone

    /Users/kisunya/spaceship README.md > cd ./spaceship /Users/kisunya/spaceship /Users/slowpoke/spaceship > ls README.md .git Слоупок клонирует кисунин репозиторий.
  7. README.md git fetch 2d. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship

    > git init . > git remote add origin /Users/kisunya/spaceship /Users/zayac/spaceship > git remote -v Заяц непростой человек - он инициирует свой собственный репозиторий и добавляет кисунин репозиторий в виде ремоутного (удалённого). (И в этом нет ничего осудительного)
  8. README.md git fetch 2d. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship

    > git init . > git remote add origin /Users/kisunya/spaceship > git fetch origin master .git README.md /Users/zayac/spaceship README.md > git status > git remote -v > git merge --ff-only origin/master > ls Заяц фетчит мастер-бранч из кисуниного репозитория.
  9. README.md git fetch 2d. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship

    > git init . > git remote add origin /Users/kisunya/spaceship > git fetch origin master .git README.md /Users/zayac/spaceship README.md > git status > git remote -v > git merge --ff-only origin/master > ls Заяц фетчит мастер-бранч из кисуниного репозитория. (Я не знаю, кстати, почему тут по-разному) (Я просто запомнил, что фетч и пуш так, а рибейз и мёрж по-другому)
  10. README.md git fetch 2d. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship

    > git log README.md /Users/zayac/spaceship > git log > git log kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 1df5b6de 
 Добавлен файлик README Все смотрят логи.
  11. Резюме. git fetch 2. git clone git init Создать репозиторий.

    Клонировать чужой репозиторий, заиметь его копию. Вытянуть изменения из чужого репозитория (можно изо всех бранчей, можно из конкретного). 
 
 Положить их в отдельное место и не применять, пока я не решу, как именно я хочу их накатить.
  12. Резюме. git status 2. git log git remote Работа со

    ссылками/алиасами на чужие репозитории. Можно посмотреть их список, можно добавить, можно удалить. Посмотреть историю коммитов в текущем бранче
 в моей версии репозитория. Посмотреть какие изменения (не обязательно файлы, а изменения) я ещё не закоммитил. Ил
  13. git merge 3. Zayac Kisunya Slowpoke > git config user.name

    “slowpoke” > git config user.email “[email protected]” Слоупок чуть не забыл настроить репозиторий. README.md README.md README.md
  14. git merge 3. Zayac Kisunya Slowpoke > git config user.name

    “zayac” > git config user.email “[email protected]” А заяц - так вообще позорище. README.md README.md README.md
  15. README.md > ? git merge 3. Zayac Kisunya Slowpoke README.md

    /Users/kisunya/spaceship /Users/slowpoke/spaceship > git сheckout -b engine README.md /Users/zayac/spaceship Ребята распределяют задачи. > git сheckout -b nav Кисуня занимается движком. И Слоу занимается движком. А Заяц будет делать навигашку. (engine) (master) (nav) (Но пока что не знает, как бы ему оказаться в том же бранче, 
 что и Кисуня).
  16. Ребята распределяют задачи. README.md > git fetch origin engine git

    merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git сheckout -b engine README.md /Users/zayac/spaceship > git сheckout -b nav > git push origin engine > git checkout engine 1. Кисуня сам хозяин оригинального репозитория. Поэтому пушать куда- либо свой бранч ему не требуется. 2. Слоупок забирает бранч 
 (пусть и пустой) 
 из оригинального репозитория. 3. И вручную переключается 
 в этот бранч. (engine) (engine) (nav)
  17. Ребята распределяют задачи. README.md > git fetch origin engine git

    merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git сheckout -b engine README.md /Users/zayac/spaceship > git сheckout -b nav > git checkout engine А здесь Слоупок ещё в своей локальной копии мастера. (engine) (engine) (nav)
  18. Ребята распределяют задачи. README.md > git fetch origin engine git

    merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git сheckout -b engine README.md /Users/zayac/spaceship > git сheckout -b nav > git checkout engine Заяц оказался индивидуалистом 
 и поэтому решил 
 вообще ничего не пушать, 
 пока не закончит свою фичу. Имеем ли мы право осудить его за это? Посмотрим позже… (engine) (engine) (nav)
  19. Ребята начинают работать. README.md git merge 3. Zayac Kisunya Slowpoke

    README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git add винтики.js шайбоньки.js. README.md /Users/zayac/spaceship > git add ии.js (engine) (engine) (nav) > git add болтики.js винтики.js шайбоньки.js болтики.js ии.js > git commit -m 
 “Моё файло” “Добавил винты и шайбы” Здесь хорошо бы использовать “императив”, но в русском языке такой формы вроде как нет. > git commit -m “Перечислил все болтики” > git commit -m “Искуственный интеллект”
  20. README.md git merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship

    README.md /Users/zayac/spaceship (engine) (engine) (nav) > git push origin engine винтики.js шайбоньки.js болтики.js ии.js Пуш отклонён, потому что Кисуня тоже закоммитил в этот бранч и Слоупок пытается пушнуть именно в Кисунин репозиторий (origin). !rejected
  21. README.md git merge 3. README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine)

    (engine) (nav) > git add я.jpg винтики.js шайбоньки.js болтики.js ии.js Слоу внезапно решил, что перед мёржем 
 ему нужно добавить ещё один коммит. > git commit -m “Фото автора” я.jpg Zayac Kisunya Slowpoke
  22. Посмотрим логи. README.md git merge 3. Zayac Kisunya Slowpoke README.md

    /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg > git log > git log > git log kisunya 
 c31a2638 
 Добавил винты и шайбы slowpoke 
 1c459911 
 Фото автора zayac 
 b0fb5136 
 Искуственный интеллект kisunya 
 1df5b6de 
 Добавлен файлик README slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 1df5b6de 
 Добавлен файлик README
  23. README.md git merge 3. README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine)

    (engine) (nav) > git fetch origin engine винтики.js шайбоньки.js болтики.js ии.js Теперь Слоупок забирает изменения Кисуни. я.jpg > git merge --ff-only origin/engine Нормально же начинали! Отказано! Zayac Kisunya Slowpoke (NB: кстати, после фетча git status показывает как текущий бранч отличается от оригинального)
  24. README.md git merge 3. README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine)

    (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg > git merge Смёржим, пока что. шайбоньки.js винтики.js Zayac Kisunya Slowpoke
  25. git merge 3. Slowpoke README.md /Users/slowpoke/spaceship (engine) винтики.js болтики.js я.jpg

    шайбоньки.js > git log slowpoke 
 1c459911 
 Фото автора slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 c31a2638 
 Добавил винты и шайбы slowpoke 
 822c9402 
 Merge 1c459911 + c31a2638 Неприятненький коммит!
  26. git merge 3. Slowpoke README.md /Users/slowpoke/spaceship (engine) винтики.js болтики.js я.jpg

    шайбоньки.js > git reflog HEAD@{1}
 Commit 
 Фото автора HEAD@{2}
 Commit
 Перечислил все болтики HEAD@{4}
 Clone
 /Users/kisunya/spaceship HEAD@{3}
 Checkout
 Move from master to engine HEAD@{0}
 Merge (recursive)
 Merge remote branch engine Гит лог — история всех локальных коммитов. Гит рефлог — история всех локальных действий. HEAD@{N} — курсор
  27. git merge 3. Slowpoke README.md /Users/slowpoke/spaceship (engine) болтики.js я.jpg >

    git reset --hard HEAD@{1} HEAD@{2}
 Commit 
 Фото автора HEAD@{3}
 Commit
 Перечислил все болтики HEAD@{5}
 Clone
 /Users/kisunya/spaceship HEAD@{4}
 Checkout
 Move from master to engine HEAD@{1}
 Merge (recursive)
 Merge remote branch engine Отменяем мёрж-коммит. 
 Переходим назад по истории. > git reflog HEAD@{0}
 Reset
 Moving to HEAD@{1}
  28. git merge 3. Slowpoke README.md /Users/slowpoke/spaceship (engine) болтики.js я.jpg >

    git log slowpoke 
 1c459911 
 Фото автора slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 1df5b6de 
 Добавлен файлик README 
 
 
 
 Неприятненький коммит! Кисулин коммит! больше нет! больше нет!
  29. Резюме. git merge --squash 3. git merge --ff-only git merge

    Объединить коммиты в двух ветках, попробовать fast- forward (без мёрж-коммита), а если не вышло — найти способ смёржить c мёрж-коммитом. 
 Выполняется на git pull. Объединить коммиты в двух ветках без мёрж-коммита. Если так не вышло — оставить всё как есть, без мёржа. Объединить коммиты в двух ветках, создать суммирующие файлы для мёрж-коммита, но не коммитить эти файлы, чтобы мы могли решить, что с ними делать дальше.
  30. Резюме. git merge --abort 3. git reset git reflog Просмотреть

    историю всех локальных действий. Перейти в истории на указанную позицию (по умолчанию — HEAD). Это очень легко и нестрашно! Отменить мёрж в процессе, всё вернуть как было в начале до него.
  31. git rebase 4. Slowpoke README.md /Users/slowpoke/spaceship (engine) винтики.js болтики.js я.jpg

    шайбоньки.js > git log slowpoke 
 1c459911 
 Фото автора slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 c31a2638 
 Добавил винты и шайбы 
 
 Неприятненький коммит! > git rebase origin/engine Попробуем рибейз вместо мёржа. больше нет! Всё прекрасно!
  32. Slowpoke README.md /Users/slowpoke/spaceship (engine) болтики.js я.jpg HEAD@{3}
 Rebase 
 Checkout

    origin/engine HEAD@{4}
 Reset
 Moving to HEAD HEAD@{6}
 Merge (recursive)
 Merge remote branch engine HEAD@{5}
 Reset
 Moving to HEAD@{1} HEAD@{2}
 Rebase
 Перечислил все болтики Посмотрим историю. > git reflog HEAD@{0}
 Rebase
 (Finished) винтики.js шайбоньки.js HEAD@{1}
 Rebase
 Фото автора HEAD@{7}
 git rebase 4.
  33. README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js

    шайбоньки.js болтики.js ии.js я.jpg > git push origin engine шайбоньки.js винтики.js Zayac Kisunya Slowpoke git rebase 4.
  34. Zayac Kisunya Slowpoke README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine)

    (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg шайбоньки.js винтики.js > git log slowpoke 
 1c459911 
 Фото автора slowpoke 
 12ebe2bb 
 Перечислил все болтики болтики.js я.jpg git rebase 4.
  35. README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js

    шайбоньки.js болтики.js ии.js я.jpg > echo “Обновлённое фото” >> я.jpg шайбоньки.js винтики.js Zayac Kisunya Slowpoke > git add я.jpg > git commit -m “Обновил фото” болтики.js я.jpg git rebase 4.
  36. README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js

    шайбоньки.js болтики.js ии.js > echo “Нет, автор — я” > я.jpg шайбоньки.js винтики.js > git add я.jpg > git commit -m “Правильное фото!” болтики.js я.jpg Налицо конфликт. 
 Кисуня не знает об изменениях Слоу, 
 а Слоу не знает об изменениях Кисуни. я.jpg git rebase 4. Zayac Kisunya Slowpoke
  37. slowpoke 
 1c459911 
 Фото автора slowpoke 
 1c459911 


    Фото автора README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js шайбоньки.js винтики.js Zayac Kisunya Slowpoke болтики.js я.jpg я.jpg git rebase 4. > git log kisunya 
 3b1b1e6a 
 Правильное фото! > git log slowpoke 
 04b0eaca 
 Обновил фото
  38. README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js

    шайбоньки.js болтики.js ии.js я.jpg > git fetch origin engine шайбоньки.js винтики.js Zayac Kisunya Slowpoke > git merge --ff-only origin/engine > git rebase origin/engine болтики.js git rebase 4. > git rebase --abort Конфликт! 
 Невозможно поменять историю. 
 Откатывается на мёрж. Изменён один и тот же файл, 
 без мёрж-коммита не проходит. Прекращаем рибейз, это легко! я.jpg
  39. README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js

    шайбоньки.js болтики.js ии.js я.jpg шайбоньки.js винтики.js Zayac Kisunya Slowpoke болтики.js git rebase 4. > git merge Слоупок мёржит от безысходности, и таким образом создаёт мёрж-коммит. > cat я.jpg > echo “Конечно же, автор — Слоу!” > я.jpg > git add я.jpg > git commit я.jpg
  40. README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js

    шайбоньки.js болтики.js ии.js шайбоньки.js винтики.js Zayac Kisunya Slowpoke болтики.js я.jpg git rebase 4. > git push origin engine И, крайне злой, пушает его прямо в Кисунин репозиторий. Теперь пути назад нет.* *Есть, только если они договорятся и Кисуня отменит мёрж у себя через reflog, а Слоупок не будет вредничать и примет изменения. Только компромисс, в общем. я.jpg
  41. kisunya 
 3b1b1e6a 
 Правильное фото! Zayac Kisunya Slowpoke README.md

    README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg шайбоньки.js винтики.js > git log slowpoke 
 dc7726c7 
 Merge origin/engine болтики.js я.jpg git rebase 4. Кисуня может что-то заподозрить только если посмотрит в лог.
  42. README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (engine) (nav) винтики.js

    шайбоньки.js болтики.js ии.js > git checkout master шайбоньки.js винтики.js > git merge --ff-only engine болтики.js Но Кисуня не смотрит в лог 
 и мёржит бранч в мастер. git rebase 4. Zayac Kisunya Slowpoke я.jpg я.jpg
  43. kisunya 
 3b1b1e6a 
 Правильное фото! Zayac Kisunya Slowpoke README.md

    README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg шайбоньки.js винтики.js > git log slowpoke 
 dc7726c7 
 Merge origin/engine болтики.js я.jpg git rebase 4. Теперь мёрж-коммит и в мастере.
  44. README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (engine) (nav) винтики.js

    шайбоньки.js болтики.js ии.js > git fetch origin master шайбоньки.js винтики.js болтики.js Внезапно заяц решил рибейзнуть свой бранч на мастер. git rebase 4. Zayac Kisunya Slowpoke я.jpg я.jpg > git rebase origin/master
  45. zayac 
 b0fb5136 
 Искуственный интеллект git rebase 4. Zayac

    README.md /Users/zayac/spaceship (nav) винтики.js шайбоньки.js > git log slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 kisunya 
 c31a2638 
 Добавил винты и шайбы > git rebase origin/master И у него это получилось! (Его коммит добавился сверху.) У зайца всё прекрасно! болтики.js я.jpg ии.js slowpoke 
 dc7726c7 
 Merge origin/engine kisunya 
 3b1b1e6a 
 Правильное фото! slowpoke 
 04b0eaca 
 Обновил фото slowpoke 
 1c459911 
 Фото автора Неприятненький коммит! Но что поделать ¯\_(ツ)_/¯
  46. болтики.js README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (engine) (master)

    винтики.js шайбоньки.js болтики.js > git push origin master шайбоньки.js винтики.js болтики.js Заяц может ответственно 
 пушать прямо в мастер, что и делает с удовольствием. git rebase 4. Zayac Kisunya Slowpoke я.jpg я.jpg > git checkout master > git merge --ff-only nav винтики.js шайбоньки.js я.jpg ии.js ии.js
  47. болтики.js README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (master) (master)

    винтики.js шайбоньки.js болтики.js > git merge --ff-only origin/master шайбоньки.js винтики.js болтики.js git rebase 4. Zayac Kisunya Slowpoke я.jpg я.jpg > git checkout master > git fetch origin master винтики.js шайбоньки.js я.jpg ии.js ии.js ии.js И Слоу может обновить свой master.
  48. git merge --ff-only Объединить коммиты в двух ветках без мёрж-коммита.

    Если так не вышло — оставить всё как есть, без мёржа. Резюме. 4. git rebase Взять все новые незапушанные коммиты в текущем бранче, вынуть из истории, и положить по истории сверху (после) коммитов, находящихся в указанном бранче. git rebase --abort Отменить рибейз в процессе, всё вернуть как было в начале до него.
  49. Мораль. NaN. git rebase Гит рибейз может сработать как надо

    только когда один человек работает в одном бранче.* *И ещё когда стороны могут прийти лично друг к другу, 
 помириться и вместе изменить историю. 
 Но такое случается редко.
 Крайне редко.