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
|
\end_layout
|
||||||
|
|
||||||
\begin_layout Date
|
\begin_layout Date
|
||||||
Версия 1.2.0
|
Версия 1.3.0
|
||||||
\end_layout
|
\end_layout
|
||||||
|
|
||||||
\begin_layout Standard
|
\begin_layout Standard
|
||||||
|
@ -1020,6 +1020,62 @@ Add collaborators и установить для добавленных поль
|
||||||
и т.п.
|
и т.п.
|
||||||
\end_layout
|
\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
|
\begin_layout Subsubsection
|
||||||
Клонирование
|
Клонирование
|
||||||
\end_layout
|
\end_layout
|
||||||
|
@ -1849,6 +1905,105 @@ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch
|
||||||
По опциям команды filter-branch смотрите документацию (git help filter-branch).
|
По опциям команды filter-branch смотрите документацию (git help filter-branch).
|
||||||
\end_layout
|
\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
|
\begin_layout Subsection
|
||||||
Пример использования gitflow
|
Пример использования gitflow
|
||||||
\end_layout
|
\end_layout
|
||||||
|
@ -2079,6 +2234,10 @@ git cherry-pick --ff ..next # если история линейная и
|
||||||
Субрепозитории
|
Субрепозитории
|
||||||
\end_layout
|
\end_layout
|
||||||
|
|
||||||
|
\begin_layout Subsubsection
|
||||||
|
Субмодули
|
||||||
|
\end_layout
|
||||||
|
|
||||||
\begin_layout Standard
|
\begin_layout Standard
|
||||||
Или так называемые Git submodules.
|
Или так называемые Git submodules.
|
||||||
Применяются для включения одних проектов в другие или для создания суперпроекто
|
Применяются для включения одних проектов в другие или для создания суперпроекто
|
||||||
|
@ -2163,6 +2322,97 @@ my-lib submodule updated.
|
||||||
|
|
||||||
\end_layout
|
\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
|
\begin_layout Subsection
|
||||||
Свободное место на диске
|
Свободное место на диске
|
||||||
\end_layout
|
\end_layout
|
||||||
|
@ -2185,6 +2435,116 @@ git gc --aggressive --prune # удалить все бесполезные об
|
||||||
локальный репозиторий
|
локальный репозиторий
|
||||||
\end_layout
|
\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
|
\begin_layout Section
|
||||||
Удачная модель ветвления
|
Удачная модель ветвления
|
||||||
\end_layout
|
\end_layout
|
||||||
|
|
Loading…
Reference in New Issue