diff --git a/git-tutorial.lyx b/git-tutorial.lyx index 6331912..efda856 100644 --- a/git-tutorial.lyx +++ b/git-tutorial.lyx @@ -1,5 +1,5 @@ -#LyX 2.0 created this file. For more info see http://www.lyx.org/ -\lyxformat 413 +#LyX 2.1 created this file. For more info see http://www.lyx.org/ +\lyxformat 474 \begin_document \begin_header \textclass article @@ -36,13 +36,13 @@ foottoend \font_roman default \font_sans default \font_typewriter default +\font_math auto \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 - \graphics default \default_output_format default \output_sync 0 @@ -66,15 +66,24 @@ foottoend \pdf_pdfusetitle true \papersize default \use_geometry true -\use_amsmath 1 -\use_esint 1 -\use_mhchem 1 -\use_mathdots 1 +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 \cite_engine basic +\cite_engine_type default +\biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false +\justification true \use_refstyle 1 \index Index \shortcut idx @@ -118,7 +127,7 @@ February 27, 2013 \end_layout \begin_layout Date -Версия 1.3.0 +Версия 1.3.1 \end_layout \begin_layout Standard @@ -264,7 +273,7 @@ lease/ . Полученный приватный ключ id_rsa следует хранить в безопасном от чужих глаз месте (в случае получения доступа к нему 3-их лиц следует сгенерировать - новый, а старый - удалить с Git-сервера). + новый, а старый публичный ключ (.pub) - удалить с Git-сервера). \end_layout \begin_layout Standard @@ -381,6 +390,13 @@ Initial commit. . \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Индексом в Git называется промежуточное хранилище изменений, попадающих в ближайший коммит. @@ -458,6 +474,13 @@ begin_layout Subsubsection Stage this hunk [y,n,q,a,d,/,e,?]? y \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Параметр -m у команды commit указывает на то, что следующим аргументом команды следует описание коммита, что удобно, когда нужно коммит сделать быстро. @@ -616,6 +639,13 @@ $ git status -s # использовать сокращённую запись ?? git-tutorial.pdf \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Сами изменения можно посмотреть командой diff: \end_layout @@ -700,7 +730,7 @@ status collapsed \end_inset -\begin_inset Caption +\begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label @@ -824,6 +854,13 @@ git branch -d featureA # удаление ветки featureA \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard При работе с системами управления проектами (ChilliProject, Redmine, Trac) по завершении работы с ветвью имеет смысл добавлять в сообщение коммита @@ -858,6 +895,13 @@ Bug B fixed. \end_inset +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + \end_layout \begin_layout Standard @@ -870,6 +914,13 @@ Bug B fixed. git merge --squash \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Иногда в списке удалённых веток (git branch -r) остаются несуществующие ссылки в результате того, что кто-то удалил эту ветвь или несколько веток @@ -910,6 +961,13 @@ git branch -d -r github/invalid_branch2 git push \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Также возможны более сложные операции, к примеру: \end_layout @@ -1039,6 +1097,13 @@ git blame -L 40,+21 main.c # вывести информацию о 21-ой с с 40-ой \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Если требуется отфильтровать слишком старую историю, можно это сделать следующим образом: @@ -1054,6 +1119,13 @@ git blame --since=3.weeks -- main.c # игнорировать информац недель \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Вот пример, как можно посчитать общий вклад разработчиков в конкретный файл проекта: @@ -1099,6 +1171,13 @@ git blame --line-porcelain mainform.cpp | sed -n 's/^author //p' | sort | git clone git@git.insysltd.ru:~user1/test_project/user1-test_repo.git \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Если репозиторий содержит субрепозитории (submodules) необходимо их инициализиро вать и синхронизировать: @@ -1162,6 +1241,13 @@ git format-patch master # создать патч, включающий отли от ветки master \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Далее полученный патч может быть отправлен по email или прямо в окно Jabber-клие нта. @@ -1173,6 +1259,13 @@ git format-patch master --stdout | mail -s 'Please apply this patch, Leo' leo@matrix.org \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Применить полученный патч можно командой apply: \end_layout @@ -1213,7 +1306,10 @@ git branch -r # список удалённых веток git branch -a # список всех веток, включая удалённые \end_layout -\begin_layout LyX-Code +\begin_layout Standard +\begin_inset space ~ +\end_inset + \end_layout @@ -1264,6 +1360,13 @@ git log --graph --decorate --stat -stat -- печатать статистику по изменениям в каждом файле. \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Если нужно вывести лог на определённом временном промежутке, через две точки вводится начало и конец: @@ -1277,6 +1380,13 @@ git log master..develop git log f8a32c..3ab98c \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Можно исключать из выводимого списка коммиты, входящие в какую-либо ветвь, например следующая команда выведет список коммитов из develop, не вошедшие @@ -1287,6 +1397,13 @@ git log f8a32c..3ab98c git log develop ^master \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Более полный список опций описан в руководстве (git help log). \end_layout @@ -1421,6 +1538,13 @@ git stash apply # применить спрятанные измен их из stash-списка \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Можно получить любую версию файла или директории посредством команды checkout: \end_layout @@ -1439,6 +1563,13 @@ git checkout . # получить из головы (HEAD) содержимое текущей директории \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Можно отменить изменения, попавшие в индекс для следующего коммита: \end_layout @@ -1451,6 +1582,13 @@ git reset # очистить индекс git reset main.h # убрать из индекса main.h \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Вся история команд работы с Git хранится в локальном списке reflog: \end_layout @@ -1645,6 +1783,13 @@ git rebase --continue # обновить все последующие комм git push -f # отправить изменённую ветвь на Git-сервер \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Также, в некоторых случаях бывает необходимо отредактировать самый первый коммит (root-commit): @@ -1692,6 +1837,13 @@ git commit -m # во второй коммит. \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Объединение нескольких коммитов в один можно выполнить ещё проще: \end_layout @@ -1708,6 +1860,13 @@ git rebase -i -p HEAD~5 # которые хотим объединить, сохранить. \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Разбить произвольный коммит на два последовательных коммита можно следующими командами: @@ -1831,6 +1990,13 @@ ABC/ \end_layout \end_deeper +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Для этого воспользуемся командой filter-branch, изменяющей историю. \end_layout @@ -1874,6 +2040,13 @@ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch # оставив ABC \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Аналогично создаётся репозиторий для XYZ \end_layout @@ -1901,6 +2074,13 @@ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch --prune-empty --tag-name-filter cat -- --all \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard По опциям команды filter-branch смотрите документацию (git help filter-branch). \end_layout @@ -1929,6 +2109,13 @@ git reset --soft HEAD~1 # удалить последний коммит, сох \end_inset +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + \end_layout \begin_layout Standard @@ -2132,6 +2319,13 @@ git bisect skip # пропустить текущую ревизию git bisect reset # закончить двоичный поиск \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Как только bisect нашёл источник ошибки - ревизию, в которой она была внесена, для нахождения ошибки остаётся проанализировать изменения в одном текущем @@ -2163,6 +2357,61 @@ git bisect reset # закончить двоичный поиск выпуском новой версии и слиянием исправлений в master и develop. \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + +\begin_layout Standard +Случаются ситуации, когда в дереве истории Git нужно найти коммит, где ошибка + была исправлена, например, чтобы сообщить мэнтайнеру проекта для отметки + в баг-трекере или бэкпортирования (cherry-pick) в другие долгие +\begin_inset Quotes eld +\end_inset + +longtime +\begin_inset Quotes erd +\end_inset + + ветки проекта. + Для этого используются все те же самые команды, только вместо git bisect + bad нужно вводить git bisect good и наоборот, так как вместо +\begin_inset Quotes eld +\end_inset + +плохого +\begin_inset Quotes erd +\end_inset + + ( +\begin_inset Quotes eld +\end_inset + +bad +\begin_inset Quotes erd +\end_inset + +) коммита с ошибкой мы ищем +\begin_inset Quotes eld +\end_inset + +хороший +\begin_inset Quotes erd +\end_inset + + ( +\begin_inset Quotes eld +\end_inset + +good +\begin_inset Quotes erd +\end_inset + +) коммит с нужным исправлением. +\end_layout + \begin_layout Subsection cherry-pick - обмен коммитами между ветками \end_layout @@ -2276,6 +2525,13 @@ Added my-lib submodule. git push \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Команда \end_layout @@ -2350,6 +2606,13 @@ git checkout -b mylib_branch mylib_remote/master git checkout master \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Допустим, мы хотим поместить проект mylib в подкаталог с тем же именем: \end_layout @@ -2358,6 +2621,13 @@ git checkout master git read-tree --prefix=mylib/ -u mylib_branch \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard В отличие от субмодулей данные поддерева хранятся физически в репозитории. Субмодули же, по своей сути, лишь ссылаются на данные в другом репозитории. @@ -2388,6 +2658,13 @@ git merge --squash -s subtree --no-commit mylib_branch # смержить в myl git commit # зафиксировать изменения \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Узнать о наличии разницы между подкаталогом mylib/ и кодом в mylib_branch можно при помощи @@ -2506,6 +2783,13 @@ git fsck git fsck # выполнить проверку \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Иногда случается, что объект добавлен в индекс \begin_inset Quotes eld @@ -2589,7 +2873,7 @@ status collapsed \end_inset -\begin_inset Caption +\begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label @@ -2751,7 +3035,7 @@ status collapsed \end_inset -\begin_inset Caption +\begin_inset Caption Standard \begin_layout Plain Layout Децентрализованный, но централизованный @@ -2809,7 +3093,7 @@ status collapsed \end_inset -\begin_inset Caption +\begin_inset Caption Standard \begin_layout Plain Layout Главные ветви @@ -2834,6 +3118,13 @@ master develop \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Ветвь master создаётся при инициализации репозитория, что должно быть знакомо каждому пользователю Git. @@ -2907,6 +3198,13 @@ production-ready Ветви исправлений (Hotfix branches) \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard У каждого типа ветвей есть своё специфическое назначение и строгий набор правил, от каких ветвей они могут порождаться, и в какие должны вливаться. @@ -2942,7 +3240,7 @@ status collapsed \end_inset -\begin_inset Caption +\begin_inset Caption Standard \begin_layout Plain Layout Ветви функциональностей (feature branches) @@ -3052,6 +3350,13 @@ Deleted branch myfeature (was 05e9557). $ git push origin develop \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Флаг --no-ff вынуждает Git всегда создавать новый объект коммита при слиянии, даже если слияние может быть осуществлено алгоритмом fast-forward. @@ -3080,7 +3385,7 @@ status collapsed \end_inset -\begin_inset Caption +\begin_inset Caption Standard \begin_layout Plain Layout no-fast-forward VS fast-forward @@ -3211,6 +3516,13 @@ $ git commit -a -m "Bumped version number to 1.2" 1 files changed, 1 insertions(+), 1 deletions(-) \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Мы создали новую ветку, переключились в неё, а затем выставили номер версии (bump version number). @@ -3282,6 +3594,13 @@ Merge made by recursive. $ git tag -a 1.2 \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Теперь релиз издан и помечен тегом. \end_layout @@ -3321,6 +3640,13 @@ Merge made by recursive. (Отчёт об изменениях) \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Этот шаг, в принципе, может привести к конфликту слияния (нередко бывает, что к причиной конфликта является изменение номера версии проекта). @@ -3361,7 +3687,7 @@ status collapsed \end_inset -\begin_inset Caption +\begin_inset Caption Standard \begin_layout Plain Layout Ветви исправлений (hotfix branches) @@ -3448,6 +3774,13 @@ $ git commit -a -m "Bumped version number to 1.2.1" 1 files changed, 1 insertions(+), 1 deletions(-) \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Не забывайте обновлять номер версии после создания ветви! \end_layout @@ -3509,6 +3842,13 @@ Merge made by recursive. $ git tag -a 1.2.1 \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard \series bold @@ -3542,6 +3882,13 @@ Merge made by recursive. (Отчёт об изменениях) \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard У этого правила есть одно исключение: \series bold @@ -3672,6 +4019,13 @@ git config --global user.email "you@example.com" git config --global user.name "Your Name" \end_layout +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\end_layout + \begin_layout Standard Опция --global указывает, что настройки должны быть применены глобально, а не только к текущему репозиторию.