Skip to content

Latest commit

 

History

History

git

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Git

Система контроля версий. Файлы находятся в трех состояниях - зафиксированном, измененном и подготовленном.

commit

Внутри коммита содержится следующее дерево:

Коммит

Каждый коммит имеет ссылку на предшествующий. История коммитов - односвязный список. Коммит

Branch

Ветка - это указатель на коммит. Это файл, содержащий 40 символов контрольной суммы SHA-1 того коммита, на который он указывает. Создание новой ветки - это запись 41 байта в файл (40 знаков и перевод строки).

HEAD

Git хранит указатель HEAD на коммит, на котором находится пользователь. Если в текущую ветку ветку добавляется новый коммит, HEAD сдвигается на него вместе с указателем ветки. Комманда checkout переводит HEAD на другой коммит.

.gitignore

Файл с описанием игнорируемых частей репозитория. Можно использовать glob шаблоны.

Команды

Команды git бывают двух видов. Git pull, git rebase и git clone используются постоянно. Другие - реже. О них ниже.

git diff

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

git diff --staged [--cached]

То, что войдет в следующий коммит.

log

Информация о коммитах, датах и авторах.

git log

История коммитов, начиная с самого свежего.

git log -p -n

Показывает изменения последних коммитов. Здесь n - число коммитов.

git log --stat

Статистика изменений файлов последних коммитов. Показывает, сколько строк было доавлено и удалено.

git log ..

Показывает, какие коммиты есть в branch2, но не в branch1. Удобно смотреть, какие коммиты еще не смержены из тематической ветки в основную.

git log origin/develop HEAD

Показывает, какие коммиты будут отправлены в удаленный репозиторий при следующем git push

reflog

"Журнал" ссылок. История, куда указывали HEAD и ветки.

git reflog

Показывает историю перемещений указателя HEAD. Включает ребейзы, мержи.

checkout

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

git checkout HEAD@{}

Перемещает HEAD на локальное действие под номером number из локального "журнала". См. Reflog

remote

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

git remote show

Показывает список удаленных репозиториев. Затем по каждому из них можно увидеть данные: какие ветки есть на сервере и локально, какая разница в коммитах между ними.

tag

Теги бывают легковесные и аннотированные. Вторые содержат информацию об авторе тега, дате и сообщение.

git tag

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

git tag

Создание легковесной метки.

git tag -a -m <"Message">

Создание аннотированной метки.

git push origin

Отправить метку на сервер.

alias

Для часто выполняемых команд можно назначать сокращения - алиасы.

git config --global alias.

Например, git config --global alias.cm commit. Если заменяемых комманд несколько, их нужно взять в одинарные ковычки.

merge

Merge выполянется по-разному в двух ситуациях:

  • История линейна. Нужно выполнить merge с текущего указателя до последнего коммита в ветке. Тогда автоматически используется флаг --fast-forwarding и текущий указатель перематывается до конца ветки.
  • История разветвленная. В этом случае git производит трехстороннее слияние, самостоятельно выбирая общего предка. Изменения с двух веток добавляются в новый коммит - коммит слияния.
merge conflict

Когда два в сливаемых ветках изменены одинаковые части одного и того же кода, необходимо вручную решать конфликты.

<<<<<<< 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.

rebase

Команда выполняет перебазирование. Берется общий родительский коммит. Дельты коммитов, идущих после, по очереди применяются к последнему коммиту текущей ветки. В случае, когда конфликтов не будет, коммиты двух веток будут совпадать. В противном случае, коммиты в двух ветках, для которых были решены конфликты, будут различаться.

branch

Отслеживать удаленную ветку из локальной можно с помощью флага -u: git branch -u origin/<name>. Здесь -u означает --set-upstream

fetch

Команда git fetch загрузит изменения из удаленного репозитория, но не изменит рабочую директорию. Это позволяет выполнить merge самостоятельно.

pull

Команда git pull выполняет git fetch и, затем, git merge.

git pull -r (--rebase)

Команда выполняет git fetch и git rebase, вместо merge. История коммитов чище.

Общее

Уникальность коммитов

Каждый коммит имеет уникальный номер - SHA-1. Он состоит из 40 символов или 20 байт. Для идентификации коммита в репозитории достаточно менее 20 символов. Минимально - 7. Если коммитов много и существуют несколько, у которых первые 7 знаков совпадают, берется 8. Если 8 совпадает - 9. И так далее.

Спецсимволы

В git используются

^

Указатель на родителя. Можно добавлять как к номеру коммита - sh24fa2^, так и к указателю - develop^, HEAD^. Если родителей несколько (ветвление), можно указывать номер родителя - ^2, ^3 и т.д.

~

Тоже указатель на родителя, но запись ~2 укажет на родителя родителя. ~5 - 5 коммитов назад.

Иерархичность

Система поддерживает возможность делать композиции из репозиториев.

Git Submodules

Данный вид иерархической структуры позволяет включать в репозиторий ссылки на другие репозитории. Например, репозиторий A имеет submodule B. При git push в B репозиторий A никак не изменится. Чтобы подтянуть изменения из B, необходимо в A выполнить git submodule update. По сути submodule - указатель на конкретный коммит в другом репозитории.

Git Subtree

По сравнению с предыдущим, этот вид включает в себя репозиторий целиком, как копию, со всей ее историей. Изменения в "скопированном" репозитории будут доступны сразу. Также, размер репозитория увеличится на размер subtree.