Git

Содержание

Глоссарий

Терминология

Элементы

Конфигурация

Ссылки

Создание нового репозитория

Атрибуты

Закрепленные сценарии

Выставление

Откладывание правок

Фиксация правок

Исправление и откат сделанных передач

Журналирование

Просмотр изменений

Ветвление

Слияние

Перебазирование

Метки

Работа с удаленными репозиториями

Субмодули

Архивирование

Патчи

Отправка патчей по электронной почте

Восстановление и очистка

Пошаговый поиск проблемных передач

Примеры

Глоссарий

commit

фиксация правок в файле

to commit

зафиксировать правки в файле

commit message

комментарий к правке

staged area

область выставления, тж. индекс

unstaged area

невыставленная область; рабочая область

to stage

выставить файл; переместить файл в индекс

to unstage

отменить выставление; вернуть файл в рабочую область; удалить файл из индекса

tracked file

отслеживаемый файл; включенный файл (в репозиторий)

untracked file

неотслеживаемый файл; невключенный файл

to track

включить файл (в репозиторий) для отслеживания изменений в нём

Терминология

тематическая ветвь (topic branch)

Ветвь, выделенная под набор правок, посвященных отдельной теме

Элементы

прямое следование (fast-forward)

Один из способов слияния, предполагающий, что первая правка объекта-обновления, является прямым потомком обновляемого объекта.

Допустим, есть обновляемый объект „A“:

x-x-x-A

Есть также объект-обновление „B“:

C-x-B

При операции merge, способ fast-forward предполагает, что первое изменение в объекте „B“ — „C“, является прямым потомком „A“:

x-x-x-A-C-x-B

Напротив, в данном случае:

x-x-x-D-x-x-x-A
       \
        C-x-B

Объект „A“ невозможно обновить данным способом, так как первое изменение в „B“ — „C“, не было его прямым потомком. Оно является прямым потомком объекта „D“, который и был обновлен данным способом.

Нужно иметь ввиду, что при выполнении операции push будет происходит обязательное слияние. Если слияние данным способом окажется невозможным, то в соответствии со стратегией работы системы Git операция push должна быть отменена удаленной стороной.

ссылка (reference, ref)

указатель на последнюю версию цепочки правок

Конфигурация

Команды конфигурации

Опции

Команды конфигурации

git config --system option value

изменить системный параметр

Изменения будут сохранены в файле „/etc/gitconfig“.

git config --global option value

изменить глобальный параметр

Изменения будут сохранены в файле „~/.gitconfig“.

git config option value

изменить локальный параметр

Изменения будут сохранены в файле „.git/config“.

Опции

alias.old_command new_command

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

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

git config --global alias.visual'!gitk'

core.editor editor

добавить текстовый редактор

core.pager pager

установить пэйджер. Можно отключить использование пэйджера, передав пустую строку ('') в качестве значения

core.quotepath false

запретить вывод имен файлов в формате Unicode в виде числовых кодов при выполнении git status

merge.tool merge_tool

добавить инструмент сравнения файлов

commit.template template

установить шаблон для записи передачи

core.excludesfile path

установить внешний файл с исключениями

help.autocorrect 1

установить автоматическое исправление опечаток

color.ui {true | false | always}

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

Ссылки

Ссылки устанавливают соответствия между объектами в локальном и удаленном репозитариях.

Создание нового репозитория

git init

ининциализировать репозиторий

git status

вывести текущий статус

git checkout -- filename

откатить сделанные в файле правки

Атрибуты

Атрибуты задаются в файлах ./.gitattributes или ./.git/info/attributes.

Формат задания атрибутов в указанных выше файлах следующий: path attribute.

path export-ignore

не добавлять указанные файлы и каталоги в архив при экспорте с помощью git archive

Закрепленные сценарии

Клиентские закрепленные сценарии

Сценарии, связанные с фиксацией правок

Сценарии, связанные с добавление патчей

Серверные закрепленные сценарии

Файлы с закрепленными сценариями содержатся в каталоге .git/hooks.

Клиентские закрепленные сценарии

пусто

Сценарии, связанные с фиксацией правок

pre-commit

Запускается сразу же после команды git commit и перед запуском текстового редактора. Если данный сценарий возвращает „0“ (exit 0), то после него будет запущен текстовый редактор, если „1“ (exit 1), то фиксация правки будет отменена.

prepare-commit-msg

Запускается перед запуском текстового редактора, но сразу же после создания текстового сообщения по умолчанию. Позволяет изменять текстовое сообщение по умолчанию. Имеет три аргумента:

$*[0] — файл с текстовым сообщением по умолчанию;

$*[1] — тип правки {commit | template | squash};

$*[2] — хэш правки.

commit-msg

Выполняется после закрытия текстового редактора и перед фиксацией правки. Может быть использован для проверки журнальной записи на соответствие некоторым критериям. Имеет один аргумент:

$*[0] — файл с текстовым сообщением.

post-commit

Запускается после успешной фиксации правки.

Сценарии, связанные с добавление патчей

applypatch-msg

Запускается перед добавлением патча командой git am. Если сценарий возвратит „1“ (exit 1), то патч добавлен не будет, если „0“ (exit 0), то патч будет добавлен. Имеет один аргумент:

$*[0] — временный файл, содержащий журнальную запись.

pre-applypatch

Запускается перед добавлением патча командой git am. Позволяет проверить некоторые изменения в файлах проекта. Если сценарий возвратит „1“ (exit 1), то изменения в файлах будут выставлены, если „0“ (exit 0), то патч будет добавлен. Не имеет аргументов.

post-applypatch

Запускается по завершению добавления патча командой git am. Не позволяет проводить какие-либо проверки и отменять обновление проекта. Не имеет аргументов.

Сценарии, связанные с перебазированием, слиянием и выпиской

pre-rebase

Запускается перед перебазированием. Позволяет проверить некоторые условия перед этой операцией. Если сценарий возвратит „1“ (exit 1), то перебазирование не будет осуществлено, если „0“ (exit 0), то будет. Может иметь два, либо один аргумент:

$*[0] — базовая ветвь;

$*[1] — целевая ветвь (nil, в случае, если перебазируется текущая ветвь).

post-merge

Запускается после успешного слияния. Имеет один аргумент:

$*[0] — флаг, указывающий на тип слияния (0 — обычное, 1 ­ слияние через сжатие).

post-checkout

Запускается после выписки. Имеет три аргумента:

$*[0] — полный хэш последней правки в текущей ветви;

$*[1] — полный хэш последней правки в выписанной ветви;

$*[2] — флаг, указывающий на тип выписки (0 — выписка файла, 1 — выписка ветви).

Серверные закрепленные сценарии

Серверные закрепленные сценарии содержатся в каталоге hooks/ в удаленном репозитории.

pre-receive

Запускается после получения обновлений от клиента, перед добавлением этих обновлений в репозиторий. Будет выполнен один раз, вне зависимости от того, сколько ветвей предполагается обновить. Позволяет отклонять обновления удаленного репозитория. Если сценарий возвращает „1“ (exit 1), то обновления не произойдет, если „0“ (exit 0), то обновление пройдет успешно. Не имеет аргументов.

update

Запускается после получения обновлений от клиента, перед добавлением этих обновлений в репозиторий. Будет выполнен столько раз, сколько ветвей предполагается обновить. Позволяет отклонять обновление определенных ветвей. Если сценарий возвращает „1“ (exit 1), то обновления не произойдет, если „0“ (exit 0), то обновление пройдет успешно. Имеет три аргумента:

$*[0] — полное имя ветви, предполагаемой для обновления;

$*[1] — хэш текущей правки для данной ветви;

$*[2] — хэш последней правки для данной ветви.

post-receive

Запускается после добавления обновлений, полученных от клиента. Будет выполнен один раз, вне зависимости от того сколько ветвей было обновлено. Не имеет аргументов.

Выставление

git add file

выставить файл для фиксации правок

git add -i

выставить желаемые файлы посредством их выбора в интерактивном режиме

Запустится интерактивная утилита. Потребуется выбрать файлы.

git add -p

выставить файлы путем последовательного выбора или отката желаемых правок в интерактивном режиме

Запуститися интерактивная утилита. Потребуется выбрать правки.

git add -e

выставить файлы путем выбора или отката желаемых правок в текстовом редакторе

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

git reset HEAD file

снять выставленный файл

Файл должен находиться в индексе.

git checkout -- file

отменить правки в указанном файле

Файл должен находиться в рабочей области.

git rm file

выставить файл для удаления

Файл должен быть включен в репозиторий. В противном случае, следует использовать средства операционной системы для удаления файла (e. g. rm file).

git rm --cached file

отменить добавление нового неотслеживаемого файла в индекс и вернуть его в рабочую область

git mv old_name new_name

выставить файл для переименования

Откладывание правок

git stash

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

git stash list

вывести список отложенных правок

git stash show stash@{n}

вывести краткие сведения об указанной отложенной правке

git stash show -p stash@{n}

вывести подробные сведения об указанной отложенной правке

git stash apply stash@{n}

добавить n-ую отложенную правку

git drop stash@{n}

удалить n-ую отложенную правку

git stash branch name stash@{n}

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

Фиксация правок

git commit

зафиксировать изменения для всех выставленных файлов

git commit -m message

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

git commit file

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

git commit -a

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

Исправление и откат сделанных передач

git commit --amend -m message

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

git commit --amend -C HEAD

добавить файлы из индекса в уже зафиксированную правку

git commit --amend -a -C HEAD

добавить файлы из рабочей области в уже зафиксированную правку

git revert <хэш> - осуществить передачу, отменяющую изменения в указанной передачи. Если необходимо осуществить отменяющую передачу не для последней передачи, то нужно последовательно выполнить данный тип передачи несколько раз, начиная с последней передачи.
  git revert -n <хэш> - выставить отмененные изменения. При пакетной отмене, можно использовать идиому: git revert -n HEAD; git revert -n HEAD^; git revert -n HEAD^^ и т. д.
  git revert --no-edit <хэш> - не запускать редактор при выполнении отменяющей передачи. В этом случае в качестве журнального сообщения будет присутствовать стандартная запись.

git reset <хэш> - переместится в истории изменений до указанной передачи, удалив все последующие, не выставляя все осуществленные изменения.

  git reset --soft <хэш> - переместиться в истории изменений до указанной передачи, удалив все последующие, выставив все осуществленные изменения.

  git reset --hard <хэш> - переместиться в истории изменений до указанной передачи, удалив все последующие.

git filter-branch --tree-filter 'rm -f <файл>' <ветвь> - удалить указанный файл во всех передачах ветви. Будет создана резервная копия. Удалить её можно следующей командой.

  git update-ref -d <ветвь> <хэш>

Если затем попытаться повторно удалить некий файл уже из другой ветви, то команда возвратит ошибку, сообщающую о невозможности перезаписать резервную копию. Для того, чтобы форсировать перезапись нужно добавить опцию -f к команде.

  git filter-branch -f --tree-filter 'rm -f <файл>' <ветвь>

  git filtrer-branch --tree-filter 'rm -f <файл>' -- --all - удалить указанный файл во всех передачах всех ветвей.

Журналирование

git log

вывести список всех сделанных правок

git log --format=format_string

задать пользовательский формат вывода

Cписок символов форматирования:

%h - укороченный хэш, идентифицирующий правку;

%s - загловок журнальной записи;

%b - содержимое журнальной записи;

%n - новая строка.

git log -number

ограничить перечень выводимых правок заданным числом

git log hash

не отображать правки после заданной указанным хэшем

git log old_hash..[ new_hash ]

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

Правка, соответствующая нижней границе не будет включена в вывод. Верхняя граница может быть опущена. В этом случае, таковой будет считаться последняя сделанная правка.

git log --oneline --left-right --boundary left_branch...right_branch

вывести список правок для двух ветвей с общей правкой

В выводе под каждую правку будет выделена одна строка (--oneline). Вывод будет содержать правки обоих ветвей, а так же общую правку-родителя (--boundary). Информация будет выведена в один столбик. Каждую запись будет предварять либо стрелка влево, либо стрелка вправо, в зависимости от того куда была внесена правка, в левую или в правую ветвь (--left-right). Общая правка будет помечена знаком дефис (-).

git log { --since= | --until= }datetime

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

Формат даты-времени может быть разным. Например:

12012019 — 12 декабря 2019 года;

1201 — 12 декабря текущего года;

12.01.2019 13:00:04 — 12 декабря 2019 года 13:00:04.

git log -p

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

git log --all --graph

отобразить историю правок во всех ветвях в виде графов

git log -- file

отобразить историю правок только для указанного файла

git log branch [ --not base_branch | ^ base_branch ]

отобразить историю правок для указанной ветви

Посредство опции --not имеется возможность исключить из вывода правки, сделанные в ветви на которой основана указанная ветвь.

git log --decorate=format

задать формат отображения ссылок

Перечень возможных значений:

short — укороченный формат: „master“, „origin/master“;

full — полный формат: „refs/heads/master“, „refs/remotes/origin/master“;

auto — при выводе на терминал short, иначе — full;

no — не отображать.

git log --grep='regexp'

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

git rev-parse reference

вывести полный хэш для указанного объекта

В качестве объектов могут выступать правки или аннотированные метки. Хэш аннотированной метки это отдельный хэш, не зависимый от хэша промаркированной правки.

git show reference

вывести подробную информацию об объекте по ссылке

В качестве объектов могут выступать правки или аннотированные метки.

Просмотр изменений

git diff

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

git diff --staged

просмотреть изменения между выставленными файлами и файлами в репозитории

git diff --text

рассматривать двоичные файлы как текстовые (по умолчанию, git игнорирует двоичные файлы и не выводит изменения в них)

git diff --stat

вывести сводный отчет по сделанным изменениям

git diff --check

проверить файл на наличие завершающих пробелов

git diff -Unumber

установить количество отображаемых строк до и после изменённой строки

git diff hash

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

git diff hash file

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

git diff tag..tag

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

git diff base_branch..target_branch

просмотреть изменения между целевой ветвью и общим предком базовой и целевой ветвей

git difftool

просмотреть изменения в специализированной программе

git difftool -y

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

git blame file

просмотреть изменения в файле с включением в вывод хэша, автора, даты и прочей информации

git blame -L starting_line,{ ending_line | -offset | +offset } file

отобразить только указанные строки в просматриваемом файле

Интервал задается указанием номера начальной строки и (опционально) номером конечной строки или количеством строк до или после начальной.

git blame hash{ ^[offset] | ~[offset] } -- file

просмотреть изменения в файле до указанной правки и не включать все последующие

Правка идентифицируется хэшем или отклонением от правки с указанным хэшем (^ — „первый прямой предок указанной“ (если прямых предков несколько), ^n — „n-й прямой предок указанной“, ~n — „указанная, минус n“).

git blame hash..hash -- file

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

Ветвление

git branch - показать все текущие ветви и отметить рабочую.
  git branch -v - показать все ветви, отметить текущую и вывести последнюю передачу для каждой ветви.
  git branch -r - показать все ветви в удаленном репозитории.
  git branch <имя_ветви> <имя_родительской_ветви> - создать ветвь.
  git branch <имя_новой_ветви> <имя_метки> - восстановить ветвь с указанной метки.
  git branch -d <имя_ветви> - удалить ветвь. Ветвь должна быть слита.
    git branch -rd <имя_ветви> - удалить удаленную ветвь.
  git branch -D <имя_ветви> - удалить ветвь вне зависимости от того, слита она или нет.
  git branch -m <прежнее_имя> <новое_имя> - переименовать ветвь.

git checkout <имя_ветви> - выписать указанную ветвь.
  git checkout -b <имя_новой_ветви> <имя_родительской_ветви> - создать новую ветвь и сразу же переключиться на неё.

Слияние

git merge <имя_ветви>

Осуществить прямое слияние текущей ветви с указанной

git merge --no-commit <имя_ветви>

Выствить правки на слияние

git merge --squash <имя_ветви>

Выставить объединенные правки указанной ветви для текущей

git cherry-pick <укороченный_дайджест>

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

git cherry-pick -n|--no-commit <укороченный_дайджест>

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

git mergetool <программа_сравнения>

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

git merge-base <ветвь_1> <ветвь_2>

Найти общего предка между двумя ветвями

git checkout --ours|--theirs <файл>

git add <файл>

Перебазирование

git rebase <базовая_ветвь> <целевая_ветвь> - перебазировать целевую ветвь в конец базовой.
  git rebase <ветвь> - перебазировать текущую ветвь в конец указанной.

git rebase --onto <базовая_ветвь> <ветвь_посредник> <целевая_ветвь> - перебазировать целевую ветвь в конец базовой, исключая предка в ветви посреднике.
  git reabase --onto <базовая_ветвь> <ветвь_посредник> - перебазировать текущую ветвь в конец базовой, исключая предка в ветви посреднике. 

git rebase -i <хэш> - войти в интерактивный режим для изменения порядка передач.

Метки

git tag <метка> <имя_ветви>

Создать легковесную метку для указанной ветви

git tag <метка> <дайджест>

Создать метку для одной из предыдущих правок

git tag -a|--annotate <метка> -m|--message <описание>

Создать аннотированную метку для текущей ветви

git tag

git tag -l|--list

Возвратить список меток

git tag -l|--list -n<номер>

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

git tag -d|--delete <метка>

Удалить указанную метку

Работа с удаленными репозиториями

git clone <URL> - клонировать репозиторий в локальный каталог.

git remote add <имя> <URL> - добавить удаленный репозиторий.
git remote -v - просмотр всех удаленных репозиториев и их URL.
git remote rm <имя> - удалить указанный удаленный репозиторий.

git fetch {<url> | <локальное_имя>} - скачать объекты из указанного удаленного репозитория и не сливать их с имеющимися в локальном репозитории.

git pull {<url> | <локальное_имя>} - скачать объекты из указанного удаленного репозитория и слить их с имеющимися в локальном репозитории.

git push [<имя_удаленного_репозитория>] - обновить удаленный репозиторий.
  git push --dry-run - имитировать обновление репозитория.
  git push <репозиторий> <ветвь> - обновить удаленный репозиторий, добавив в него только указанную ветвь.
  git push <репозиторий> <ветвь>:<имя_в_удаленном_репозитории> - обновить удаленный репозиторий, добавив в него указанную ветвь, но сохранив её под другим именем.
  git push <удаленный_репозиторий> :<удаляемая_ветвь> - удалить указанную ветвь из удаленного репозитория.
  git push -f - осуществить настойчивое обновление.
  git push --tags - добавить в репозиторий все имеющиеся метки.

  git request-pull <начальная_ссылка> <url_репозитория> [<конечная_ссылка>] - вывысти на экран сводную статистику по передачам, ожидающим вытягивания со стороны менеджера.

Субмодули

git submodule - просмотреть субмодули.
  git submodule add <репозиторий> <имя> - создать директорую с указанным именем и добавить в неё указанный репозиторий.
  git submodule init <имя> - инициализировать (добавить запись о субмодуле в .git/config) указанный субмодуль.
  git submodule update <имя> - обновить субмодуль.

Архивирование

git archive --format=<tar | zip> --prefix=<имя>/ <ветвь> - поместить все файлы проекта в директорию с указанным именем и создать архив указанного формата.

  git archive --format=tar --prefix=<имя>/ <ветвь> | gzip > <имя>.tar.gz - поместить все файлы в директорию с указанным именем, создать архив формата tar и сжать этот архив, сохраняя в файле .tar.gz.

  git archive --prefix=<имя>/ <ветвь> | gzip > `git describe --tags master`.tar.gz - поместить все файлы в директорию с указанным именем, создать архив формата по умолчанию (tar) и сжать этот архив, сохраняя в файле с именем являющимся выводом команды git-describe, добавляя расширение .tar.gz.

    git describe --tags <ветвь> - показать самую последнюю созданную метку, учитывая неаннотированные метки. Вывод команды имеет следующий формат: <имя_тэга>-<количество_сделанных_передач>-g<хэш_последней_передачи>. "g" в выводе означает, что используется VCS git.

Патчи

git format-patch [<начальная_передача> | <начальная_передача>..<конечная_передача>] - подготовить файлы с патчами для отправки по электронной почте. Использовать либо все передачи начиная с начальной до текущей, либо все передачи в указанном интервале.

  git format-patch -o <директория_вывода> - подготовить файлы патчей и сохранить их в указанной директории.

  git format-patch --stdout - подготовить файлы патчей и вывести их содержимое в консоль.

git apply <файл_патча> - добавить изменения в файлы проекта из файла патча. Подобным образом можно добавлять файлы, созданные с помощью следующих команд.

  $ git diff <старт-метка>..<финиш-метка> > <имя>.patch
  $ git log -p <старт-метка>..<финиш-метка> > <имя>.patch

git am {<mbox-файл> | <файл_патча>} - добавить изменения в файлы проекта из файла патча. Подобным образом можно добавлять файлы, созданный с помощью следующей команды.

  $ git format patch <старт-метка>..<финиш_метка> -о <директория>

  git am -i {<mbox-файл> | <файл-патча>} - добавить изменеия в файлы проекта в интерактивном режиме.

  git am -3 {<mbox-файл> | <файл-патча>} - добавить изменения в файлы проекта. При возникновении конфлика добавить конфликтные маркеры в файлы с конфликтами.

Отправка патчей по электронной почте

Для отправки почты необходимо установить пакет sendmail.

git send-email --from=<адрес_отправителя> --to=<адрес_получателя> {<список_файлов> | <директория>} - отправить на указанный адрес либо перечисленные файлы патчей, либо все файлы в указанной директории.

   Настройка git send-email
  --------------------------
    # ~/.gitconfig
    [sendemail]
      smtpserver = <адрес_smtp-сервера> (smtp.gmail.com)
      smtpserverport = <порт_smpt-сервера> ({587 | 465})
      smtpencryption = <криптографический_протокол> ({tls | ssl})
      smtpuser = <логин> (login@gmail.com)
      smtppass = <пароль> (password)
      from = <адрес_отправителя>
      to = <адрес_получателя>
      confirm = {always | never}

git format-patch --stdout {<начальная_передача> | <интервал>} | git imap-send - загрузить файлы патчей в директорию с черновиками на почтовом сервере.

   Настройка git imap-send
  -------------------------
    # ~/.gitconfig
    [imap]
      folder = <директория_с_черновиками> ([Gmail]/Черновики)
      host = <адрес_почтового_сервера> ({imaps:// | imap://}imap.gmail.com)
      port = <порт_почтового_сервера> ({993 | 143})
      user = <логин> (login@gmail.com)
      pass = <пароль> (password)
      sslverify = <логическое_значение> ({false | true})

Восстановление и очистка

git gc - удалить ненужные файлы и произвести оптимизацию локального репозитория.

git reflog - отобразить журнал изменений.

Пошаговый поиск проблемных передач

git bisect start <проблемная_передача> <беспроблемная_передача> - начать пошаговый поиск в указанном интервале.

  git bisect bad  - отметить передачу как проблемную.
  git bisect good - отметить передачу как беспроблемную.

  git bisect reset - закончить пошаговый поиск.

    git bisect reset <метка> - закончить пошаговый поиск и установить указатель HEAD на отмеченную передачу.

Примеры

Создание локального репозитория

1. $ mkdir project; cd project; git init
2. $ touch README; git add .; git commit -m 'init'
3. $ mkdir ../project.git; git init --bare ../project.git
4. $ git remote add origin file://<путь_к_project.git>
5. $ git push origin master

Добавление субмодуля

1. $ git submodule add <путь> <имя>
2. $ git submodule init <имя>

Добавления субмодуля в составе склонированного репозитория

1. $ git submodule init <имя>
2. $ git submodule update <имя>

Исправление журнальной записи передачи

1. $ git rebase -i <хэш_родительской_передачи_для_проблемной>
2. Откроется текстовый редактор с перечнем передач.
3. Сменить метки pick на edit во всех проблемных передачах.
4. Сохранить изменения и закрыть редактор.
5. $ git commit --amend
6. Откроется редактор с текстом журнальной записи.
7. Исправить запись, сохранить изменения, закрыть редактор.
8. $ git rebase --continue
9. Повторить шаги 5-8 для всех проблемных передач.

Разбивка одной передачи на несколько

1. $ git rebase -i <метка>
2. Откроется текстовый редактор с перечнем передач.
3. Сменить метку pick на edit в проблемной передаче.
4. $ git reset HEAD^
5. Измененный файл окажется в невыставленной области.
6. $ git add -e
7. Отредактировать файл, добавляя необходимые изменения.
8. $ git commit
9. Повторить шаги 6-8 для всех изменений.
10. $ git rebase --continue