30 KiB
class: impact
git
the stupid content tracker
layout: true title: Задачи class: animation-fade
{{title}}
Контроль версий
-- Я работаю над сложным проектом с изменяющимися требованиями и далёким горизонтом развития.
--
Я хочу иметь возможность версионировать мою работу.
Откат к предыдущим состояниям
--
-
Почему бы просто не взять флешку и скопировать в Новая папка (2)
?😔
--
-
Ну хорошо, что если я буду записывать в Новая папка {Текущее время}
?😔
❯ git checkout OTP-21.0.3
Checking out files: 100% (3448/3448), done.
Note: checking out 'OTP-21.0.3'.
Быстрое восстановление работоспособности
--
-
Ведь я могу просто скинуть с флешки последнюю Новую папку
, что не так?😔
❯ git reset --hard HEAD
HEAD is now at a3a900e382 Updated OTP version
Внесение осмысленных изменений
--
-
Я могу просто положить рядом файл с названием Зачем.txt
, почему нет?😔
❯ git commit -a
Outline installation flow # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch v0 # Your branch is up to date with 'origin/v0'. # # Changes to be committed: # modified: README.md
Отслеживание изменений
--
-
Важен не процесс, а результат. 🤔
commit f918ca5f58f52d028b7ea140b874f8a79395ae65 Author: Andrew Mayorov <encube.ul@gmail.com> Date: Wed Jul 18 17:49:27 2018 +0300 Downgrade to rbkmoney/hellgate@79e70142 (#981) diff --git a/pillar/wetkitty/macroservice.sls b/pillar/wetkitty/macroservice.sls index 7234ee0..04e2ad2 100644 --- a/pillar/wetkitty/macroservice.sls +++ b/pillar/wetkitty/macroservice.sls @@ -49,7 +49,7 @@ wetkitty: hellgate: image-name: "dr.rbkmoney.com/rbkmoney/hellgate" - image-tag: "1ae0c4b1f3e1e4325eed5618c56bedcb823cf0e8" + image-tag: "79e70142161cc5a9a995dc77601fc72514cb19f9" memory-limit: 256M service-name: "hellgate"
layout: true title: Задачи class: animation-fade
{{title}}
Совместная работа
-- Я больше не работаю над этим проектом один, нас много.
--
У каждого из нас есть имя, и я знаю кто есть кто.
--
Я должен уметь работать и вносить изменения, не мешая без необходимости моим коллегам.
--
Мы должны иметь возможность обмениваться результатами работы друг с другом.
Авторство
--
-
Моя файловая система проследит за этим. Или нет? 😔
❯ git config --global user.name Keynfawkes
❯ git config --global user.email a.mayorov@rbkmoney.com
Независимая разработка
--
-
Это просто, нужно всего лишь давать уникальный префикс папкам на флешке. 😫
❯ git checkout -b ft/proper-transfers
❯ git status On branch ft/proper-transfers Your branch is up to date with 'rbkmoney/ft/proper-transfers'. Untracked files: (use "git add <file>..." to include in what will be committed) THOUGHTS.md nothing added to commit but untracked files present (use "git add" to track)
Разрешение конфликтов
--
-
Я просто перезапишу чужие изменения. 😡
diff --cc pillar/wetkitty/macroservice.sls index a13392b,432a332..0000000 --- a/pillar/wetkitty/macroservice.sls +++ b/pillar/wetkitty/macroservice.sls @@@ -281,23 -191,15 +291,31 @@@ proxy-mocketbank: image-name: "dr.rbkmoney.com/rbkmoney/proxy-mocketbank" ++<<<<<<< HEAD + image-tag: "fbd79a2a9a100adef9b5c4e67842e2e86d914249" ++======= + image-tag: "5e5646e90d4eec15c8bae36af9281230a33cce20" ++>>>>>>> origin/ft/PROX-90/woody memory-limit: 512M service-name: "proxy-mocketbank" java: xmx: 256m
Аудит изменений
--
-
Я просто спрошу своих коллег, каждого по очереди. 😡
❯ git blame --date=relative -L100,112 pillar/wetkitty/macroservice.sls
d8485b5e (niku64 1 year 7 months ago 101) capi: 8899c7ab (A. Belyaev 9 months ago 102) v1: 8899c7ab (A. Belyaev 9 months ago 103) image-name: "dr.rbkmoney.com/rbkmoney/capi-v1" b985f601 (E. Levenets 2 weeks ago 104) image-tag: "3302c4abc25e4805122d119ebd7b2f6fc1f706a3" 8899c7ab (A. Belyaev 9 months ago 105) memory-limit: 512M 8899c7ab (A. Belyaev 9 months ago 106) service-name: "capi-v1" 8899c7ab (A. Belyaev 9 months ago 107) v2: 8899c7ab (A. Belyaev 9 months ago 108) image-name: "dr.rbkmoney.com/rbkmoney/capi-v2" b985f601 (E. Levenets 2 weeks ago 109) image-tag: "29d1418564405f6789356a0929c33668e4fdf23a" 8899c7ab (A. Belyaev 9 months ago 110) memory-limit: 512M 8899c7ab (A. Belyaev 9 months ago 111) service-name: "capi-v2"
layout: true title: Модель class: animation-fade
{{title}}
Приоритеты
--
- Скорость работы
--
- Простота внутреннего устройства
--
- Поддержка разработки с сотнями одновременно изменяемых веток
--
- Распределёность
--
- Умение управляться с проектами огромных размеров
Технические решения
--
- Состояние вместо набора изменений
--
- Локальная копия всех внесённых в процессе разработки изменений
--
- Контрольные хэши в качестве идентификаторов любых изменений
--
- История изменений не подлежит удалению или манипуляции
Репозиторий
--
❯ ls -la .git
drwxr-xr-x 14 keynslug staff 448 Jul 23 19:44 . drwxr-xr-x 25 keynslug staff 800 Jun 20 14:25 .. -rw-r--r-- 1 keynslug staff 2769 Jul 23 19:44 COMMIT_EDITMSG -rw-r--r-- 1 keynslug staff 1167 Jul 16 17:37 FETCH_HEAD -rw-r--r-- 1 keynslug staff 19 Jul 16 17:37 HEAD -rw-r--r-- 1 keynslug staff 41 Jul 16 17:37 ORIG_HEAD -rw-r--r-- 1 keynslug staff 1614 Jul 15 19:07 config -rw-r--r-- 1 keynslug staff 73 Apr 5 15:24 description drwxr-xr-x 13 keynslug staff 416 Apr 5 15:24 hooks -rw-r--r-- 1 keynslug staff 13103 Jul 16 17:37 index drwxr-xr-x 3 keynslug staff 96 Apr 5 15:24 info drwxr-xr-x 4 keynslug staff 128 Apr 10 19:47 logs drwxr-xr-x 254 keynslug staff 8128 Jul 12 15:30 objects drwxr-xr-x 6 keynslug staff 192 Jun 13 11:22 refs
Коммиты
--
- Фрагмент истории проекта
commit 879046011d1dbb845537628cc61eaae98dcf8c9c Parent: 0a8b2bf3a13593bdd70e46cc0b4cce5e714cb285 Author: Andrew Mayorov <encube.ul@gmail.com> Date: Sun Jul 15 19:10:33 2018 +0300 CAPI-262: Make `bin` example look in line w/ definition (#26) api/payres/spec/definitions/SecuredBankCard.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
--
- Осмысленная единица изменения
-- - Зачем? Сообщение
- **Кто?** Автор
-- - Когда? Время
- **Что?** Набор изменённых файлов
-- - Где? Хэш, хэш родительского коммита
Ветки
--
- Пространство для манёвров
--
- Название для определённой осмысленной истории изменений
--
- Набор коммитов, наложенных на базовую ветку
Ветки
--
❯ git checkout -b fix/spelling
Switched to a new branch 'fix/spelling'
--
❯ git log --oneline HEAD~3..
8790460 (HEAD -> fix/spelling, origin/master, master) CAPI-262: Make `bin` example look in line w/ definition (#26) 0a8b2bf CAPI-262: Stash deposits for later (#21) 04db123 CAPI-262: Stash identity challenge cancellation (#23)
--
❯ cat .git/refs/heads/fix/spelling .git/refs/heads/master fix/spelling
879046011d1dbb845537628cc61eaae98dcf8c9c 879046011d1dbb845537628cc61eaae98dcf8c9c
Состояния файлов
--
.col-6[
- Находящиеся в стейджинге, попадающие в грядущий коммит ]
.col-6[
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README.md
]
--
.col-6[
- Изменённые в рабочей копии репозитория, но ещё не попавшие в стейджинг ]
.col-6[
Changes not staged for commit:
(use "git add <file>..." to update what
will be committed)
(use "git checkout -- <file>..." to
discard changes in working directory)
modified: SCENARIOS.md
]
--
.col-6[
- Новые, ещё не влючённые в репозиторий ]
.col-6[
Untracked files: (use "git add <file>..." to include in what will be committed) package-lock.json withdrawal.svg withdrawal.wsd
]
Объекты
- Практически каждый элемент репозитория – объект
--
- файл
--
- директория
--
- коммит
--
-
Исключения
- ветки – ссылки на коммиты
Объекты
- Сделаем новый коммит на ветку v0
❯ git commit -m 'Add more TODOs'
[v0 6b6061d] Add more TODOs 1 file changed, 12 insertions(+), 4 deletions(-)
Объекты
- Посмотрим, что получилось
❯ git show --stat v0
commit 6b6061d9dadd271f9c68d11df90f3c63711dbf8b Author: Andrey Mayorov <a.mayorov@rbkmoney.com> Date: Mon Jul 23 20:32:25 2018 +0300 Add more TODOs README.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
Объекты
- Посмотрим, какое теперь состояние ветки v0
❯ cat .git/refs/heads/v0
6b6061d9dadd271f9c68d11df90f3c63711dbf8b
Объекты
- Прочитаем, что записано в commit object
❯ git cat-file -p 6b6061d9dadd271f9c68d11df90f3c63711dbf8b
tree 6fda390e9a9b9a6c92a89fdfa49ffa21d7aede64 parent 879046011d1dbb845537628cc61eaae98dcf8c9c author Andrey Mayorov 1532367145 +0300 committer Andrey Mayorov 1532367145 +0300 Add more TODOs
--
- Абсолютно у каждого коммита есть родительский коммит
Объекты
- Посмотрим на состояние tree object
❯ git cat-file -p 6fda390e9a9b9a6c92a89fdfa49ffa21d7aede64
100644 blob cddabd62522ad78c23e476a2610eccb048799d83 .gitignore 100644 blob 007daaf6d80329761f298635dfc8178cd6454ed5 Makefile 100644 blob cd87e33b43be29610317197890c0d2b4b607c2f1 README.md 040000 tree 661a6471b416f080efa1d3e51bef0c95028e2ab7 api 100644 blob 133f3456a4e424d1c625786fc746b7b48ee1f496 gulpfile.js 100644 blob 226cd9fdceff689a97af269634065e6ce655a8d1 package.json 040000 tree 857588a242ee82881aa19736b02e14c178ac4435 scripts 040000 tree af474cb37b5668fd23f8590aac3bd9b569dc8b2f spec 040000 tree a6dcc3e3db0213af966837d671f077128dedba30 web 100644 blob 2ab2153d2eb0261252c21ed65e8186974917a2a7 wercker.yml
--
- На самом деле изменился только хэш blob object, соответствующего
README.md
Объекты
- Посмотрим, как теперь выглядит blob object, соответствующий
README.md
❯ git cat-file -p cd87e33b43be29610317197890c0d2b4b607c2f1 v0
# Wallet API Specification ## TODO * Надо бы ввести identity service terms. ...
Слияния
- Процесс внесения изменений разных авторов в основную ветку
Слияния
❯ git merge stash/deposits
--
Merge branch 'stash/deposits' into v0 # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit.
--
Merge made by the 'recursive' strategy. api/wallet/spec/definitions/BankCardPaymentResource.yaml | 4 ++++ api/wallet/spec/definitions/BankWirePaymentResource.yaml | 3 +++ api/wallet/spec/definitions/Deposit.yaml | 34 ++++++++++++++++++++++++++++++++++ api/wallet/spec/definitions/DepositEvent.yaml | 21 +++++++++++++++++++++ api/wallet/spec/definitions/DepositEventChange.yaml | 12 ++++++++++++ api/wallet/spec/paths/deposits.yaml | 29 +++++++++++++++++++++++++++++ api/wallet/spec/paths/deposits@{depositID}.yaml | 17 +++++++++++++++++ api/wallet/spec/paths/deposits@{depositID}@events.yaml | 21 +++++++++++++++++++++ api/wallet/spec/swagger.yaml | 13 +++++++++++++ 15 files changed, 227 insertions(+)
Слияния
- Посмотрим, как выглядит commit object
❯ git cat-file -p 9453ded6dfa17c21d2e10c9c2a2464d3ea24e1f3 v0
tree 1baafb778c172fc3d2b3481ccd968dd93452d61f parent 6b6061d9dadd271f9c68d11df90f3c63711dbf8b parent 1b232523c7a6714ca8b624d79107987947c1c985 author Andrey Mayorov <a.mayorov@rbkmoney.com> 1532369793 +0300 committer Andrey Mayorov <a.mayorov@rbkmoney.com> 1532369793 +0300 Merge branch 'stash/deposits' into v0
--
- Commit object с двумя родительскими коммитами
Слияния
- Посмотрим, как выглядит история
git log --oneline --graph HEAD~8..
* a183297 Merge branch 'stash/deposits' into v0 |\ | * 1b23252 Revert "CAPI-262: Stash deposits for later (#21)" * | 6b6061d Add more TODOs * | 8790460 CAPI-262: Make `bin` example look in line w/ definition (#26) |/ * 0a8b2bf CAPI-262: Stash deposits for later (#21) * 04db123 CAPI-262: Stash identity challenge cancellation (#23) * e004ee2 CAPI-262: Fix a couple of unusedness warnings (#22) * d3d07cc CAPI-262: Fix residence param length (#20) * cdfe496 CAPI-262: Fix case sensitivity in query params too (#18)
--
- Две независимо разрабатываемые ветки успешно слились в одну
Удалённые репозитории
--
- Для синхронизации с коллегами необходимо доставлять свои изменения в удалённый репозиторий
--
- Чтобы прогрессировать в работе над единым проектом, нужно выбрать схему работы (workflow)
-- - Централизованный репозиторий, свободно принимающий любые изменения
-- - Интеграционный репозиторий, принимающий запросы на включение изменений (pull requests) из форков (forks)
👍
Удалённые репозитории
- Склонируем интеграционный репозиторий с проектом
❯ git clone https://github.com/rbkmoney/camp-git-shallow-dive
Cloning into 'swag-wallets'... remote: Counting objects: 426, done. remote: Compressing objects: 100% (78/78), done. remote: Total 426 (delta 58), reused 110 (delta 40), pack-reused 288 Receiving objects: 100% (426/426), 126.16 KiB | 942.00 KiB/s, done. Resolving deltas: 100% (170/170), done.
--
- Узнаем, на какие удалённые репозитории он ссылается
❯ git remote -v
origin https://github.com/rbkmoney/camp-git-shallow-dive (fetch) origin https://github.com/rbkmoney/camp-git-shallow-dive (push)
Удалённые репозитории
- Сделаем свой личный форк
❯ hub fork keynslug
Updating keynslug From ssh://github.com/rbkmoney/camp-git-shallow-dive * [new branch] master -> keynslug/master new remote: keynslug
--
- Узнаем, на какие удалённые репозитории он теперь ссылается
❯ git remote -v
keynslug git@github.com:keynslug/camp-git-shallow-dive.git (fetch) keynslug git@github.com:keynslug/camp-git-shallow-dive.git (push) origin https://github.com/rbkmoney/camp-git-shallow-dive (fetch) origin https://github.com/rbkmoney/camp-git-shallow-dive (push)
Удалённые репозитории
- Основное состояние проекта находится в ветке
master
--
- Пора создать ветку для новых изменений
❯ git checkout -b ft/last-slides
Switched to a new branch 'ft/last-slides'
--
- И создать на ней коммит с необходимыми изменениями
❯ git add presentation.md ❯ git commit -m 'Add most presentation slides'
[ft/last-slides 268c683] Add most presentation slides 1 file changed, 701 insertions(+) create mode 100644 presentation.md
Удалённые репозитории
- Часто бывает так, что пока мы занимались этими изменениями, кто-то внёс изменения в основную ветку
--
- Нужно стараться синхронизировать удалённые изменения
--
В этот раз нам повезло
<pre class="terminal">
❯ git fetch origin
❯ git merge origin/master
</pre>
<pre class="terminal">
Already up to date.
</pre>
Удалённые репозитории
- Пора синхронизировать наши изменения с нашим удалённым репозиторием
--
<pre class="terminal">
❯ git push -u keynslug ft/last-slides
</pre>
<pre class="terminal">
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 6.68 KiB | 6.68 MiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:keynslug/camp-git-shallow-dive.git
* [new branch] ft/last-slides -> ft/last-slides
Branch 'ft/last-slides' set up to track remote branch 'ft/last-slides' from 'keynslug'.
</pre>
--
- Мы отправили 3 объекта, несложно понять, что это: сам commit, tree object и blob object с файлом
presentation.md
--
- Теперь мы отслеживаем изменения в удалённой ветке
ft/last-slides
Удалённые репозитории
- Пора интегрировать внесённые изменения в интеграционный репозиторий
--
-
Создадим запрос на включение наших изменений
❯ hub pull-request
Add the most of presentation slides # Requesting a pull to rbkmoney:master from keynslug:ft/last-slides # # Write a message for this pull request. The first block # of text is the title and the rest is the description.
https://github.com/rbkmoney/camp-git-shallow-dive/pull/1
--
- Мы запросили включение в основную ветку интеграционного репозитория (
rbkmoney:master
)
Удалённые репозитории
- Дождёмся одобрения нашего запроса
--
- После чего интегратор произведёт включение, в результате которого произойдёт слияние наших изменений с основной веткой
--
-
Теперь нам необходимо синхронизировать состояние основной ветки с нашим локальным репозиторием ❯ git checkout master
Switched to branch 'master' Your branch is up to date with 'origin/master'.
-
Синхронизация ещё не проведена, локальный репозиторий не знает о произошедших изменениях
Удалённые репозитории
-
Получаем изменения с удалённого репозитория
❯ git pull origin master
remote: Counting objects: 1, done. remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (1/1), done. From github.com:rbkmoney/camp-git-shallow-dive d4da560..43fe41a master -> origin/master
--
-
Наблюдаем в истории появления коммита, фиксирующего слияние наших изменений
❯ git log --oneline keynslug/master..
43fe41a (origin/master, master) Merge pull request #1 from keynslug/ft/last-slides 268c683 (keynslug/ft/last-slides) Add most presentation slides
class: impact animation-fade layout: true