Git – популярная система контроля версий

Содержание

Слайд 2

Мотивация

Мотивация

Слайд 3

Единое место хранения кода
Удобное объединение изменений от разных разработчиков
История изменений с описанием

Единое место хранения кода Удобное объединение изменений от разных разработчиков История изменений
и авторством
Откат неудачных изменений
Ревью изменений

Зачем разработчикам система контроля версий?

Слайд 4

А зачем система контроля версий вам?

А зачем система контроля версий вам?

Слайд 5

Систем контроля версий море…

CVS

SVN

Git

Perforce

TFS

Fossil

Bazaar

Mercurial

Veracity

Систем контроля версий море… CVS SVN Git Perforce TFS Fossil Bazaar Mercurial Veracity

Слайд 6

Распределенная
Каждому по репозиторию
Консольная
Состоит из утилит командной строки
Кроссплатформенная
Много разных GUI
Поддерживается
хостингами репозиториев: GitHub, GitLab,

Распределенная Каждому по репозиторию Консольная Состоит из утилит командной строки Кроссплатформенная Много
BitBucket
популярными IDE: Visual Studio, WebStorm, VS Code

Git – популярная система контроля версий

Слайд 7

А кто уже пользовался Git?
А другой системой контроля версий?

А кто уже пользовался Git? А другой системой контроля версий?

Слайд 8

Как будем изучать?

Как будем изучать?

Слайд 9

GUIов много, на любой вкус и цвет, каждый со своими особенностями, а придется что-то

GUIов много, на любой вкус и цвет, каждый со своими особенностями, а
выбрать

Как будем изучать?

Слайд 10

Примеры GUI на Git Extensions
Тонкая надстройка над консолью с минимумом магии
Удобные команды,

Примеры GUI на Git Extensions Тонкая надстройка над консолью с минимумом магии
управление с клавиатуры
Распространен в Контуре
Примеры GUI на Git Graph
Удобное расширение VS Code
Можно просматривать историю не выходя из редактора
Примеры CLI на Git Bash
Может все!

Как будем изучать?

Слайд 11

Задания на Git Bash + Git Graph для Linux, Maс или Windows

Как будем

Задания на Git Bash + Git Graph для Linux, Maс или Windows
изучать?

Задания на Git Extensions для Windows

Слайд 12

VS Code для разрешения конфликтов
Показывает конфликт он как есть
Подсветка конфликта, кнопки быстрых

VS Code для разрешения конфликтов Показывает конфликт он как есть Подсветка конфликта,
действий
Подсвечивает код

Как будем изучать?

Слайд 13

VS Code для редактирования
Подсвечивает Markdown
Умеет открывать папку

Как будем изучать?

VS Code для редактирования Подсвечивает Markdown Умеет открывать папку Как будем изучать?

Слайд 14

Особенностей и нюансов много, а времени мало
Если освоить правила, в нюансах легко разобраться
Сформулируем

Особенностей и нюансов много, а времени мало Если освоить правила, в нюансах
10 правил Git и связанные с ними команды

Как будем изучать?

Слайд 15

Формат
Правило и теория к нему
Практические задания
Синхронизация
А потом много практики в реальной жизни, чтобы

Формат Правило и теория к нему Практические задания Синхронизация А потом много
довести до автоматизма ☺

Как будем изучать?

Слайд 16

S1. Все локально

A1. Трехсторонний merge в три шага

R2. Удаленное изменение — это push

A2. rebase,

S1. Все локально A1. Трехсторонний merge в три шага R2. Удаленное изменение
cherry-pick и amend, чтобы пересоздать историю

A3. stash, reset, revert для управления изменениями

S2. Хранятся состояния директории, постепенная сборка коммита

S3. Манипуляции через ссылки, нет ссылки — в мусор

R3. Явное сопоставление локальных веток с upstream

R1. Доступен fetch коммитов любого репозитория в любой момент

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

Слайд 17

H1. Гибкое конфигурирование и качественная документация

Гибкая настройка под любой процесс
Документация ко всем командам
Алиасы

H1. Гибкое конфигурирование и качественная документация Гибкая настройка под любой процесс Документация
для краткости команд
Надо игнорировать все, кроме исходников

Слайд 18

Конфигурируется под команду и продукт

У команд Git множество опций
Поведение команд по умолчанию

Конфигурируется под команду и продукт У команд Git множество опций Поведение команд
можно настраивать
Настройки репозитория: git config --local -e
Настройки пользователя: git config --global -e
Настройки системы: git config --system -e

Слайд 19

Git должен знать, кто вносит изменения:
git config --global user.name "John Doe"
git config

Git должен знать, кто вносит изменения: git config --global user.name "John Doe"
--global user.email "[email protected]"
Стоит задать текстовый редактор:
Windows: git config --global core.editor notepad
Linux, Mac: git config --global core.editor nano
Хотя бы для того, чтобы отредактировать остальные настройки!
По умолчанию — vim ?

Минимальная Жизнеспособная Конфигурация

Слайд 20

git help commit
git commit --help
git commit -h
Чтобы не запоминать все опции команд!

Git

git help commit git commit --help git commit -h Чтобы не запоминать
спешит на помощь!

Слайд 21

Подсказки при неверных командах

Полезно читать вывод хотя бы при освоении Git!

Подсказки при неверных командах Полезно читать вывод хотя бы при освоении Git!

Слайд 22

Полная запись: git branch --delete awesome-feature
Короткая запись: git branch -d awesome-feature
Полная усиленная запись: git branch

Полная запись: git branch --delete awesome-feature Короткая запись: git branch -d awesome-feature
--delete --force awesome-feature
Короткая усиленная запись: git branch -D awesome-feature

Стандарты опций

Слайд 23

Через .gitconfig
[alias]
it = !git init && git commit -m 'Initial commit' --allow-empty
st

Через .gitconfig [alias] it = !git init && git commit -m 'Initial
= status -sb
commend = commit --amend --no-edit
graph = log --oneline --decorate --graph --all
Использование: git graph

Алиасы для краткости команд

Слайд 24

Через .gitconfig
[core]
autocrlf = true
safecrlf = true
Через команды
git config --global core.autocrlf true
git config

Через .gitconfig [core] autocrlf = true safecrlf = true Через команды git
--global core.safecrlf true
autocrlf – преобразование \r\n в \n
safecrlf – проверка обратимости преобразования \r\n в \n

Настройка для Windows

Слайд 25

Через .gitconfig
[core]
autocrlf = input
Через команды
git config --global core.autocrlf input
Даже если получено \r\n,

Через .gitconfig [core] autocrlf = input Через команды git config --global core.autocrlf
то преобразуется в \n

Настройка для Linux и Mac

Слайд 26

Сохранять в репозиторий нужно только исходные файлы!
Остальное — в игнор!

Сохранять в репозиторий нужно только исходные файлы! Остальное — в игнор!

Слайд 27

В любой папке и ее подпапках
.gitignore
Через .gitconfig
[core]
excludesFile
Дополнительно в репозитории
/.git/info/exclude
Коллекция .gitignore от GitHub:

В любой папке и ее подпапках .gitignore Через .gitconfig [core] excludesFile Дополнительно
https://github.com/github/gitignore

Игнорирование файлов

Слайд 28

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

H1. Гибкое конфигурирование и качественная документация Structure Actions Remote

Слайд 29

S1. Все локально

Все данные хранятся в локальных репозиториях, изменения между ними можно синхронизировать

S1. Все локально Все данные хранятся в локальных репозиториях, изменения между ними можно синхронизировать

Слайд 30

Репозиторий – хранилище кода со всей историей изменений
git init – создать репозиторий

Репозиторий – хранилище кода со всей историей изменений git init – создать
для папки

Репозиторий

Не нужен сервер!

Репозиторий

}

Рабочая директория

Слайд 31

Клонирование

Чтобы работать над существующим проектом надо скопировать репозиторий локально – склонировать
git clone

Клонирование Чтобы работать над существующим проектом надо скопировать репозиторий локально – склонировать
– склонировать репозиторий

Локальная копия

На сервере

Слайд 32

Fork на GitHub

GitHub

Fork на GitHub GitHub

Слайд 33

Fork на GitHub

Сделать форк

Fork на GitHub Сделать форк

Слайд 34

Bare-репозиторий — репозиторий без рабочей директории
git init --bare – создать bare-репозиторий
Обычно называется

Bare-репозиторий — репозиторий без рабочей директории git init --bare – создать bare-репозиторий
reponame.git, например [email protected]:kontur-courses/git.git
Обычный репозиторий — для разработки, bare-репозиторий — для облаков

Bare-репозиторий

Репозиторий

Bare — англ. Голый, Пустой

Слайд 35

Задание 1. Init Repo
Задание 2. Fork and Config

Задание 1. Init Repo Задание 2. Fork and Config

Слайд 36

S1. Все локально

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

S1. Все локально H1. Гибкое конфигурирование и качественная документация Structure Actions Remote

Слайд 37

S2. Хранятся состояния директории, постепенная сборка коммита

Хранятся файлы, разница вычисляется на лету
Commit index

S2. Хранятся состояния директории, постепенная сборка коммита Хранятся файлы, разница вычисляется на
для постепенной сборки коммита

Слайд 38

«Снимки» директории

Working directory

«Снимки» директории Working directory

Слайд 39

Сохранение состояния

Working directory

Сохранение состояния Working directory

Слайд 40

Еще сохранения

Working directory

Еще сохранения Working directory

Слайд 41

Загрузка состояния

Working directory

Загрузка состояния Working directory

Слайд 42

Альтернативная ветка истории

Working directory

Альтернативная ветка истории Working directory

Слайд 43

Метаинформация
Хэш-коммита
Сообщение
Информацию об авторе
Время
Родитель
Данные
Полное состояние директории
Изменения по сравнению с родителем

Что содержит коммит?

Метаинформация Хэш-коммита Сообщение Информацию об авторе Время Родитель Данные Полное состояние директории

Слайд 44

Метаинформация коммита

Метаинформация коммита

Слайд 45

Полное состояние директории

Полное состояние директории

Слайд 46

Изменения по сравнению с родителем

Изменения по сравнению с родителем

Слайд 47

Каждый коммит хранит структуру каталога и все файлы состояния директории
Хранение файлов оптимизировано:

Каждый коммит хранит структуру каталога и все файлы состояния директории Хранение файлов
файлы не хранятся повторно, потому что в структуре каталога хранятся не сами файлы, а ссылки по хэшу на них
Используется сжатие, чтобы текстовые данные занимали меньше места
Разница между коммитами вычисляется на лету и с родителем и с любым другим коммитом

Хранятся файлы, разница вычисляется на лету

Слайд 48

Working directory & Commit index

Последний коммит

Working directory

Working directory & Commit index Последний коммит Working directory

Слайд 49

Working directory & Commit index

Последний коммит

Commit index = Staging area

Working directory

Для постепенной сборки

Working directory & Commit index Последний коммит Commit index = Staging area
коммита

Staging area — англ. место сбора войск на пути к месту назначения

Слайд 50

Working directory & Commit index

Working directory & Commit index

Слайд 51

Внесение изменений

Working directory

Commit index

Последний коммит

Внесение изменений Working directory Commit index Последний коммит

Слайд 52

Внесение изменений

Working directory

Commit index

Последний коммит

Редактирование

Внесение изменений Working directory Commit index Последний коммит Редактирование

Слайд 53

Внесение изменений

Working directory

Commit index

Последний коммит

git add init.md

Внесение изменений Working directory Commit index Последний коммит git add init.md

Слайд 54

Внесение изменений

Working directory

Commit index

Последний коммит

Редактирование

Внесение изменений Working directory Commit index Последний коммит Редактирование

Слайд 55

Working directory changes

Commit index changes

Working directory changes Commit index changes

Слайд 56

Внесение изменений

Working directory

Commit index

Последний коммит

git add commit.md

Внесение изменений Working directory Commit index Последний коммит git add commit.md

Слайд 57

Внесение изменений

Working directory

Commit index

Последний коммит

git commit

Внесение изменений Working directory Commit index Последний коммит git commit

Слайд 58

Working directory changes

Commit index changes

Commit message

Working directory changes Commit index changes Commit message

Слайд 59

Внесение изменений

Последний коммит

Commit index

Working directory

Редактирование

git add .

git commit

Внесение изменений Последний коммит Commit index Working directory Редактирование git add . git commit

Слайд 60

Отмена изменений

Working directory

Commit index

Последний коммит

git add commit.md

Отмена изменений Working directory Commit index Последний коммит git add commit.md

Слайд 61

Отмена изменений

Working directory

Commit index

Последний коммит

git add commit.md

git restore --staged commit.md

Отмена изменений Working directory Commit index Последний коммит git add commit.md git restore --staged commit.md

Слайд 62

Отмена изменений

Working directory

Commit index

Последний коммит

git restore --staged commit.md

git add commit.md

Отмена изменений Working directory Commit index Последний коммит git restore --staged commit.md git add commit.md

Слайд 63

Отмена изменений

Working directory

Commit index

Последний коммит

Редактирование

Отмена изменений Working directory Commit index Последний коммит Редактирование

Слайд 64

Отмена изменений

Working directory

Commit index

Последний коммит

Редактирование

git restore --worktree commit.md

Отмена изменений Working directory Commit index Последний коммит Редактирование git restore --worktree commit.md

Слайд 65

Отмена изменений

Working directory

Commit index

Последний коммит

Редактирование

git restore --worktree commit.md

restore не может удалить файл

Отмена изменений Working directory Commit index Последний коммит Редактирование git restore --worktree
из working directory

Слайд 66

Отмена изменений

Working directory

Commit index

Последний коммит

Редактирование

v2

v1

Отмена изменений Working directory Commit index Последний коммит Редактирование v2 v1

Слайд 67

Отмена изменений

Working directory

Commit index

Последний коммит

Редактирование

v2

v1

git restore --worktree commit.md

Отмена изменений Working directory Commit index Последний коммит Редактирование v2 v1 git restore --worktree commit.md

Слайд 68

Отмена изменений

Working directory

Commit index

Последний коммит

Редактирование

v1

v1

git restore --worktree commit.md

restore может отменить редактирование в

Отмена изменений Working directory Commit index Последний коммит Редактирование v1 v1 git
working directory

Слайд 69

Отмена изменений

Последний коммит

Commit index

Working directory

Редактирование

git add .

git commit

git restore --staged .

git restore

Отмена изменений Последний коммит Commit index Working directory Редактирование git add .
--worktree .
git restore .

Слайд 70

Отмена изменений по-старому

Последний коммит

Commit index

Working directory

Редактирование

git add .

git commit

git restore --staged .
git

Отмена изменений по-старому Последний коммит Commit index Working directory Редактирование git add
reset .

git restore --worktree .
git restore .
git checkout .

Команды checkout и reset также есть в контексте коммитов и использование тех же названий ведет к путанице

Слайд 71

Отмена изменений

Последний коммит

Commit index

Working directory

Редактирование

git add .

git commit

git restore --staged .
git reset

Отмена изменений Последний коммит Commit index Working directory Редактирование git add .
.

git restore --worktree .
git restore .
git checkout .

Слайд 72

Один файл с разными версиями

Один файл с разными версиями

Слайд 73

Working directory changes

Commit index changes

Commit message

Working directory changes Commit index changes Commit message

Слайд 74

Удобный алиас

git config --global alias.st "status -sb"

Удобный алиас git config --global alias.st "status -sb"

Слайд 75

Задание 3. Commits

Задание 3. Commits

Слайд 76

S1. Все локально

S2. Хранятся состояния директории, постепенная сборка коммита

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

S1. Все локально S2. Хранятся состояния директории, постепенная сборка коммита H1. Гибкое

Слайд 77

S3. Манипуляции через ссылки, нет ссылки — в мусор

HEAD — текущая ссылка, tag —

S3. Манипуляции через ссылки, нет ссылки — в мусор HEAD — текущая
фиксированная ссылка, branch — движущаяся за HEAD ссылка
checkout — перемещение на ветку или коммит, reset — перемещение с веткой на коммит
Видно то, на что есть ссылки, остальное — мусор

Слайд 78

Указывает на коммит, относительно которого выполняются операции
с ним связан Commit index и

Указывает на коммит, относительно которого выполняются операции с ним связан Commit index
Working directory
в него будет сделан следующий коммит, смещается при коммите
перемещается при checkout, switch или reset
относительно него работают merge, rebase и т.д.

HEAD – точка приложения усилий

HEAD

Слайд 79

Именованная ссылка, привязанная к конкретному коммиту
Псевдоним коммита
Применяется для обозначения версий
Полезен при манипуляциях

Именованная ссылка, привязанная к конкретному коммиту Псевдоним коммита Применяется для обозначения версий
над историей
Типы тегов:
lightweight — просто ссылка
annotated — с доп. информацией, в том числе об авторе

Tag

v0.2

v0.1

Слайд 80

Движущаяся ссылка, которая сдвигается вместе с HEAD, если тот на нее указывает

Branch

f1

HEAD

master

f2

Движущаяся ссылка, которая сдвигается вместе с HEAD, если тот на нее указывает

Слайд 81

Движущаяся ссылка, которая сдвигается вместе с HEAD, если тот на нее указывает

Branch

f1

HEAD

master

f2

Движущаяся ссылка, которая сдвигается вместе с HEAD, если тот на нее указывает

Слайд 82

Движущаяся ссылка, которая сдвигается вместе с HEAD, если тот на нее указывает
Получающаяся

Движущаяся ссылка, которая сдвигается вместе с HEAD, если тот на нее указывает
за этой ссылкой последовательность коммитов похожа на ветку
Ветки используются для разработки нового функционала
Главная ветка по соглашению называется master

Branch

f1

master

HEAD

f2

Слайд 83

Каждой фиче – отдельная ветка

Каждой фиче – отдельная ветка

Слайд 84

Detached HEAD

f1

HEAD

master

f2

HEAD может указывать не только на ветку, но и непосредственно на

Detached HEAD f1 HEAD master f2 HEAD может указывать не только на
коммит
В этом случае говорят, что это detached HEAD

Слайд 85

Что произойдет после коммита?

f1

HEAD

master

f2

Что произойдет после коммита? f1 HEAD master f2

Слайд 86

Коммит без движения ветки

f1

master

f2

Коммит всегда происходит в HEAD, но если HEAD не

Коммит без движения ветки f1 master f2 Коммит всегда происходит в HEAD,
указывает ни на одну ветку, то ветки не двигаются

HEAD

Слайд 87

Ветки и теги в Git Extensions

Ветки и теги в Git Extensions

Слайд 88

Ветки и теги в Git Graph

Ветки и теги в Git Graph

Слайд 89

Ветки и теги в Git Bash

Ветки и теги в Git Bash

Слайд 90

Удобный алиас

git config --global alias.graph "log --oneline --decorate --graph --all"

Удобный алиас git config --global alias.graph "log --oneline --decorate --graph --all"

Слайд 91

Команда checkout может перенести HEAD на какую-нибудь ветку

Checkout на ветку

f1

master

HEAD

f2

Команда checkout может перенести HEAD на какую-нибудь ветку Checkout на ветку f1 master HEAD f2

Слайд 92

Команда checkout может перенести HEAD на какую-нибудь ветку

Checkout на ветку

f1

master

HEAD

f2

Команда checkout может перенести HEAD на какую-нибудь ветку Checkout на ветку f1 master HEAD f2

Слайд 93

Команда checkout может перенести HEAD на любой коммит, причем получится detached HEAD

Checkout

Команда checkout может перенести HEAD на любой коммит, причем получится detached HEAD
на коммит

f1

master

HEAD

f2

Слайд 94

Команда checkout может перенести HEAD на любой коммит, причем получится detached HEAD

Checkout

Команда checkout может перенести HEAD на любой коммит, причем получится detached HEAD
на коммит

f1

master

HEAD

f2

Слайд 95

Checkout старается перенести локальные изменения, либо не выполняется

Checkout старается перенести локальные изменения, либо не выполняется

Слайд 96

Switch — новая команда, задуманная как замена для checkout

Switch — новая команда, задуманная как замена для checkout

Слайд 97

Команда reset может перенести HEAD на любой коммит, причем захватывает с собой

Команда reset может перенести HEAD на любой коммит, причем захватывает с собой
ветку, на которую указывает HEAD

Перенос ветки с reset --hard

f1

master

HEAD

f2

Слайд 98

Команда reset может перенести HEAD на любой коммит, причем захватывает с собой

Команда reset может перенести HEAD на любой коммит, причем захватывает с собой
ветку, на которую указывает HEAD

Перенос ветки с reset --hard

f1

master

HEAD

f2

Слайд 99

Reset в режиме hard затирает локальные изменения
Пока этого достаточно!

Reset в режиме hard затирает локальные изменения Пока этого достаточно!

Слайд 100

Если на коммит есть ссылка: HEAD, tag, branch – то он показывается,

Если на коммит есть ссылка: HEAD, tag, branch – то он показывается,
а иначе скрывается
Если нет ссылок, то коммит будет удален через 30 суток
git gc вызывает ручную очистку ненужного

Видно то, на что есть ссылки

Слайд 101

Помните выполнение reset --hard?

f1

master

HEAD

f2

Помните выполнение reset --hard? f1 master HEAD f2

Слайд 102

Вот это уже мусор

f1

master

HEAD

f2

Вот это уже мусор f1 master HEAD f2

Слайд 103

Выглядеть будет так

f1

master

HEAD

f2

Выглядеть будет так f1 master HEAD f2

Слайд 104

Если потерялся коммит в ходе манипуляций, то он не удален и его можно

Если потерялся коммит в ходе манипуляций, то он не удален и его
найти
Если закоммичено – не потеряете

Но все же...

Слайд 105

Все перемещения ссылок логируются и хэши всех видимых когда-либо ревизий оседают в

Все перемещения ссылок логируются и хэши всех видимых когда-либо ревизий оседают в этих логах
этих логах

Слайд 106

Reflog в Git Extensions

Reflog в Git Extensions

Слайд 107

Reflog в консоли

Reflog в консоли

Слайд 108

Отмечать дорогие сердцу коммиты тегами перед сложными манипуляциями
Помнить про особенность git log.

Отмечать дорогие сердцу коммиты тегами перед сложными манипуляциями Помнить про особенность git
По умолчанию показывает предков HEAD, а не все коммиты
В крайнем случае использовать reflog

Как ничего не терять?

Слайд 109

A
/ \
/ \
B C
/|
/ |
D

A / \ / \ B C /| / | D E
E

Относительная адресация коммитов

A = A^0
B = A^1 = A^ = A~1
C = A^2
D = A^1^1 = A^^ = A~2
E = B^2 = A^^2
~N — 1-ый родитель из N-ого поколения
^N — N-ый родитель предыдущего поколения

Слайд 110

А это точно надо запомнить?

А это точно надо запомнить?

Слайд 111

А это точно надо запомнить?
Нет!

А это точно надо запомнить? Нет!

Слайд 112

Удобный алиас

git config --global alias.undo "reset --soft HEAD^"
Эта команда отменяет commit, но

Удобный алиас git config --global alias.undo "reset --soft HEAD^" Эта команда отменяет
про режим soft будет позже...

Слайд 113

Задание 4. Tag Задание 5. Feature Branches

Задание 4. Tag Задание 5. Feature Branches

Слайд 114

S1. Все локально

S2. Хранятся состояния директории, постепенная сборка коммита

S3. Манипуляции через ссылки, нет ссылки — в

S1. Все локально S2. Хранятся состояния директории, постепенная сборка коммита S3. Манипуляции
мусор

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

Слайд 115

A1. Трехсторонний merge в три шага

Два состояния можно объединить через merge, mergetool

A1. Трехсторонний merge в три шага Два состояния можно объединить через merge,
и commit
Участвуют три стороны: current, incoming и base

Слайд 116

Разрабатывать в отдельных ветках правильно, но в конце концов надо объединить функционал

Разрабатывать в отдельных ветках правильно, но в конце концов надо объединить функционал
в одной версии

Слияние

1

4

2

3

master

f2

Слайд 117

Разрабатывать в отдельных ветках правильно, но в конце концов надо объединить функционал

Разрабатывать в отдельных ветках правильно, но в конце концов надо объединить функционал
в одной версии
Значит надо получить новое состояние – коммит

Слияние

1

4

2

3

master

f2

5

Слайд 118

Как объединить изменения?

A.txt
D.txt

A.txt
B.txt
D.txt

A.txt
C.txt

master

f2

?

Как объединить изменения? A.txt D.txt A.txt B.txt D.txt A.txt C.txt master f2 ?

Слайд 119

Как объединить изменения?

A.txt
D.txt

A.txt
B.txt
D.txt

A.txt
C.txt
D.txt

master

f2

A.txt
B.txt
C.txt

Как объединить изменения? A.txt D.txt A.txt B.txt D.txt A.txt C.txt D.txt master f2 A.txt B.txt C.txt

Слайд 120

Общий родитель

1

4

2

3

master

f2

Общий родитель для master и f2

Общий родитель 1 4 2 3 master f2 Общий родитель для master и f2

Слайд 121

А если был изменен один и тот же файл?

А если был изменен один и тот же файл?

Слайд 122

Как объединить изменения?

master

f2

?

Как объединить изменения? master f2 ?

Слайд 123

Как объединить изменения?

master

f2

Как объединить изменения? master f2

Слайд 124

А если одна и та же строчка?

А если одна и та же строчка?

Слайд 125

<<<<<<< HEAD:index.html


=======

>>>>>>> iss53:index.html

Конфликт

contact : email.support@github.com ======= please contact us at support@github.com >>>>>>> iss53:index.html Конфликт

Слайд 126

<<<<<<< HEAD:index.html


=======

>>>>>>> f2:index.html

Конфликт

Создается

contact : email.support@github.com ======= please contact us at support@github.com >>>>>>> f2:index.html Конфликт
текстовый блок, содержащий изменения из обоих коммитов

Слайд 127

Необходимо заменить все «объединенные» текстовые блоки на правильное содержимое
Стратегии
Взять один вариант
Взять второй

Необходимо заменить все «объединенные» текстовые блоки на правильное содержимое Стратегии Взять один
вариант
Взять оба варианта последовательно
Написать что-то совершенно иное

Разрешение конфликтов

Слайд 128

Разрешение конфликта в VS Code

Разрешение конфликта в VS Code

Слайд 129

В конфликтах
HEAD указывает на current
Другая ветка — это incoming
При merge HEAD указывает

В конфликтах HEAD указывает на current Другая ветка — это incoming При
на ветку,
в которую вливается другая ветка

Слайд 130

Current и Incoming

Current и Incoming

Слайд 131

Надо объединять на уровне списка файлов и на уровне содержимого файлов
Нужно знать две

Надо объединять на уровне списка файлов и на уровне содержимого файлов Нужно
объединяемые версии, а также общего предка
Часто происходит автоматическое объединение
В остальных случаях необходимо вручную решать конфликты

Как объединять изменения?

Слайд 132

Алгоритм слияния

Алгоритм слияния

Слайд 133

Алгоритм слияния

Алгоритм слияния

Слайд 134

Алгоритм слияния

Можно остановиться, а затем продолжить

Git Extensions автоматически переходит к следующему шагу

Алгоритм слияния Можно остановиться, а затем продолжить Git Extensions автоматически переходит к следующему шагу

Слайд 135

Как поведут себя ветки?

1

4

2

3

master

f2

5

Как поведут себя ветки? 1 4 2 3 master f2 5

Слайд 136

Как поведут себя ветки?

1

4

2

3

master

f2

5

HEAD

Как поведут себя ветки? 1 4 2 3 master f2 5 HEAD

Слайд 137

Как поведут себя ветки?

1

4

2

3

master

f2

5

HEAD

Сдвинется ветка, на которой был HEAD

Ветка, которую вливают стоит на месте

Как поведут себя ветки? 1 4 2 3 master f2 5 HEAD

Слайд 138

Слияние в Git Extensions

Слияние в Git Extensions

Слайд 139

Слияние в Git Graph

Слияние в Git Graph

Слайд 140

А что если обратно влить?

1

4

2

3

master

f2

5

HEAD

А что если обратно влить? 1 4 2 3 master f2 5 HEAD

Слайд 141

Fast-Forward Merge

1

3

2

4

master

f2

5

HEAD

Нет смысла создавать коммит – просто передвигается ветка

Это Fast-Forward Merge
или «Перемотка»

Fast-Forward Merge 1 3 2 4 master f2 5 HEAD Нет смысла

Слайд 142

merge --no-ff

1

3

2

4

master

f2

5

HEAD

Можно заставить Git
создать новый коммит
без Fast-Forward

6

merge --no-ff 1 3 2 4 master f2 5 HEAD Можно заставить

Слайд 143

Иногда вследствие неведомых действий состояние директории полно конфликтов, merge не завершен и его хочется

Иногда вследствие неведомых действий состояние директории полно конфликтов, merge не завершен и
отменить

А если merge не удался?

Слайд 144

Иногда вследствие неведомых действий состояние директории полно конфликтов, merge не завершен и его хочется

Иногда вследствие неведомых действий состояние директории полно конфликтов, merge не завершен и
отменить
Переходим на исходный коммит с помощью checkout или reset, а затем повторяем merge

А если merge не удался?

Слайд 145

Иногда вследствие неведомых действий состояние директории полно конфликтов, merge не завершен и его хочется

Иногда вследствие неведомых действий состояние директории полно конфликтов, merge не завершен и
отменить
Переходим на исходный коммит с помощью checkout или reset, а затем повторяем merge
При этом затрутся все локальные изменения, поэтому перед слиянием все изменения рекомендуется сохранять (commit или stash)

А если merge не удался?

Слайд 146

Иногда вследствие неведомых действий состояние директории полно конфликтов, merge не завершен и его хочется

Иногда вследствие неведомых действий состояние директории полно конфликтов, merge не завершен и
отменить
git merge --abort

Более корректный способ

Предыдущий вариант тоже ок. Разве нет?

Слайд 147

Лишние файлы после merge?

При создании конфликта Git генерирует .orig-файлы с версиями до

Лишние файлы после merge? При создании конфликта Git генерирует .orig-файлы с версиями
слияния
Они исчезнут после успешного merge, если выставлено в настройках
[mergetool] keepbackup = false

Слайд 148

Задание 6. Merge Conflict Задание 7. Hidden Conflict Задание 8. Fast-Forward Merge

Задание 6. Merge Conflict Задание 7. Hidden Conflict Задание 8. Fast-Forward Merge

Слайд 149

S1. Все локально

A1. Трехсторонний merge в три шага

S2. Хранятся состояния директории, постепенная сборка коммита

S3. Манипуляции через

S1. Все локально A1. Трехсторонний merge в три шага S2. Хранятся состояния
ссылки, нет ссылки — в мусор

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

Слайд 150

A2. rebase, cherry-pick и amend, чтобы пересоздать историю

Нельзя переписать историю — можно

A2. rebase, cherry-pick и amend, чтобы пересоздать историю Нельзя переписать историю — можно создать новую
создать новую

Слайд 151

Даже если кажется, что Git редактирует коммиты, на самом деле он создает новые

Даже если кажется, что Git редактирует коммиты, на самом деле он создает новые

Слайд 152

Amend — англ. Вносить правки

Amend Commit

Последний коммит

Commit index

Working directory

Хочется дополнить последний коммит

Amend — англ. Вносить правки Amend Commit Последний коммит Commit index Working

Слайд 153

Amend Commit

Изменения из Commit index и старого коммита теперь в новом коммите

Старый коммит остался, но

Amend Commit Изменения из Commit index и старого коммита теперь в новом
никому не нужен

Слайд 154

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

Rebase

master

HEAD

f2

Слияния порождает лишние коммиты, а история становится нелинейной Rebase master HEAD f2

Слайд 155

Слияния порождает лишние коммиты, а история становится нелинейной
Хочется получать линейную историю!
Менять коммиты нельзя

Слияния порождает лишние коммиты, а история становится нелинейной Хочется получать линейную историю!
– значит надо создавать копии

Rebase

master

HEAD

f2

Слайд 156

Rebase создает новые коммиты

1

4

2

3

master

HEAD

f2

1

4

2’

3’

master

HEAD

f2

2

3

Общий родитель для HEAD и новой базы

Rebase создает новые коммиты 1 4 2 3 master HEAD f2 1

Слайд 157

Те же изменения на новой «базе»

1

4

2’

3’

2

3

1.txt
2.txt
3.txt
4.txt

1.txt
2.txt
4.txt

1.txt
4.txt

1.txt

1.txt
2.txt

1.txt
2.txt
3.txt

Те же изменения на новой «базе» 1 4 2’ 3’ 2 3

Слайд 158

Rebase по шагам

1

4

master

HEAD

f2

2

3

Rebase по шагам 1 4 master HEAD f2 2 3

Слайд 159

Rebase по шагам

1

4

master

HEAD

f2

2

3

Rebase по шагам 1 4 master HEAD f2 2 3

Слайд 160

Rebase по шагам

1

4

2’

master

HEAD

f2

2

3

Rebase по шагам 1 4 2’ master HEAD f2 2 3

Слайд 161

Rebase по шагам

1

4

2’

3’

master

HEAD

f2

2

3

Rebase по шагам 1 4 2’ 3’ master HEAD f2 2 3

Слайд 162

Изменения в коммите 4, новой базе, могут конфликтовать с изменениями в 2

Изменения в коммите 4, новой базе, могут конфликтовать с изменениями в 2
и в 3
Следовательно, перенос каждого коммита может породить конфликт
Конфликты разрешаются аналогично merge

Конфликты при rebase

1

4

2’

3’

2

3

1.txt
2.txt
3.txt
4.txt

1.txt
2.txt
4.txt

1.txt

1.txt
2.txt

1.txt
2.txt
3.txt

1.txt
2.txt
3.txt

Слайд 163

В конфликтах
HEAD указывает на current
Другая ветка — это incoming
После начала rebase HEAD

В конфликтах HEAD указывает на current Другая ветка — это incoming После
перемещается на коммит построения новой истории,
а в конце оказывается на вершине построенной ветки

Слайд 164

После решения конфликтов — продолжение

git rebase --continue

После решения конфликтов — продолжение git rebase --continue

Слайд 165

Иногда приходит понимание, что не надо было ввязываться в этот rebase с

Иногда приходит понимание, что не надо было ввязываться в этот rebase с
кучей конфликтов при переносе каждого коммита и его хочется отменить
git rebase --abort

А если rebase идет как-то не так?

Слайд 166

Позволяет указать, как применять каждый коммит
Например, можно делать squash всех переносимых коммитов

Позволяет указать, как применять каждый коммит Например, можно делать squash всех переносимых
в один

Интерактивный rebase

1

4

2’, 3’

master

HEAD

f2

2

3

Слайд 167

Сценарий интерактивного rebase

Обычный вариант

С объединением коммитов

Сценарий интерактивного rebase Обычный вариант С объединением коммитов

Слайд 168

Rebase в Git Extensions

Rebase в Git Extensions

Слайд 169

Rebase в Git Graph

Rebase в Git Graph

Слайд 170

Позволяет создать копию изменений произвольного коммита в новом месте
cherry picking — идиома,

Позволяет создать копию изменений произвольного коммита в новом месте cherry picking —
означающая взять лучшее и оставить все остальное

Cherry Pick

1

4

2

3

master

HEAD

f2

5

Слайд 171

Позволяет создать копию изменений произвольного коммита в новом месте
cherry picking — идиома,

Позволяет создать копию изменений произвольного коммита в новом месте cherry picking —
означающая взять лучшее и оставить все остальное

Cherry Pick

4

master

HEAD

3’

2

3

f2

5

1

Слайд 172

Задание 9. Hot Rebase
Задание 10. Reflog

Задание 9. Hot Rebase Задание 10. Reflog

Слайд 173

S1. Все локально

A1. Трехсторонний merge в три шага

A2. rebase, cherry-pick и amend, чтобы

S1. Все локально A1. Трехсторонний merge в три шага A2. rebase, cherry-pick
пересоздать историю

S2. Хранятся состояния директории, постепенная сборка коммита

S3. Манипуляции через ссылки, нет ссылки — в мусор

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

Слайд 174

R1. Доступен fetch коммитов любого репозитория в любой момент

R1. Доступен fetch коммитов любого репозитория в любой момент

Слайд 175

Клонирование

https://repos/repo

git clone https://repos/repo

Клонирование https://repos/repo git clone https://repos/repo

Слайд 176

origin

https://repos/repo

origin = https://repos/repo

git clone https://repos/repo

origin https://repos/repo origin = https://repos/repo git clone https://repos/repo

Слайд 177

remote

https://repos/repo

origin = https://repos/repo

remote https://repos/repo origin = https://repos/repo

Слайд 178

Таблица remote

https://repos/repo

origin = https://repos/repo arnold = https://arnold/repo

https://arnold/repo

Список «кликух» для дружественных репозиториев

Таблица remote https://repos/repo origin = https://repos/repo arnold = https://arnold/repo https://arnold/repo Список «кликух» для дружественных репозиториев

Слайд 179

Remote в Git Extensions

Remote в Git Extensions

Слайд 180

Remote в Git Extensions

Remote в Git Extensions

Слайд 181

Remote в консоли

Remote в консоли

Слайд 182

Обмен изменениями

1

master

Обмен изменениями 1 master

Слайд 183

Появился клон

1

master

1

master

origin/master

Появился клон 1 master 1 master origin/master

Слайд 184

Прошло время

1

f1

2

3

master

4

5

1

f2

6

master

7

8

origin/master

Прошло время 1 f1 2 3 master 4 5 1 f2 6 master 7 8 origin/master

Слайд 185

А что если в правый добавить из левого?

1

f1

2

3

master

4

5

1

f2

6

master

7

8

origin/master

А что если в правый добавить из левого? 1 f1 2 3

Слайд 186

А что если в правый добавить из левого?

origin/f1

2

3

origin/master

4

5

1

f2

6

master

7

8

А что если в правый добавить из левого? origin/f1 2 3 origin/master

Слайд 187

fetch – операция получения изменений из другого репозитория
Это безопасная операция за счет

fetch – операция получения изменений из другого репозитория Это безопасная операция за
неизменности истории
В коммитах может быть «каша», но это уже отдельный вопрос
Fetch ничего не меняет, просто позволяет взглянуть шире: на изменения из других репозиториев, а не только на локальные
Можно сделать fetch из любого репозитория, даже если нет общих коммитов

Fetch

Слайд 188

Все же, что здесь делать?

origin/f1

2

3

origin/master

4

5

1

f2

6

master

7

8

Все же, что здесь делать? origin/f1 2 3 origin/master 4 5 1

Слайд 189

Rebase локальной ветки

origin/f1

2

3

origin/master

4

5

1

f2

7

8

6’

master

Rebase локальной ветки origin/f1 2 3 origin/master 4 5 1 f2 7 8 6’ master

Слайд 190

Теперь все хорошо

origin/f1

2

3

origin/master

4

5

1

f2

7

8

6’

master

Теперь все хорошо origin/f1 2 3 origin/master 4 5 1 f2 7 8 6’ master

Слайд 191

Задание 11. Fetch From Remote Задание 12. Interactive Rebase
Задание 13. Cherry Pick

Задание 11. Fetch From Remote Задание 12. Interactive Rebase Задание 13. Cherry Pick

Слайд 192

S1. Все локально

A1. Трехсторонний merge в три шага

A2. rebase, cherry-pick и amend, чтобы

S1. Все локально A1. Трехсторонний merge в три шага A2. rebase, cherry-pick
пересоздать историю

S2. Хранятся состояния директории, постепенная сборка коммита

S3. Манипуляции через ссылки, нет ссылки — в мусор

R1. Доступен fetch коммитов любого репозитория в любой момент

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

Слайд 193

R2. Удаленное изменение — это push

R2. Удаленное изменение — это push

Слайд 194

Надо отправить изменения

origin/f1

2

3

origin/master

4

5

1

f2

7

8

6’

master

Надо отправить изменения origin/f1 2 3 origin/master 4 5 1 f2 7 8 6’ master

Слайд 195

Применим push

origin/f1

2

3

origin/master

4

5

1

f2

7

8

6’

master

Применим push origin/f1 2 3 origin/master 4 5 1 f2 7 8 6’ master

Слайд 196

Применим push

2

3

origin/master

1

6’

master

Раз master можно влить в origin/master через fast-forward merge, то push будет успешным

Применим push 2 3 origin/master 1 6’ master Раз master можно влить

Слайд 197

Отправляет коммиты в удаленный репозиторий
Сдвигает ветки в удаленном репозитории
Требует права на запись

Отправляет коммиты в удаленный репозиторий Сдвигает ветки в удаленном репозитории Требует права
в удаленный репозиторий, а следовательно некий способ аутентификации

Push

Слайд 198

Удаление ветки – это тоже push, только другой
git push -d
В

Удаление ветки – это тоже push, только другой git push -d В
Git Extensions разница между удалением локальной и удаленной ветки особо не чувствуется

Удаление удаленной удаленки ветки

Слайд 199

Добавление или удаление тегов в удаленном репозитории — это тоже push
git push

Добавление или удаление тегов в удаленном репозитории — это тоже push git
tag
git push --tags
git push -d

Теги в удаленном репозитории

Слайд 200

Ситуация без rebase

origin/f1

2

3

origin/master

4

5

1

f2

6

master

7

8

Ситуация без rebase origin/f1 2 3 origin/master 4 5 1 f2 6 master 7 8

Слайд 201

Fast-Forward Merge невозможен

2

3

origin/master

1

6

master

Fast-Forward Merge невозможен 2 3 origin/master 1 6 master

Слайд 202

Force Push может помочь…

2

3

origin/master

1

6

master

Force Push может помочь… 2 3 origin/master 1 6 master

Слайд 203

Force Push заставит ветку сдвинуться

2

3

origin/master

1

6

master

Force Push заставит ветку сдвинуться 2 3 origin/master 1 6 master

Слайд 204

Force Push заставит ветку сдвинуться

2

3

origin/master

1

6

master

Коммиты будут потеряны

Если их использовали – за тобой

Force Push заставит ветку сдвинуться 2 3 origin/master 1 6 master Коммиты
придут…

Слайд 205

Никогда не делай Force Push в master

Со своими ветками делай что хочешь

Никогда не делай Force Push в master Со своими ветками делай что хочешь

Слайд 206

Реалистичный пример

Реалистичный пример

Слайд 207

Картина мира первого разработчика

2

3

origin/master

1

2’, 3’

master

Картина мира первого разработчика 2 3 origin/master 1 2’, 3’ master

Слайд 208

Картина мира второго разработчика

f3

2

3

master

9

1

origin/master

Картина мира второго разработчика f3 2 3 master 9 1 origin/master

Слайд 209

Худшие ожидания второго

f3

2

3

master

9

1

10

origin/master

Легко решается:
FF merge для master
rebase f3 на master или merge

Худшие ожидания второго f3 2 3 master 9 1 10 origin/master Легко
f3 в master

Слайд 210

Но первый делает подлянку

2

3

origin/master

1

2’, 3’

master

Но первый делает подлянку 2 3 origin/master 1 2’, 3’ master

Слайд 211

Что видит второй после fetch

f3

2

3

master

9

1

origin/master

2’, 3’

Неожиданный подарок:
для master невозможен merge
для f3 возможен

Что видит второй после fetch f3 2 3 master 9 1 origin/master
только rebase
Лишняя возня из-за первого, перед тем как влить свою работу в master

Слайд 212

А что если второй будет быстрее?

f3

2

3

master

9

1

origin/master

А что если второй будет быстрее? f3 2 3 master 9 1 origin/master

Слайд 213

Вольет свою ветку в master и запушит?

f3

2

3

master

9

1

origin/master

Работа сделана!
Можно радовать менеджера и идти домой!

Вольет свою ветку в master и запушит? f3 2 3 master 9

Слайд 214

Затем первый в неведении делает подлянку

2

3

origin/master

1

2’, 3’

master

Затем первый в неведении делает подлянку 2 3 origin/master 1 2’, 3’ master

Слайд 215

Итоговая картина

origin/f3

2

3

9

1

origin/master

2’, 3’

master

Итоговая картина origin/f3 2 3 9 1 origin/master 2’, 3’ master

Слайд 216

Итоговая картина

origin/f3

2

3

9

1

origin/master

2’, 3’

master

Изменения второго разработчика не влиты и он похоже об этом

Итоговая картина origin/f3 2 3 9 1 origin/master 2’, 3’ master Изменения
узнает только после неудачного релиза...

Слайд 217

Итоговая картина

origin/f3

2

3

9

1

origin/master

2’, 3’

master

Изменения второго разработчика не влиты и он похоже об этом

Итоговая картина origin/f3 2 3 9 1 origin/master 2’, 3’ master Изменения
узнает только после неудачного релиза...

Слайд 218

Пристальный взгляд на проблему

2

3

9

1

origin/master

2’, 3’

master

origin/master

Пристальный взгляд на проблему 2 3 9 1 origin/master 2’, 3’ master origin/master

Слайд 219

Пристальный взгляд на проблему

2

3

9

1

origin/master

2’, 3’

master

origin/master

Надо запрещать Force Push,
когда origin/master сдвинут!
Force Push With

Пристальный взгляд на проблему 2 3 9 1 origin/master 2’, 3’ master
Lease так и работает
Lease — англ. Аренда

Слайд 220

Никогда не делай Force Push
Не делай Force Push With Lease в master

Со

Никогда не делай Force Push Не делай Force Push With Lease в
своими ветками делай что хочешь, но используй Force Push With Lease

Слайд 221

Удобный алиас

git config --global alias.please "push --force-with-lease"

Удобный алиас git config --global alias.please "push --force-with-lease"

Слайд 222

Задание 14. Push

Задание 14. Push

Слайд 223

S1. Все локально

A1. Трехсторонний merge в три шага

R2. Удаленное изменение — это push

A2. rebase,

S1. Все локально A1. Трехсторонний merge в три шага R2. Удаленное изменение
cherry-pick и amend, чтобы пересоздать историю

S2. Хранятся состояния директории, постепенная сборка коммита

S3. Манипуляции через ссылки, нет ссылки — в мусор

R1. Доступен fetch коммитов любого репозитория в любой момент

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

Слайд 224

R3. Явное сопоставление локальных веток с upstream

R3. Явное сопоставление локальных веток с upstream

Слайд 225

Upstream repository

GitHub

Upstream repository GitHub

Слайд 226

Upstream repository

GitHub

Upstream repository GitHub

Слайд 227

Никак – надо всегда прописывать обе ветки явно
Должно совпадать имя
Есть внутренняя таблица

Никак – надо всегда прописывать обе ветки явно Должно совпадать имя Есть
сопоставления
Git использует все способы, режим сопоставления можно настраивать

Как push понимает какую ветку сдвигать?

Слайд 228

Для основного репозитория
Используется сопоставление из таблицы
При push новой ветки достаточно указать намерение git

Для основного репозитория Используется сопоставление из таблицы При push новой ветки достаточно
push –u origin HEAD
Чтобы создать локальную ветку для удаленной с записью в таблицу достаточно на нее перейти git checkout
Для других репозиториев идет сопоставление по имени ветки можно не запоминать

По умолчанию режим simple

Слайд 229

Как создать привязку для f1?

origin/f1

2

3

origin/master

4

5

1

f2

7

8

6’

master

Перейти на ветку

Как создать привязку для f1? origin/f1 2 3 origin/master 4 5 1

Слайд 230

Как создать привязку для f2?

origin/f1

2

3

origin/master

4

5

1

f2

7

8

6’

master

push -u

Как создать привязку для f2? origin/f1 2 3 origin/master 4 5 1

Слайд 231

Удобный алиас

git config --global alias.pushup "push -u origin HEAD"

Удобный алиас git config --global alias.pushup "push -u origin HEAD"

Слайд 232

Upstream mapping в Git Extensions

Upstream mapping в Git Extensions

Слайд 233

Upstream mapping в консоли

Local branch

Upstream branch

Remote name

Upstream mapping в консоли Local branch Upstream branch Remote name

Слайд 234

git pull origin =
git fetch + git merge origin/
git pull --rebase origin

git pull origin = git fetch + git merge origin/ git pull
=
git fetch + git rebase origin/
Pull нужно знать с какой веткой делать merge или rebase и здесь тоже нужно сопоставление веток

Pull тоже использует upstream mapping

Слайд 235

Либо fast-forward merge, либо без merge
С помощью опций:
pull --ff-only
Установить для pull по

Либо fast-forward merge, либо без merge С помощью опций: pull --ff-only Установить
умолчанию:
git config --global pull.ff only

Безопасный pull

Слайд 236

Удобный алиас

git config --global alias.pure "pull --rebase --autostash"

Удобный алиас git config --global alias.pure "pull --rebase --autostash"

Слайд 237

Задание 15. Upstream

Задание 15. Upstream

Слайд 238

S1. Все локально

A1. Трехсторонний merge в три шага

R2. Удаленное изменение — это push

A2. rebase,

S1. Все локально A1. Трехсторонний merge в три шага R2. Удаленное изменение
cherry-pick и amend, чтобы пересоздать историю

S2. Хранятся состояния директории, постепенная сборка коммита

S3. Манипуляции через ссылки, нет ссылки — в мусор

R3. Явное сопоставление локальных веток с upstream

R1. Доступен fetch коммитов любого репозитория в любой момент

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

Слайд 239

A3. stash, reset, revert для управления изменениями

Изменения можно временно припрятать
Можно получить разницу между

A3. stash, reset, revert для управления изменениями Изменения можно временно припрятать Можно
любыми коммитами
Коммит можно отменить другим коммитом

Слайд 240

Что произойдет при влитии f1 в f2?

Что произойдет при влитии f1 в f2?

Слайд 241

Произойдет конфликт

Произойдет конфликт

Слайд 242

Что произойдет при влитии f1 в f2?

Что произойдет при влитии f1 в f2?

Слайд 243

Бесконфликтное слияние

Бесконфликтное слияние

Слайд 244

Почему?

Почему?

Слайд 245

Состояния слева и справа совпадают

ABC

ABC

ABC

f1

f2

А история не имеет значения

Состояния слева и справа совпадают ABC ABC ABC f1 f2 А история не имеет значения

Слайд 246

Каждый коммит хранит структуру каталога и все файлы состояния директории
Хранение файлов оптимизировано:

Каждый коммит хранит структуру каталога и все файлы состояния директории Хранение файлов
файлы не хранятся повторно, потому что в структуре каталога хранятся не сами файлы, а ссылки по хэшу на них
Используется сжатие, чтобы текстовые данные занимали меньше места
Разница между коммитами вычисляется на лету и с родителем и с любым другим коммитом

Хранятся файлы, разница вычисляется на лету

Слайд 247

Diff можно получить между любыми коммитами

2

3

1

5

6

4

Diff можно получить между любыми коммитами 2 3 1 5 6 4

Слайд 248

Diff можно получить между любыми коммитами

2

3

1

5

6

4

A.txt
B.txt
D.txt

A.txt
C.txt
D.txt

A.txt
D.txt

Diff можно получить между любыми коммитами 2 3 1 5 6 4

Слайд 249

Что изменится при переходе от 4 к 6?

2

3

1

5

6

4

A.txt
B.txt
D.txt

A.txt
C.txt
D.txt

A.txt
D.txt

diff по сравнению с 4
-B.txt
+C.txt

Что изменится при переходе от 4 к 6? 2 3 1 5

Слайд 250

Что изменится при переходе от 6 к 4?

2

3

1

5

6

4

A.txt
B.txt
D.txt

A.txt
C.txt
D.txt

A.txt
D.txt

diff по сравнению с 6
+B.txt
-C.txt

Что изменится при переходе от 6 к 4? 2 3 1 5

Слайд 251

reset --hard

HEAD

f1

HEAD

f1

reset --hard HEAD f1 HEAD f1

Слайд 252

Переносит ветку вслед за HEAD
Выставляет индекс и директорию согласно коммиту, устраняет разницу

reset

Переносит ветку вслед за HEAD Выставляет индекс и директорию согласно коммиту, устраняет разницу reset --hard
--hard

Слайд 253

reset --hard

A.txt

B.txt

A.txt

A.txt

A.txt

reset --hard A.txt B.txt A.txt A.txt A.txt B.txt B.txt B.txt
B.txt

B.txt

B.txt

Слайд 255

reset --mixed

HEAD

f1

HEAD

f1

reset --mixed HEAD f1 HEAD f1

Слайд 256

Переносит ветку вслед за HEAD
Задает индекс согласно коммиту
Оставляет разницу между исходным и

Переносит ветку вслед за HEAD Задает индекс согласно коммиту Оставляет разницу между
новым состоянием в директории

reset --mixed

Слайд 257

reset --mixed

A.txt

B.txt

A.txt

A.txt

A.txt

reset --mixed A.txt B.txt A.txt A.txt A.txt B.txt B.txt A.txt Δ WD:
B.txt

B.txt

A.txt

Δ WD: +A, -B

Δ CI: +-

Слайд 258

Working directory changes

Commit index changes

Working directory changes Commit index changes

Слайд 259

reset --soft

HEAD

f1

HEAD

f1

reset --soft HEAD f1 HEAD f1

Слайд 260

Переносит ветку вслед за HEAD
Не задает ни индекс, ни директорию согласно коммиту
Оставляет

Переносит ветку вслед за HEAD Не задает ни индекс, ни директорию согласно
разницу между исходным и новым состоянием в индексе и директории

reset --soft

Слайд 261

reset --soft

A.txt

B.txt

A.txt

A.txt

A.txt

reset --soft A.txt B.txt A.txt A.txt A.txt B.txt A.txt A.txt Δ WD:
B.txt

A.txt

A.txt

Δ WD: +-

Δ CI: +A, -B

Слайд 262

Working directory changes

Commit index changes

Working directory changes Commit index changes

Слайд 263

Удобный алиас

git config --global alias.undo "reset --soft HEAD^"

Удобный алиас git config --global alias.undo "reset --soft HEAD^"

Слайд 264

Тайник для временного сохранения изменений После сохраненные изменения можно восстановить в том же или

Тайник для временного сохранения изменений После сохраненные изменения можно восстановить в том
в другом месте
Работает по принципу стека: push, pop
Можно применять сохраненные изменения неоднократно

Stash

Слайд 265

Неудачные изменения одного коммита можно отменить противоположными изменениями в следующем коммите

Revert

+

master

HEAD

Неудачные изменения одного коммита можно отменить противоположными изменениями в следующем коммите Revert + master HEAD

Слайд 266

Неудачные изменения одного коммита можно отменить противоположными изменениями в следующем коммите

Revert

+

-

master

HEAD

Неудачные изменения одного коммита можно отменить противоположными изменениями в следующем коммите Revert + - master HEAD

Слайд 267

Неудачные изменения одного коммита можно отменить противоположными изменениями в следующем коммите

Revert

+

-

master

HEAD

master

HEAD

Одинаковые

Неудачные изменения одного коммита можно отменить противоположными изменениями в следующем коммите Revert

Слайд 268

Revert полезен,
когда надо отменить изменение,
а перестраивать историю нельзя

Revert полезен, когда надо отменить изменение, а перестраивать историю нельзя

Слайд 269

Задание 16. Stash Задание 17. Hard Reset Задание 18. Soft Reset

Задание 16. Stash Задание 17. Hard Reset Задание 18. Soft Reset

Слайд 270

S1. Все локально

A1. Трехсторонний merge в три шага

R2. Удаленное изменение — это push

A2. rebase,

S1. Все локально A1. Трехсторонний merge в три шага R2. Удаленное изменение
cherry-pick и amend, чтобы пересоздать историю

A3. stash, reset, revert для управления изменениями

S2. Хранятся состояния директории, постепенная сборка коммита

S3. Манипуляции через ссылки, нет ссылки — в мусор

R3. Явное сопоставление локальных веток с upstream

R1. Доступен fetch коммитов любого репозитория в любой момент

H1. Гибкое конфигурирование и качественная документация

Structure

Actions

Remote

Слайд 271

Разное

Разное

Слайд 272

Что такое Pull Request

GitHub

Что такое Pull Request GitHub

Слайд 273

Изменения в локальном репозитории

GitHub

f1

Изменения в локальном репозитории GitHub f1

Слайд 274

Отправка изменений в свой удаленный

GitHub

f1

f1

Отправка изменений в свой удаленный GitHub f1 f1

Слайд 275

PR – запрос на fetch + merge

GitHub

f1

f1

PR – запрос на fetch + merge GitHub f1 f1

Слайд 276

Если PR принят, то fetch

GitHub

f1

f1

f1

Если PR принят, то fetch GitHub f1 f1 f1

Слайд 277

Если PR принят, то merge

GitHub

f1

f1

master

Если PR принят, то merge GitHub f1 f1 master

Слайд 278

Что такое Merge Request

GitLab

Что такое Merge Request GitLab

Слайд 279

Изменения в локальном репозитории

GitLab

f1

Изменения в локальном репозитории GitLab f1

Слайд 280

Отправка изменений в удаленный

GitLab

f1

f1

Отправка изменений в удаленный GitLab f1 f1

Слайд 281

MR – запрос на merge

GitLab

f1

f1

MR – запрос на merge GitLab f1 f1

Слайд 282

Если MR принят, то merge

GitLab

f1

master

Если MR принят, то merge GitLab f1 master

Слайд 283

Картина для централизованного репозитория

https://repos/repo

https://arnold/repo

https://brayan/repo

Здесь создаются коммиты

Этот репозиторий обрабатывает пуши и отдает наработки при фетчах

Картина для централизованного репозитория https://repos/repo https://arnold/repo https://brayan/repo Здесь создаются коммиты Этот репозиторий

Слайд 284

Получить последние изменения
Создать локальную ветку
Разработать в ней фичу
Получить последние изменения
Влить мастер в

Получить последние изменения Создать локальную ветку Разработать в ней фичу Получить последние
свою ветку (опционально)
Влить свою ветку в мастер
Запушить (если кто-то успел запушить раньше, то повторить 4-7)

Алгоритм для разработчика

Слайд 286

Надо подключить Git к папке, в который ты делаешь тестовое задание

Надо подключить Git к папке, в который ты делаешь тестовое задание

Слайд 287

Надо загрузить локальный репозиторий с тестовым заданием на GitHub для проверки

Надо загрузить локальный репозиторий с тестовым заданием на GitHub для проверки

Слайд 288

Надо подключиться к разработке сервиса в отдельном репозитории

Надо подключиться к разработке сервиса в отдельном репозитории

Слайд 289

Надо начать разработку новой фичи

Надо начать разработку новой фичи

Слайд 290

Сделаны некоторые изменения, надо их сохранить в репозитории

Сделаны некоторые изменения, надо их сохранить в репозитории

Слайд 291

Ты забыл добавить кое-что в последний коммит, а надо

Ты забыл добавить кое-что в последний коммит, а надо

Слайд 292

Надо сделать так, чтобы новая фича была доступна для тестирования

Надо сделать так, чтобы новая фича была доступна для тестирования

Слайд 293

Тестировщик попросил, чтобы последние исправления из master тоже были в ветке с фичей

Тестировщик попросил, чтобы последние исправления из master тоже были в ветке с фичей

Слайд 294

При влитии исправлений из master возникли конфликты

При влитии исправлений из master возникли конфликты

Слайд 295

Пора сделать релиз фичи, у вас фичи релизятся из master

Пора сделать релиз фичи, у вас фичи релизятся из master

Слайд 296

Надо помочь другому разработчику сделать фичу

Надо помочь другому разработчику сделать фичу

Слайд 297

За день ты сделал некоторые изменения и решил ими поделиться

За день ты сделал некоторые изменения и решил ими поделиться

Слайд 298

Оказалось, что твой напарник тоже сделал изменения Надо их получить, а затем опубликовать свои изменения

Оказалось, что твой напарник тоже сделал изменения Надо их получить, а затем опубликовать свои изменения

Слайд 299

На следующий день ты продолжил работать над фичей, но тебя срочно попросили починить опечатку прямо

На следующий день ты продолжил работать над фичей, но тебя срочно попросили
в master ЧТО ТВОРЯТ =/

Слайд 300

Ты поправил опечатку, закоммитил в master и получил изменения в origin/master Ты решил переключиться

Ты поправил опечатку, закоммитил в master и получил изменения в origin/master Ты
на origin/master, Git Extension предложил сделать reset master на origin/master, а ты машинально согласился…

Слайд 301

Ты вернулся к фиче, которую делал с другим разработчиком

Ты вернулся к фиче, которую делал с другим разработчиком

Слайд 302

У твоего напарника сегодня выходной Ты доделал изменения, о которых вы договаривались Их надо сохранить

У твоего напарника сегодня выходной Ты доделал изменения, о которых вы договаривались
перед тем, как переходить к следующей задаче

Слайд 303

Ты начал делать новую задачу и сделал первый коммит Но понял, что забыл завести

Ты начал делать новую задачу и сделал первый коммит Но понял, что
ветку, а коммит ушел в master

Слайд 304

Разработка не клеилась… Ты сделал десяток коммитов, перед тем как понял, как решать задачу Чтобы

Разработка не клеилась… Ты сделал десяток коммитов, перед тем как понял, как
избежать позора, ты решил заменить эти коммиты на один

Слайд 305

Чтобы список веток был коротким, ты решил удалить влитые локальные ветки

Чтобы список веток был коротким, ты решил удалить влитые локальные ветки

Слайд 306

Бурная неделя закончилась Пора отдыхать!

Бурная неделя закончилась Пора отдыхать!
Имя файла: Git-–-популярная-система-контроля-версий.pptx
Количество просмотров: 56
Количество скачиваний: 0