diff --git a/git-tutorial.lyx b/git-tutorial.lyx index 376cfd1..6331912 100644 --- a/git-tutorial.lyx +++ b/git-tutorial.lyx @@ -118,7 +118,7 @@ February 27, 2013 \end_layout \begin_layout Date -Версия 1.2.0 +Версия 1.3.0 \end_layout \begin_layout Standard @@ -1020,6 +1020,62 @@ Add collaborators и установить для добавленных поль и т.п. \end_layout +\begin_layout Subsubsection +Авторство и время редактирования строк +\end_layout + +\begin_layout Standard +Следующий пример покажет авторство, ревизии последних правок и время для + нескольких строк в файле исходного кода main.c: +\end_layout + +\begin_layout LyX-Code +git blame -L 40,60 main.c # вывести информацию о строках с 40 по 60 включительн +о +\end_layout + +\begin_layout LyX-Code +git blame -L 40,+21 main.c # вывести информацию о 21-ой строке, начиная + с 40-ой +\end_layout + +\begin_layout Standard +Если требуется отфильтровать слишком старую историю, можно это сделать следующим + образом: +\end_layout + +\begin_layout LyX-Code +git blame v2.6.18.. + -- main.c # игнорировать информацию, старше версии 2.6.18 +\end_layout + +\begin_layout LyX-Code +git blame --since=3.weeks -- main.c # игнорировать информацию, старше 3-х + недель +\end_layout + +\begin_layout Standard +Вот пример, как можно посчитать общий вклад разработчиков в конкретный файл + проекта: +\end_layout + +\begin_layout LyX-Code +git blame --line-porcelain mainform.cpp | sed -n 's/^author //p' | sort | + uniq -c | sort -rn +\end_layout + +\begin_layout LyX-Code + 1526 Kolan Sh +\end_layout + +\begin_layout LyX-Code + 691 egor_i@egor-837.insysltd.ru +\end_layout + +\begin_layout LyX-Code + 167 egor_i@EGOR-837 +\end_layout + \begin_layout Subsubsection Клонирование \end_layout @@ -1849,6 +1905,105 @@ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch По опциям команды filter-branch смотрите документацию (git help filter-branch). \end_layout +\begin_layout Subsubsection +Удаление коммита из истории +\end_layout + +\begin_layout Standard +Удаление последнего созданного коммита осуществляется одной командой и всегда + завершается успехом. +\end_layout + +\begin_layout LyX-Code +git reset --hard HEAD~1 # удалить последний коммит +\end_layout + +\begin_layout LyX-Code +git reset --soft HEAD~1 # удалить последний коммит, сохранив изменения в + +\begin_inset Quotes eld +\end_inset + +незакомиченными +\begin_inset Quotes erd +\end_inset + + +\end_layout + +\begin_layout Standard +Удаление коммита из глубин истории не всегда может быть выполнено успешно, + может потребоваться разрешение конфликтов. +\end_layout + +\begin_layout LyX-Code +git rebase -i --preserve-merges HEAD~10 # редактировать последние 10 коммитов, + сохраняя слияния +\end_layout + +\begin_layout LyX-Code +# В редакторе отметить удаляемый коммит для редактирования +\begin_inset Quotes eld +\end_inset + +edit +\begin_inset Quotes erd +\end_inset + + +\end_layout + +\begin_layout LyX-Code +git reset --hard HEAD~1 # удалить требуемый коммит +\end_layout + +\begin_layout LyX-Code +git rebase --continue # продолжить перепостроение истории, начиная с удалённого + коммита +\end_layout + +\begin_layout Subsubsection +Синхронизация веток +\end_layout + +\begin_layout Standard +По аналогии с командой git pull --rebase для принятия удалённых изменений + с перемещением локальных коммитов на вершину истории синхронизация веток + может осуществляться и локально. +\end_layout + +\begin_layout LyX-Code +# Синхронизировать текущую ветку с веткой branch1, переместив коммиты, +\end_layout + +\begin_layout LyX-Code +# отсутствующие в branch1 на вершину истории +\end_layout + +\begin_layout LyX-Code +git rebase branch1 +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +# Синхронизировать текущую ветку с удалённой, переместив коммиты, +\end_layout + +\begin_layout LyX-Code +# отсутствующие в origin/master на вершину истории +\end_layout + +\begin_layout LyX-Code +git fetch origin master +\end_layout + +\begin_layout LyX-Code +git rebase origin/master +\end_layout + \begin_layout Subsection Пример использования gitflow \end_layout @@ -2079,6 +2234,10 @@ git cherry-pick --ff ..next # если история линейная и Субрепозитории \end_layout +\begin_layout Subsubsection +Субмодули +\end_layout + \begin_layout Standard Или так называемые Git submodules. Применяются для включения одних проектов в другие или для создания суперпроекто @@ -2163,6 +2322,97 @@ my-lib submodule updated. \end_layout +\begin_layout Subsubsection +Поддеревья +\end_layout + +\begin_layout Standard +Или так называемые Git subtrees. +\end_layout + +\begin_layout Standard +Вначале нужно добавить репозиторий, который будет использоваться как subtree: +\end_layout + +\begin_layout LyX-Code +git remote add mylib_remote git@git.insysltd.ru:insys/mylib.git +\end_layout + +\begin_layout LyX-Code +git fetch mylib_remote +\end_layout + +\begin_layout LyX-Code +git checkout -b mylib_branch mylib_remote/master +\end_layout + +\begin_layout LyX-Code +git checkout master +\end_layout + +\begin_layout Standard +Допустим, мы хотим поместить проект mylib в подкаталог с тем же именем: +\end_layout + +\begin_layout LyX-Code +git read-tree --prefix=mylib/ -u mylib_branch +\end_layout + +\begin_layout Standard +В отличие от субмодулей данные поддерева хранятся физически в репозитории. + Субмодули же, по своей сути, лишь ссылаются на данные в другом репозитории. +\end_layout + +\begin_layout Standard +Обновление поддерева происходит довольно легко: +\end_layout + +\begin_layout LyX-Code +git checkout mylib_branch # переключиться на ветку поддерева +\end_layout + +\begin_layout LyX-Code +git pull # принять удалённые изменения +\end_layout + +\begin_layout LyX-Code +git checkout master # переключиться на версию основного проекта +\end_layout + +\begin_layout LyX-Code +git merge --squash -s subtree --no-commit mylib_branch # смержить в mylib/, + не создавая коммита +\end_layout + +\begin_layout LyX-Code +git commit # зафиксировать изменения +\end_layout + +\begin_layout Standard +Узнать о наличии разницы между подкаталогом mylib/ и кодом в mylib_branch + можно при помощи +\begin_inset Quotes eld +\end_inset + +git diff-tree +\begin_inset Quotes erd +\end_inset + +: +\end_layout + +\begin_layout LyX-Code +git diff-tree -p mylib_branch # сравнить с локальной веткой +\end_layout + +\begin_layout LyX-Code +git diff-tree -p mylib_remote/master # сравнить с удалённой веткой +\end_layout + +\begin_layout Section +Администрирование +\end_layout + \begin_layout Subsection Свободное место на диске \end_layout @@ -2185,6 +2435,116 @@ git gc --aggressive --prune # удалить все бесполезные об локальный репозиторий \end_layout +\begin_layout Subsection +Создание архива +\end_layout + +\begin_layout Standard +Иногда для передачи снимка исходного кода третьим лицам требуется создать + архив, не включая Git-специфичных данных и временных файлов, созданных + в процессе сборки проекта. + Для этой цели существует команда +\begin_inset Quotes eld +\end_inset + +git archive +\begin_inset Quotes erd +\end_inset + +. +\end_layout + +\begin_layout LyX-Code +git archive -o myproject-1.0.0.zip v1.0.0 > # создать Zip-архив 1-ой стабильной + версии проекта +\end_layout + +\begin_layout LyX-Code +git archive --format=tgz --prefix=myproject-master/ master > myproject-master.tgz + # архивировать +\end_layout + +\begin_layout LyX-Code + + # ветку master +\end_layout + +\begin_layout LyX-Code +git archive -o myproject-doc.zip HEAD:Documentation/ # создать архив с документац +ией +\end_layout + +\begin_layout Subsection +Проверка целостности репозитория +\end_layout + +\begin_layout Standard +Git являет по своей сути файловую систему, расположенную внутри другой файловой + системы (на диске). + Иногда в работе компьютера случаются сбои и файловая система компьютера + может быть повреждена. + Также существует ненулевая вероятность повреждения системы объектов репозитория + в результате типовой работы (напр., использование нестабильной версии Git), + хотя она крайне мала. +\end_layout + +\begin_layout Standard +Для проверки целостности объектов бд и истории репозитория имеется команда + +\begin_inset Quotes eld +\end_inset + +git fsck +\begin_inset Quotes erd +\end_inset + +. + Примеры использования: +\end_layout + +\begin_layout LyX-Code +git fsck # выполнить проверку +\end_layout + +\begin_layout Standard +Иногда случается, что объект добавлен в индекс +\begin_inset Quotes eld +\end_inset + +git add +\begin_inset Quotes erd +\end_inset + +, а впоследствии удалён по ошибке, например командой +\begin_inset Quotes eld +\end_inset + +git reset --hard +\begin_inset Quotes erd +\end_inset + +. + В Git предусмотрена возможность восстановления данных и на этот случай, + пример: +\end_layout + +\begin_layout LyX-Code +git add main.c # добавили изменения в индекс +\end_layout + +\begin_layout LyX-Code +git reset --hard # случайно откатились к вершине истории +\end_layout + +\begin_layout LyX-Code +git fsck --lost-found # с большой долей вероятности изменённый main.c находится +\end_layout + +\begin_layout LyX-Code + # в .git/lost-found/other, только в место имени хеш + ревизии +\end_layout + \begin_layout Section Удачная модель ветвления \end_layout