Git
Last updated
Last updated
Для начальной конфигурации репозитория требуется установить имя и email для репозитория. Опция --global
используется для настройки всех репозиториев текущего пользователя.
Инициализация репозитория git в текущей директории, в результате будет создана специальная директория .git
со всеми настройками git-репозитория.
Команда для клонирования репозитория с сервера.
Если требуется склонировать в другую директорию, то вторым параметром указывается путь к директории.
Для клонирования определённой ветки, нужно указать через флаг -b
.
Примеры:
Клонирование репозитория по https.
Клонирование в определённую директорию.
Клонирование определённой ветки в определённую директорию.
Проверка текущего состояния всех файлов.
При любом изменении состояния файлов, и их содержимым, status будет выдавать всю подробную информацию.
Если требуется получить краткий отчёт можно воспользоваться опцией --short
или -s
.
Так же рядом с файлами будут показаны в каком сейчас файлы формате.
?? - неотслеживаемый файл.
A - добавлен в отслеживаемые файлы.
M - модифицированный файл.
D - удалённый файл.
R - переименованный файл.
Для просмотра изменений в файлах используется diff
.
Опции:
staged
- посмотреть что из проиндексированного войдёт в коммит.
check
- проверка пробелов в конце строки. (если они будут, тогда будут подсвечиваться красным).
Примеры:
Просмотр изменений файлов от последнего коммита.
Просмотр проиндексированных изменений.
Просмотр изменений определённого файла.
Проверка на наличие лишних пробелов в коде.
Сравнение изменений веток.
Сравнение изменений определённого файла между ветками.
Сравнение по коммиту.
Сравнение изменений определённого файла между коммитами.
Для того чтобы начать отслеживать новый файл.
Если же добавляется директория, то все файлы находящиеся в ней будут так же добавлены в отслеживаемые.
Добавление всех изменений в репозитории.
Добавление только созданных и измененных файлов, а не удаленных.
Добавление только удаленных и измененных файлов, а не новых созданных.
Если требуется добавить изменения по частям используется флаг -p
. После исользования, открвывается интерактивный режим для принятия решения добавлять в индекс это изменение или нет.
y
- разместить этот фрагмент.
n
- не размещать этот фрагмент.
q
- выйти; не размещать этот фрагмент или любой из оставшихся.
a
- разместить этот фрагмент и все последующие фрагменты в файле.
d
- не размещать этот фрагмент и все последующие фрагменты в файле.
e
- вручную отредактировать текущий фрагмент.
/
- поиск фрагмента.
j
- оставить этот фрагмент неопределенным, посмотреть следующий неопределенный фрагмент.
J
- оставить этот фрагмент нерешённым, перейти на следующий фрагмент.
k
- оставить этот фрагмент неопределенным, смотреть на предыдущий неопределенный фрагмент.
K
- оставить этот фрагмент нерешенным, смотреть на предыдущий фрагмент.
s
- разбить текущий кусок на более мелкие куски.
e
- вручную отредактировать текущий фрагмент.
?
- показать справку.
Примеры:
Добавление файла.
Добавление директории и находящийхся в ней файлов.
Добавление только одного файла в директории.
Фиксация измений.
После команды откроется текстовый редактор, установленный по умолчанию. Где требуется дать комментарий коммиту.
Если нужна более подробная информация об изменениях.
Так же можно задать сообщение об фиксации и в самой команде, без открытия текстового редактора.
Выполнение коммита со всеми изменениями в рабочем каталоге.
Для изменения сообщения последнего коммита используется флаг --amend
.
Изменение сообщения последнего коммита, без редактора.
Если был сделан коммит, но после этого потребовалось добавить в последний коммит какие-то изменения так же используется флаг --amend
.
Если был добавлен или изменён файл, и при этом не требуется менять имя коммита дополнительно используется флаг --no-edit
.
Для создания коммита с определённой датой используется флаг --date
.
Для создания коммита с определённым автором используется флаг --autor
.
Создание пустого коммита - коммита без изменений.
Примеры:
Коммит файла.
Добавление файла в последний коммит.
Создание коммита с определённой датой (27.10.2022 16:31:15).
Иногда нужно чтобы некоторые файлы, группа файлов или директории не добавлялись в репозиторий. Обычно в эту категорию попадают автоматически генерируемые файлы и файлы содержащие конфидициальную инфромацию.
Команда для создания такого файла.
Составление .gitignore
файла.
Для просмотра файлов которые игнорируются в текущем проекте.
Можно создать глобальный gitignore.
Команда git rm
позволяет удалить файл и сразу добавить это его в индекс.
Если требуется удалить из отслеживаемых файлов, но не удалять с файловой системы, то нужно использовать опцию --cached
.
Если файл был изменён, но всё равно требуется его удалить, то добавляется опция --force
или -f
.
Если нужно посмотреть какие файлы будут удалены, но не удалять их, то используется опция --dry-run
или -n
.
Примеры:
Удаление всех файлов с расширением .txt.
Переименование файла или директории.
Перемещение файла или директории.
Примеры:
Переименование файла.
Перемещение файла в другую директорию.
Команда для просмотра истории коммитов. Первыми выводятся самые свежие коммиты.
Для того чтобы посмотреть только 3 последних коммита, нужно использовать опцию -n
.
Для получения краткой характеристики используется опцию --stat
.
Самое подробное представление истории коммитов. Показывает какие изменения были сделаны в каждом файле.
Показывает изменённые файлы в данном коммите.
Поиск по коммитам.
Показывает коммиты по определённому автору.
Параметр --pretty
определяет формат вывода информации.
Стандартные параметры для pretty.
oneline
short
full
fuller
Так же можно определять свой вывод информации.
Самые распространённые параметры форматирования.
%H
Хэш-код коммита
%h
Сокращенный хэш-код коммита
%T
Хэш-код дерева
%t
Сокращенный хэш-код дерева
%P
Хэш-код родительских коммитов
%p
Сокращенный хэш-код родительских коммитов
%an
Имя автора
%ae
Электронная почта автора
%ad
Дата создания оригинала
%ar
Дата создания оригинала, в относительной форме
%cn
Имя создателя версии
%ce
Электронная почта создателя
%cd
Дата создания версии
%cr
Дата создания версии в относительном формате
%s
Комментарий
Вывод коммитов с историей ветвлений и слияний.
Очень удобная команда, которая выводит дерево всех коммитов.
Команда для просмотра что было изменено в определённом коммите.
Отображение удалённых репозиториев.
Посмотреть адреса, для сокращенного имени.
Создание нового подключения к удаленному репозиторию.
Удаление подключения к удаленному репозиторию с именем.
Переименование удаленного подключения с имени.
Изменение адреса, для определённого имени.
Просмотр удалённого репозитория.
Отправка данных на удалённый сервер. Если имя удалённого сервера origin, при отправке можно не указывать. Так же если вы находитесь в ветке, которую требуется отправить, то её можно тоже не указывать.
Удаление удалённой ветки с сервера.
Команда git fetch
- скачивает коммиты в специальные ветки.
Для просмотра удалённых веток.
Ветки будут помечены по стандарту красным цветом и выглядят - remotes/<remote-server-name>/<branch-name>
.
Извлечение всех веток из репозитория.
Извлечение определённой ветки.
Извлечение всех зарегистрированных удаленных репозиториев и их веток.
Опция --dry-run
выводит на экран действия, которые были бы выполнены при извлечении, не выполняя их на самом деле.
Если после загрузки с определённого сервера появилась новая ветка, можно её переместить в свою ветку.
Команда git pull
- это git fetch + git merge. При её использовании происходит скачвание данных с сервера и автоматичское слияние.
Скачать данные с удалённого сервера.
Если нужно скачать текущую ветку и с сервера origin.
При отправке данных git push
, может произойти конфликт, что на удалённом репозитории уже были добавлены коммиты. Для этого нужно сначала скачать изменения, и только потом отправить их.
Если были локальные коммиты, и на удалённом сервере тоже были сделаны коммиты, то при обычном pull
, будет сделан мердж-коммит. Чтобы избавиться от него, требуется использовать опцию --rebase
. При этой опции локальный коммит окажется поверх новых коммитов с сервера, а мердж-коммита не будет.
Если идёт командная работа, то лучше всегда использовать опцию --rebase
, при взятии изменений.
Тэги позволяют помечать определённые коммиты как важные. Как правило,используют это для пометки выходящих версий (v1.0 и т.п.).
Просмотр всех тегов.
Просмотр тегов по шаблону.
Есть 2 типа тегов, легковесные и аннотируемые теги. Легковесные это просто указатель на определённый коммит. Аннотируемые теги хранятся в базе уже как полноценный объект. Они содержат имя человека, поставившего тег, адрес его электронной почты и дату создания и пр.
Создание легковесных тегов.
Создание аннотируемых тегов. Если не указать опцию -m
то открывается редактор, и чтобы ввести тег.
Просмотр определённого тега.
Так же тэг можно поставить на определённый коммит.
Отправление тегов на удалённый сервер.
Отправка нескольких тегов сразу.
Удаление тега.
Можно задавать псевдонимы определённым командам.
Как пример можно задать длинным командам их псевдонимы.
Так же можно вводить псевдонимы для тех команд которых не хватает.
Например, вывод последнего коммита.
Посмотреть все опции команды.
Есть 3 уровня конфигурации:
--local
- локальный уровень, стоит по умолчанию, применяется к одному текущему репозиторию.
--global
- глобальный уровень, применяется к пользователю для всех его репозиториев.
--system
- системный уровень, применяется ко всем настройкам машины. Охватывает всех пользователей операционной системы.
Глобальные настройки для определённого пользователя обычно лежит по пути ~/.gitconfig
.
Команда для просмотра заданных уже настроек.
Команда для просмотра определённой настройки.
Настройка имени пользователя.
Настройка email адреса пользователя.
Выбор редактора кода по умолчанию.
При команде git pull очень часто используется опция --rebase
, настройка для автоматического использования этой опции.
Автоматическое исправление опечаток, будет автоматически предложена команда с исправлением.
Возможность сохранить имя и пароль в незашифрованном виде и использовать его при отправке коммитов на удалённый сервер.
Команда git init
по стандарту создаёт ветку master
, если требуется изменить создаваемую ветку по стандарту.
Моя настройка для удобного отображения дерева коммитов.
История коммитов это очень важная документация, которая документирует историю работы разработчков.
Именование коммитов нужно для понимания разработчикам, что было сделано в данном коммите.
В начале коммита устанавливается тип коммита.
test
- указывает на любое создание или изменение кода тестов.
feat
- указывает на разработку новой функции для проекта.
refactor
- используется, когда происходит рефакторинг кода, не влияющий на логику/правила системы.
style
- используется при изменениях форматирования и стиля кода, которые никак не меняют систему.
fix
- используется при исправлении ошибок, которые порождают баги в системе.
chore
- указывает на изменения в проекте, которые не влияюкт на систему или тестовые файлы. Это изменения, связанные с разработкой. Примеры: изменение правил для eslint, добавление prettier, добавление расширений файлов в .gitignore.
docs
- используется при изменениях в документации проекта.
build
- используется для указания изменений, которые влияют на процесс сборки проекта, или внешних зависимостей.
perf
- указывает на изменение, которое улучшает производительность системы.
ci
- используется для указания на изменения в конфигурационных файлах CI.
revert
- указывает на отмену предыдущего коммита. Так же тип коммита позволяет более удобно использовать поиск по коммитам.
Ветвление в git одна из самых важный знаний, для работы с репозиторием. Ветка - это указатель на определённый коммит.
Показать текущие ветки.
Создать ветку от текущей ветки.
Создание ветки от определённой ветки.
Если требуется указать ветку на определённый коммит.
Если ветка уже создана нужно использовать флаг -f
.
Безопасное удаление ветки, если ветка не смёрджена, то она не будет удалена.
Принудительное удаление ветки.
Показать больше текущей информации о ветках, показывает последний сделанный коммит.
Показать на сколько опережает или отстаёт ветка от удалённого репозитория.
Информация о всех ветках, включая удалённые.
Просмотр удалённых веток.
Так же можно использовать опции --merged
- показывает ветки объединённые с текущей, и --no-merged
- ветки которые не слиты в другие ветки.
Примеры:
Создание ветки.
Создание ветки на определённый коммит.
Удаление ветки.
Команда для смены ветки.
Смена веток так же приводит к смене файлов в рабочей директории.
Можно создать ветку и перейти в неё с помощью одной команды.
Так же существует более новая команда для смены ветки switch
.
Смена ветки.
Создать ветку и перейти в неё.
Примеры:
Создание ветки.
Смена ветки.
Перемещение на определённый коммит.
Слияние - соединение двух веток.
Есть 2 типа слияния:
fast-forward - слияние перемоткой.
Если была история веток, где от одной ветки сделана другая, и в этой ветки не было других коммитов.
Тогда при слиянии будет сделана перемотка коммитов и получится такая история при слиянии.
2) 3 way merge - трёхэтапное слияние.
Когда ветки разошлись, быстрого слияния не получится сделать.
Для мерджа используется три коммита для создания слияния: два кончика ветвления и их общий предок.
Итог слияния:
Для того чтобы смерджить 2 ветки, требуется перейти в ветку которую будет происходить мердж и дальше произвести слияние ветки.
Конфликты при слиянии.
Процесс слияния далеко не всегда проходит гладко. Если в двух ветках, которые сливаются, были внесли разные изменения в один и тот же файл, Git не cможет просто взять и объединить их. При слиянии появляется конфликт.
Чтобы посмотреть какие файлы имеют конфликт.
При открытии файла который вызвал конфликт, система самостоятельно помечает места где вызван конфликт.
Пример:
Для решения конфликта, требуется вручную отредактировать файл, и дальше произвести коммит изменений.
Если написать git commit
то git самостоятельно сгенерирует комментарий о мерже и останется только подтвердить коммит.
При возникновении конфликта можно отменить слияние.
Если при мердже будет ускоренное слияние, но для истории коммитов требуется вариант 3 way, тогда можно использовать опцию --no-ff
. Будет создан коммит слияния, без перемотки.
До слияния.
После слияния.
Если в ветке было много коммитов, и эти коммиты не требуется отображать в релизе. Можно применить флаг --squash
. После этого потребуется указать общий коммит для слияния.
Перемещение
- перенос всех коммитов определённой ветки, с одного коммита на коммит/коммиты выше от наследуемой ветки.
Для перемещения одной ветки в другую, требуется сначала перейти в ветку которую нужно переместить, а потом указать ветку в которую нужно переместить.
Можно переместить ветку, при этом находясь в другой ветке.
При возникновении конфликта перемещения коммитов, требуется разрешить конфликт и перейти на следующий коммит.
Переход на следующий коммит.
После перемещение ветки, можно выполнить перемотку ветки куда происходило перемещение.
Если ветка больше не нужна, её можно удалить.
При возникновении конфликта можно отменить перемещение.
Пример:
Начальная история версии.
Для перемещения требуется перейти в ветку feature.
И запустить перемещение.
Если произошли конфликты решить их.
После этого история будет выглядеть так.
Если требуется переместить указать master на feature.
Дальше стало так.
И если ветка feature не нужна - удалить её.
Для трудного перемещения используется флаг --onto
.
feature_2 основан на feature_1, и для того чтобы переместить feature_2 к master.
Дерево веток после перемещения.
Есть два вида соединения веток - слияние и перемещение, что лучше?
rebase
:
Плюсы:
Упрощает историю - при каждом слиянии веток образуется дополнительный коммит о слиянии, что для истории коммитов плохо. Так же если слияние происходит часто получается пачка пустых коммитов о слиянии.
Минусы:
Если работа ведётся не одним человеком, то может произойти ситуация когда один разработчики переместил ветку выше, а другой ещё не перешёл на неё и при этом сделал какие-то изменения в старой версии - очень трудно потом восстанавливаться.
Возможны ошибки в коммитах - если в старой версии использовался метод Hello, а потом он изменился на HelloSay и при этом может не обнаружится этого, то все коммиты которые были перемещены будут "битые", так же на них будет очень плохо делать откат.
Это можно частично исправить если есть какие-либо тесты. Их можно пртестировать перед перемещением, и если будет ошибка то об этом будет сообщаться, и rebase будет ждать действий для исправления.
merge
:
Плюсы:
При мердже и не плохом коммите, будет повреждён только один коммит, и при этом оставшиеся коммиты будут целы.
Минусы:
При многочисленном мердже появляется куча бесполезных коммитов, что затрудняет историю коммитов и разработку.
Использовать rebase
и merge
нужно в правильных ситуациях. Считается, что rebase для приватных веток, когда изменения не выложены, и не будет конфликтов с другими разработчиками при перемещении. А merge лучше использовать когда уже над веткой работают несколько разработчиков.
main / master
- Ветка, где один коммит является релизом выпускаемый в prod. Обычно на него могут давать тег.
develop / dev
- Ветка, для ведения разработки и объединение всех функций.
feature
- Ветки, которые начинаются от develop, и в них разработаевается какая-то новая фича.
release
- Ветка, для подготовки релиза, перед пушем в main.
hotfix
- Ветка предназначена для быстрого исправления ошибок в main.
Пример:
После создания ветки release и слияния с main, требуется также слить изменения в dev.
Если в main ветке происходит критическая ошибка, то требуется создать ветку hotfix. После изменений, изменения требуется слить и в main и в develop.
Облегчённая версия GitFlow, отсутствуют ветки dev, release, hotfix.
main / master
- являются конечными ветками.
Пример:
От main создаётся ветка feature, в которой разрабатывается новая фича, и после этого сразу идёт слияние в main.
Очень похожый вариант с GitHubFlow, но ветка main, не является конечной веткой.
Появляются такие ветки:
staging
- опциональная ветка, первый рубеж тестирования.
pre-production
- опциональная ветка, второй рубеж тестирования.
production
- обязательная ветка, из которой происходит деплой проекта.
Пример:
Полностью схожая идея с GitHubFlow, только ветки feature должны иметь жизнь не более 1-2 дней.
Для редактирования сообщения последнего коммита.
Если требуется добавить изменения каких-то файлов в последний коммит.
Если требуется добавить и при этом не изменять сообщение коммита.
Для редактирования нескольких коммитов используется команда rebase
.
Команда для того чтобы отредактировать более ранний коммит или коммиты.
В данном варианте будут выведены на экран последние 10 коммитов.
Так же можно задать диапазон коммитов.
Дальше открывается текстовый редактор, где можно указать с какие коммиты нужно отредактировать. Коммиты будут отображаться в обратном порядке (в отличии от git log) - сначала старые, потом новые.
pick
- использовать данный коммит, т.е. он будет использоваться как он есть.
Чтобы отредактировать сообщение нужно pick
заменить на reword
.
Дальше требуется сохранить файл и выйти, и после этого каждый раз будет открываться редактор, для смены коммитов.
Если же выбрать edit
, то будет происходить переход на каждый коммит, и мможно будет вручную отредактировать комммит и/или изменить файлы.
После редактирования коммита можно перейти на следующий коммит.
Сначала нужно вывести коммиты, которые нужно объединить.
Вывод команды.
Для того чтобы объединить коммиты нужно заменить pick
на squash
у более позднего коммита, для объединения с более старым.
Если требуется обединить коммиты 2 commit
и 3 commit
, требуется у коммита 3 commit
поменять pick на squash.
Или, если нужно объеденить несколько коммитов. В данном примере объединяются коммиты 2 commit
, 3 commit
и 4 commit
. Коммит будет объединяться с предыдущим своим коммитом.
Дальше, после сохранения, снова откроется текстовый редактор, чтобы задать сообщение общего коммита.
Всё, что помечено "#", является комментарием.
Было:
Стало:
Для изменения порядка следования коммитов, так же применяется rebase
. Для начала требуется открыть список коммитов, которые мы хотим изменить.
И внутри уже просто поменять местами коммиты которые нам нужны.
Было:
Стало:
Но если в коммитах были какие-то общие изменения, то будет конфликт, который нужно будет решить.
Либо же можно отменить изменения.
Все варианты команд для rebase.
p, pick
- использовать коммит.
r, reword
- использовать коммит, но отредактировать сообщение фиксации.
e, edit
- использовать коммит, но остановить для внесения поправок.
s, squash
- использовать коммит, но объединить с предыдущим коммитом.
f, fixup
- как "сквош", но отбросить сообщение журнала этого коммита.
x, exec <command>
- выполнить команду (остальная часть строки) с помощью оболочки.
b, break
- остановиться здесь.
d, drop
- удалить коммит.
l, label <label>
- пометить текущую HEAD.
t, reset <label>
- сбросить HEAD на метку.
reset - универсальный инструмент для отмены изменений.
По умолчанию при вызове команды git reset
используются неявные аргументы --mixed
и HEAD
.
Поэтому эти две команды одинаковы.
--soft
- отменяются коммиты, до указанного, но при этом файлы, которые были изменены в этих коммитах, остаются и все их изменения. И так же они добавлены в отслеживаемые файлы.
--mixed
- отменяются коммиты, до указанного, изменённые файлы сохраняются, но не добавлены в отслеживаемые.
--hard
- отменяются коммиты, до указанного, и при этом файлы не сохраняются.
Если требуется удалить коммит с удалённого репозитория, то требуется откатиться сначала на локальном репозитории, и дальше отправить их на удалённый.
Примеры:
Откатить 2 последних коммита, и оставить изменения.
или
Удалить 2 последних коммита.
Если коммит уже был сделан и отправлен коллегам, то удалять такой коммит будет не лучшим решением. Т.к. далее уже на его основе могут быть сделаны изменения других людей.
Для того чтобы исправить такую ситуацию, можно использовать revert
. Он делает новый коммит который отменяет все сделанные изменения. С одной стороны это очень плохо - загрязняет историю, но с другой, может быть одним из выходов в данной ситуации.
Отмена последнего коммита.
Отменить любой коммит можно по хэшу коммита, но может случиться конфликт, который потребуется решить самостоятельно.
Можно отменять несколько коммитов.
Если требуется посмотреть изменения предыдущих коммитов, но не делать коммит о отмене, можно воспользоваться флагом -n
.
Принудительный перенос ветки на определенный коммит.
Либо же если нужно перенести ветку на другую ветку, сначала указывается ветка которую переносим, потом на какую переносим. Так же вместо ветки можно указать коммит.
Если файл был удалён или изменён и требуется вернуть его к последнему коммиту.
Для возвращение файла к определённому коммиту.
Чтобы убрать файл из отслеживаемых файлов, но не убирать его изменения.
Если были сделаны изменения в файлах, и нужно изменить ветку, при этом не сделав коммит, можно воспользоваться операцией stash
. Операция stash берёт изменённые файлы каталога и сохраняет их в хранилище, которые можно применить в любое время.
Для того чтобы припрятать изменения, после этого можно увидеть что изменений нет.
Чтобы посмотреть список припрятанных изменений.
Так же можно добавить сообщение при откладывании изменений.
Чтобы вернуть припрятанные изменения. При этом внесённые изменения будут оставаться в хранилище даже после возвращения.
C опцией --index
, команда попытается восстановить изменения в индексе.
Для удаления изменения из хранилища.
Для того чтобы вернуть изменения и сразу удалить из архива используется команда.
При опции --keep-index
будут припрятаны изменения, но и при этом будут оставлены в индексе.
При опции --include-untracked
или -u
, будут спрятаны так же и все не отслеживаемые файлы.
При опции --patch
, будет запущен интерактивный режим, в котором по каждому файлу спросят, нужно ли его припрятать или нет.
Так же можно изменения вынести в новую ветку.
Удаление всех спрятанных изменений.
Команда cherry-pick
позволяет копировать коммиты из другой ветки и вставить его в текущую.
Копирование одного коммита в текущую ветку.
Копирование нескольких коммитов. Коммит <hash-commit-1>
должен быть старше коммита <hash-commit-n>
.
При этом первый коммит не будет учитываться.
Для того чтобы он учитывался, требуется прописать ^
после первого коммита.
Если требуется изменить сообщение об фиксации.
При возникновении конфликта, требуется его решить и перейти на следующий коммит.
Отмена копирование коммитов.
Сначала требуется сгенерировать ssh ключ. Сначала попросят ввести имя ssh ключа, его можно оставить по умолчанию. А дальше попросят ввести кодовую фразу, можно не вводить и просто нажать enter.
Ключ обычно хранится в директории ~/.ssh, по умолчанию его имя id_rsa. Генерируется два ключа открытый - id_rsa.pub, и закрытый - id_rsa. Сообщать можно только открытый ключ.
Для того чтобы передать ssh ключ github, нужно зайти на github.com, Settings, SSH and GPG keys, New SSH Key, в Title - ввести описание ключа, Key - ввести публичный ключ. И после этого можно пушить коммиты без постоянного потверждения.
Если GitHub репозиторий изначально был подключен по web URL, то требуется его поменять на ssh URL.
При работе с проектом, возникает необходимость использовать в нем другой проект. При этом нужно продолжать работать с двумя проектами по отдельности, но при этом использовать один из них в другом.
Добавление подмодуля.
При клонировании репозитория с подмодулями.
Но можно сделать это более просто, передать git clone флаг --recurse-submodules
.
Команда git pull получает изменения для подмодулей, но она не обновляет подмодули. Поэтому нужно обновить подмодули, и лучше запускать submodule update с параметром --init
, чтобы проинициализировать новые подмодули, а так же с параметром --recursive
, чтобы обновить вложенные подмодули.
Если установить параметр конфигурации status.submodulesummary, при git status будет так же показываться сводка по подмодулям.
Если требуется чтобы подмодуль отслеживал только нужную ветку.
Отправка изменений не только из основного модуля, а так же из подмодуля.
При значении check
, push просто завершится ошибкой, если какой-то из подмодулей не был отправлен на сервер. И тогда нужно будет вручную проходиться и оправлять изменения на сервер.
При значении on-demand
, будет пытаться отправлять самостоятельно без помощи пользователя.
Так же можно установить такое поведение по умолчанию.
Для подписи коммитов используется утилита gpg
.
Для того чтобы получить список имеющихся GPG-ключей.
Для генерации ключа.
При генерации нужно написать своё имя, email адрес. И далее нужно установить пароль для защиты ключа, так же можно оставить поле пустым и не указывать пароль.
Команда для более полной настройки ключа. Можно указать тип ключа, размер ключа и время работы ключа.
Для того чтобы подписи коммитов были автоматически.
Если ключей несколько, можно установить определённый ключ.
Для загрузки открытого ключа на GitHub, нужно его экспортировать. Для записи его на GitHub нужно перейти в Settings, и далее SSH and GPG keys.
Команда для сохранения резервной копии привтного ключа.
Для подписи тегов вместо флага -a
используется флаг -s
.
Так же при просмотре тега видно подпись.
Для проверки подписанного тега. Для ее корректной работы нужно, чтобы в хранилище ключей присутствовал открытый ключ автора, поставeвшего подпись.
Для подписи коммитов используется флаг -S
.
Для просмотра и проверки подписей есть параметр --show-signature
.
Команды merge
и pull
можно заставить проверять и отклонять слияния, если коммит не содержит доверенной GPG подписи с помощью опции --verify-signatures
.
При слиянии, если один из коммитов не будет подписан будет выдана ошибка при слияни.
Если сливаемая ветка содержит только корректно подписанные коммиты, команда слияния сначала покажет все проверенные подписи, а затем выполнит слияние.
Так же если использовать флаг -S
при слиянии, то коммит так же будет подписан.
Для удаления ключа используется сначала удаление приватного ключа.
А после можно удалить уже сам ключ.
Подписывать коммиты должен каждый, но при этом каждый коллега в команде должен уметь подписывать их.
Команда git rerere
- это сокращение для reuse recorded resolution (повторно использовать сохранённое решение).
Эта команда позволяет попросить Git запомнить как была разрешёна некоторая часть конфликта, и в случае возникновения такого же конфликта, Git сможет его разрешить автоматически.
Разрешённые конфликты хранятся в директории ./git/rr-cache
.
Команда для включения rerere.
Просмотр какие снимки состояния сохранены.
Показать текущее состояние разрешения конфликта.
Конфигурация.
gc.rerereResolved
- как долго хранятся записи о разрешенных ранее конфликтных слияниях. По умолчанию это 60 дней.
gc.rerereUnresolved
- как долго хранятся записи о неразрешенных конфликтах слияния. По умолчанию это 15 дней.
Если в какой-то момент оказалось, что какие-то тесты не закпускаются или какая-то часть кода перестала правильно работать, но при этом было сделано довольно много коммитов, отыскать где была допущена ошибка может быть пробематично. Команда bisect
позволяет найти очень быстро плохой коммит.
Для старта поиска нужно запустить bisect.
Дальше требуется указать хороший коммит и плохой коммит.
После этого, bisect разделит все коммиты, которые располагаются между ними, пополам, переключится в новую (безымянную) ветку на этом срединном коммите и позволит вам проверить, работает ли в нём нужный код.
Сказать что в данном коммите не работает нужный код.
Сказать что в данном коммите работает нужный код.
Остановить поиск, и вернуться к начальной точке.
Просмотр последнего успешно выполненного bisect.
Если имеется команда для проверки хорошего или плохого коммита, то эту часть можно автоматизировать.
Сначала нужно запустить bisect и указать хороший или плохой коммит. А далее запустить автоматическую проверку коммитов.
Для полного просмотра кто написал каждую строчку в файле.
Опция -L
позволяет указать диапазон строк.
Опция -e
позволяет отобразить адреса электронной почты авторов вместо имен пользователей.
Опция -M
позволяет находить перемещённые или скопированные строки внутри одного и того же файла. Указываться будет первоначальный автор строк.
Опция -C
позволяет находить строки, которые были перемещены или скопированы из других файлов.
Для поиска строк по коммитам используется команда git grep
. git grep принимает многие ключи, что и утилита grep в Linux.
Для поиска строки в git репозитории.
Для того чтобы показать на какой строке найденный паттерн, используется опция -n
или --line-number
.
Для того чтобы показать количество найденных параметров, используется опция -c
или --count
.
Для более удобного вывода можно использовать опции --break
- вывести пустую строку между совпадениями из разных файлов, и --heading
- показывать имя файла над совпадениями в этом файле, а не в начале каждой отображаемой строки.
Поиск строки включая git подмодули:
Поиск строки в файлах, подходящих под указанный шаблон:
Поиск по строке внутри указанного коммита
-e
- поиск по нескольким параметрам.
Так же можно использовать дополнительные параметры --and
, --or
и --not
, для сочетания нескольких шаблонов.
Если нужно найти когда было добавлено или удалено выражение можно использовать git log
c флагом -S
.
Так же есть поиск по журналу изменений строки. Для этого используется git log с флагом -L
.
Можно либо указать диапазон строк и файл <start>,<end>:<file>
, либо по регулярному выражению и файлу :<pattern>:<file>
.
Примеры:
git gc
занимается сборкой мусора - удаление ненужных файлов из хранилища объектов и эффективное упаковывание файлов.
Ручной запуск оптимизации репозитория.
Проверка требуется ли какое-то обслуживание.
Некоторые команды могут самостоятельно запускать эту команду. Для отключения этой опции.
--aggressive
- опция заставит git более агрессивно оптимизировать репозиторий за счет гораздо большего времени.
--prune=<date>
- Удаление незакрепленных объектов старше даты (по умолчанию 2 недели назад). --prune=now
- удаляет свободные объекты независимо от их возраста.
Конфигурация.
gc.pruneExpire
- насколько старыми должны быть незакрепленные объекты, на которые нет ссылок, прежде чем они будут удалены. По умолчанию 2 недели назад.
Команда clean
предназначена только для удаления неотслеживаемых файлов и директорий.
Популярные опции для clean
-d - удалялись не только файлы но и директории
-x - удалялись файлы, которые игнорируются через .gitignore
-f - принудительное удаление
-n - предварительный запуск, показывает какие файлы будут удалены
Git хранит все изменения, которые происходили в репозитории. Любые перемещения в ветки, перебазирование, удаление, всё это сохраняется в истории git.
Команда для просмотра изменений которые были совершены.
Вывод изменений определённой ветки.
Так же можно вывести в привычном формате reflog.
Дальше по выведенным логам можно понять какие изменения были, и после этого вернуть изменения. После этой команды, он перейдет на этот коммит, и дальше уже можно будет решить как вернуть изменения.
Либо откатиться до этого изменения
Так же можно эти изменения перенести в ветку для удобства.
Данные о reflog остаются только локально, и при отправке на удалённый сервер они не будут сохранены на нём.
Стоит учитывать, что обычные записи хранятся 90 дней, если же коммит не достижим, к примеру удалена ветка, изменения будут хранится только 30 дней. Конфигурацию хранения логов можно поменять.
Конфигурация.
gc.reflogExpire
- как долго записи в журнале ссылок каждой ветки должны оставаться доступными. По умолчанию он составляет 90 дней.
gc.reflogExpireUnreachable
- как долго записи журнала ссылок, не являющиеся частью текущей ветки, должны оставаться доступными. Этот параметр по умолчанию равен 30 дням.
filter-branch
- эта команда предназначена для перезаписи истории коммитов. Это очень мощная утилита и имеет множество подводных камней, которые могут привести к неочевидным искажениям предполагаемой перезаписи истории.
Опции.
--prune-empty
- при удалении файла из коммита, может случится такое, что в коммите ничего нет. Эта опция сделает так, чтобы пустые коммиты будут удалены.
--subdirectory-filter <directory>
- будет просмотр только истории, касающейся данного подкаталога.
--tree-filter <command>
- для перезаписи истории файлов в коммитах.
--index-filter <command>
- для перезаписи только индексированных файлов. Похож на tree-filter, но не проверяет дерево коммитов на не индексированные файлы, из-за этого работает быстрее. Очень часто использутся с git rm --cached --ignore-unmatch ...
.
--env-filter <command>
- применяется если нужно изменить только данные, в которой выполняется фиксация. Можно переписать автора/коммитера/электронная почта/время и т.п.
--msg-filter <command>
- для перезаписи сообщений фиксации.
--tag-name-filter <command>
- для перезаписи имён тегов. Оригинальные теги не удаляются, но могут быть перезаписаны. --tag-name-filter cat
, опция для того чтобы обновить теги.
--commit-filter <command>
- для перезаписи комиитов.
Переменные по умолчанию:
GIT_COMMIT
GIT_AUTHOR_NAME
GIT_AUTHOR_EMAIL
GIT_AUTHOR_DATE
GIT_COMMITTER_NAME
GIT_COMMITTER_EMAIL
GIT_COMMITTER_DATE
При запуске filter-branch
, для всех веток, которые эта команда затронет, будет создана копия по пути refs/original/refs/heads/<branch-name>
. Это сделано для того чтобы после массового изменения истории, можно было просмотореть изменённую версию, и при ошибке откатиться обратно.
Один из вариантов удаление одной ветки.
Один из вариантов удаление всех веток.
Один из вариантов отмены одной ветки.
Один из вариантов отмены всех изменений.
Примеры:
Удаление какого-то файла во всех ветках.
--
отделяет параметры ветки фильтра от параметров ревизии, и --all
, нужен для перезаписи всех веток и тегов.
Такое же удаление файла, только через index-filter.
Удаление коммитов одного человека.
Если требуется изменить имя человека который создал и пушил коммит. Так же можно указать диапазон, а не все ветки.
Где b63eabe более ранний коммит ветки feature.
Возращение master на старую версию.
git fsck
- Проверяет подключение и действительность объектов в базе данных.
Опции:
--unreachable
- показать объекты, которые существуют, но недоступны ни для одного из эталонных узлов.
--name-objects
- отображается имя, описывающее, как они доступны.
--dangling
- показать объекты, которые существуют, но никогда не используются напрямую.
--verbose
- более подробная история объектов.
--lost-found
- записывает висячие объекты в .git/lost-found/commit/
или .git/lost-found/other/
, в зависимости от типа.
git instaweb
- Программа для запуска gitweb сервера.
Опции.
-l / --local
- привязать сервер только к локальному IP адресу.
--start
- запустить сервер для текущего репозитория.
--restart
- перезапустить сервер.
--stop
- остановить сервер.
-d / --httpd
- использовать указанный httpd демон. Поддерживаются apache2, lighttpd, mongoose, plackup, python и webrick. По умолчанию lighttpd.
-p / --port
- порт для привязки httpd. По умолчанию 1234.
-b / --browser
- браузер для просмотра веб страницы.
Примеры:
Запустить сервер.
Перезапустить запущенный сервер.
Остановить запущенный сервер.
Запустить сервер на порте 4321.
Открыть веб страницу в google chrome.
Git репозиторий представляет собой картотеку различных объектов, разложенную по именам-хешам.
Объекты бывают четырёх типов - blob, tree, commit, tag.
Blob
(Binary Large Object) - это основа репозитория. Содержимое репозитория, без имени. Если добавить в git файл с содержимым, то результирующий blob-объект будет содержать только содержимое, без данных об имени файла.
Для просмотра того что хранит blob.
Tree
(дерево) - Объект этого типа решает проблему хранения имен файлов, а также позволяет хранить группы файлов.
Простмотр данных дерева.
Примеры:
Дерево содержит в себе несколько blob объектов.
Так же дерево может содержать в себе другие деревья.
И смешанно.
Права в первом столбце.
1 цифра - 1 для файлов и символических файлов, 0 для директорий.
2 цифра - 0 для файлов, 2 для символических ссылок, 4 для директорий.
3 цифра - не используется, всегда 0.
4-6 цифры - POSIX права.
Commit
- фиксация изменения одного дерева, коммит также хранит информацию о "предках" этого дерева, то есть ссылки на родительские коммиты. Можно считать, что коммит указывает на деревья из каких произошло текущее дерево, а также автор коммита и сообщение коммита.
У самого первого коммита в репозитории не может быть предков. Он считается начальным коммитом, и считается что до него ничего не было.
Бывает, что несколько коммитов происходят от одного предка. В этом месте в истории появляется "развилка", история начинает делиться на ветви. Это происходит когда от одного коммита идёт 2 ветки.
Бывают еще коммиты, у которых несколько родителей - коммиты-слияния. Это происходит когда происходит слияние нескольких веток, и вообще количество родителей у коммита может быть не ограничено.
Вывод типа объекта.
Вывод самого объекта.
Теги бывают двух типов.
Аннотированные (Тяжеловесные).
Легковестные.
Аннотированный тег это специальный объект, который содержит в себе все данные которые требуются тегу.
Просмотр тега.
Легковестный тег же это просто указатель на коммит, и при просмотре его он покажет коммит.
Символьные имена объектов - ссылка (references), хранятся в каталоге .git/refs
.
Типы:
Теги (tag) - статическая ссылка на коммит. Расположены в .git/refs/tags/
Ветка (head, branch) - динамическая ссылка на коммит, которая меняется при добавлении нового коммита в цепочку. Расположены в .git/refs/heads/
Удаленные ветки (remote) - ветка специального вида, которая предназначена для слежения за ветками (heads) в других репозиториях. Лежат в .git/refs/remotes/
Кроме этого, есть несколько специальных ссылок, которые по историческим соображениям лежат вне каталога .git/refs
. Наиболее важными являются HEAD
, ORIG_HEAD
и MERGE_HEAD
.
HEAD
- это особая ссылка, она показывает на коммит, который соответствует рабочей копии. Если быть точным, это не просто ссылка на коммит, это ссылка на текущую ветку.
Команда git cat-file
нужна для просмотра содержимого или информации о типе и размере для объектов репозитория.
Опции.
-t
- показать тип объекта.
-s
- показать размер объекта.
-e
- если объект существует, выходит с нулевым статусом, иначе выдаётся ошибка.
-p
- показать содержимое объекта.
--allow-unknown-type
- Разрешить -s
или -t
запрашивать сломанные/поврежденные объекты неизвестного типа.
Примеры:
Просмотреть тип объекта.
Вывести содержимое объекта.
Вывести размер объекта.
Так же можно найти список файлов для языков и проектов.
.