Merge branch 'release-1.3.0'
This commit is contained in:
commit
36346b62a8
362
git-tutorial.lyx
362
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
|
||||
|
|
Loading…
Reference in New Issue