kbook


Project maintained by atilla777 Hosted on GitHub Pages — Theme by mattgraham
Git
Главная страница

Git - общие сведения

В папке проекта приложения, находящегося под контролем git (в которой инициализирован git репозиторий) содержатся

Каждый объект сохраняется в папке, помещенной в папку objects и название которой состоит из двух букв хэша (SHA-1) объекта. Сам объект помещается в файл имя которого состоит из остальных символов хэша объекта. Посмотреть содержимое объекта можно командой

git show <первые четыре символа хэша объекта>

Объекты хранятся в двоичном виде, что, при сохранении разных версий файла позволяет сохранять только разницу между этими двумя файлами.

Деревья

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

При каждом новом комете создается новое дерево в котором зафиксировано состояние депозитария на момент комита. Дерево представляет собой папку файловой системы и содержит информацию о содержащихся в них других деревьев (папок), а также blob объектов (файлов). Каждое дерево содержит следующую информацию о входящих в нее объектах

Просмотр содержимого дерева

git ls-tree хэш

Комиты

Каждый комит содержит следующую информацию

В файле HEAD хранится ссылка на файл текущей ветки. В свою очередь в файле refs/head/ветка хранится хэш текущего комита (то есть то, куда реально ссылается HEAD). При переключении между ветками (git checkout ветка) происходит изменение ссылки в HEAD на последний комит в заданной ветке (ссылка в файле refs/head/ветка). Если переключится с одной ветки на другую до того как сделать комит, то, если конфликта в изменениях нет, то изменения в рабочей папке перейдут в ветку на которую (git checkout ветка) происходит изменение ссылки в HEAD на последний комит в заданной ветке (ссылка в файле refs/head/ветка).

Если переключится с одной ветки на другую до того как сделать комит, то

В результате такого слияния будет создан новый комит у которого 3 предка (общий комит предок для двух сливаемых веток и последние комиты каждой из сливаемых веток). Если при таком слияние происходит конфликт, комит не произойдет. Список файлов в которых имеются конфликты можно посмотреть командой (они будут помечены как unmerged)

git status

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

git аdd .

и зафиксировать комит слияния:

git commit -m “сообщение”

При слиянии конфликт не происходит, если меняются разные файлы и/или меняются разные строки в одном файле.

Перенос (rebase)

Команда

git rebase <новая основа (ветка)>

позволяет создать линейную историю комитов при слиянии двух веток с общим предком. При переносе прямым предком текущей ветки (допустим feature) становится ветка, указанная в качестве параметра команды rebase (допустим master). При этом в истории текущей ветки (feauture) создаются новые комиты, добавляющие все изменения текущей втеки от общего c новой базой (master) предка (этот предок по сути является старой базой текущей ветки). После переноса базы можно слить ветку, ставшую новой базой (mater), с веткой (feature) способом Fast Forward (git merge feature). При таком переносе история ветвления теряется, хотя результат будет тот же что и у трехходового способа слияния с помощью git merge. Так как при rebase создается новая история комитов, воспроизводящих отличия текущей ветки от новой базы, то при каждом таком новом комите возможны ситуации конфликтов, после разрешения которых нужно продолжить reabase командой:

git rebase --continue

Удаленные (remote) репозитории

Для создания общего репозитория используется опция –bare (пустой). Имя такого репозитория по соглашению должно заканчиваться на .git:

git init --bare имя.git

Особенности общего (bare) репозитория

Просмотр имен удаленных репозиториев

git remote

Добавление удаленного репозитория (будет изменен файл .git/config)

git remote add имя путь

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

git clone путь

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

git config --global push.default simple

При отслеживании удаленного репазитория в локальном репазитории создается соответствующая ветка типа репазиторий/ветка. Таким образом при работе с удаленным репазиторием существуют три синхронизирующееся ветки

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

git branch –r

Посмотреть информацию об удаленных ветках и их связях с локальными

git remote show репазиторий

Получить изменения (новые комиты) из удаленного репазитория можно двумя способами