Система контроля версий. Файлы находятся в трех состояниях - зафиксированном, измененном и подготовленном.
Внутри коммита содержится следующее дерево:
Каждый коммит имеет ссылку на предшествующий. История коммитов - односвязный список.
Ветка - это указатель на коммит. Это файл, содержащий 40 символов контрольной суммы SHA-1 того коммита, на который он указывает. Создание новой ветки - это запись 41 байта в файл (40 знаков и перевод строки).
Git хранит указатель HEAD на коммит, на котором находится пользователь. Если в текущую ветку ветку добавляется новый
коммит, HEAD сдвигается на него вместе с указателем ветки. Комманда checkout
переводит HEAD на другой коммит.
Файл с описанием игнорируемых частей репозитория. Можно использовать glob
шаблоны.
Команды git бывают двух видов. Git pull, git rebase и git clone используются постоянно. Другие - реже. О них ниже.
Позволяет просмотреть непроиндексированные изменения.
То, что войдет в следующий коммит.
Информация о коммитах, датах и авторах.
История коммитов, начиная с самого свежего.
Показывает изменения последних коммитов. Здесь n - число коммитов.
Статистика изменений файлов последних коммитов. Показывает, сколько строк было доавлено и удалено.
Показывает, какие коммиты есть в branch2, но не в branch1. Удобно смотреть, какие коммиты еще не смержены из тематической ветки в основную.
Показывает, какие коммиты будут отправлены в удаленный репозиторий при следующем git push
"Журнал" ссылок. История, куда указывали HEAD и ветки.
Показывает историю перемещений указателя HEAD. Включает ребейзы, мержи.
Позволяет переместить указатель HEAD на ветку, коммит или действие.
Перемещает HEAD на локальное действие под номером number из локального "журнала". См. Reflog
Операции с ветками в удаленном репозитории
Показывает список удаленных репозиториев. Затем по каждому из них можно увидеть данные: какие ветки есть на сервере и локально, какая разница в коммитах между ними.
Теги бывают легковесные и аннотированные. Вторые содержат информацию об авторе тега, дате и сообщение.
Показывает все доступные метки. Можно фильтровать.
Создание легковесной метки.
Создание аннотированной метки.
Отправить метку на сервер.
Для часто выполняемых команд можно назначать сокращения - алиасы.
Например, git config --global alias.cm commit
. Если заменяемых комманд несколько, их нужно взять в одинарные ковычки.
Merge выполянется по-разному в двух ситуациях:
- История линейна. Нужно выполнить merge с текущего указателя до последнего коммита в ветке. Тогда автоматически
используется флаг
--fast-forwarding
и текущий указатель перематывается до конца ветки. - История разветвленная. В этом случае git производит трехстороннее слияние, самостоятельно выбирая общего предка. Изменения с двух веток добавляются в новый коммит - коммит слияния.
Когда два в сливаемых ветках изменены одинаковые части одного и того же кода, необходимо вручную решать конфликты.
<<<<<<< HEAD:index.html <!-- HEAD указывает на ветку, в которую производится слитие -->
<div id="footer">contact : email.support@github.com</div>
======= <!-- Разделение конфликтных зон -->
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html <!-- Ветка, которую сливают -->
Можно вручную отредактировать проблемные участки. Можно использовать IDEA.
Команда выполняет перебазирование. Берется общий родительский коммит. Дельты коммитов, идущих после, по очереди применяются к последнему коммиту текущей ветки. В случае, когда конфликтов не будет, коммиты двух веток будут совпадать. В противном случае, коммиты в двух ветках, для которых были решены конфликты, будут различаться.
Отслеживать удаленную ветку из локальной можно с помощью флага -u: git branch -u origin/<name>
. Здесь -u означает
--set-upstream
Команда git fetch
загрузит изменения из удаленного репозитория, но не изменит рабочую директорию. Это позволяет
выполнить merge самостоятельно.
Команда git pull
выполняет git fetch и, затем, git merge.
Команда выполняет git fetch и git rebase, вместо merge. История коммитов чище.
Каждый коммит имеет уникальный номер - SHA-1. Он состоит из 40 символов или 20 байт. Для идентификации коммита в репозитории достаточно менее 20 символов. Минимально - 7. Если коммитов много и существуют несколько, у которых первые 7 знаков совпадают, берется 8. Если 8 совпадает - 9. И так далее.
В git используются
Указатель на родителя. Можно добавлять как к номеру коммита - sh24fa2^, так и к указателю - develop^, HEAD^. Если родителей несколько (ветвление), можно указывать номер родителя - ^2, ^3 и т.д.
Тоже указатель на родителя, но запись ~2 укажет на родителя родителя. ~5 - 5 коммитов назад.
Система поддерживает возможность делать композиции из репозиториев.
Данный вид иерархической структуры позволяет включать в репозиторий ссылки на другие репозитории. Например,
репозиторий A имеет submodule B. При git push
в B репозиторий A никак не изменится. Чтобы подтянуть изменения
из B, необходимо в A выполнить git submodule update
. По сути submodule - указатель на конкретный коммит в другом
репозитории.
По сравнению с предыдущим, этот вид включает в себя репозиторий целиком, как копию, со всей ее историей. Изменения в "скопированном" репозитории будут доступны сразу. Также, размер репозитория увеличится на размер subtree.