Merge branch '#623_code_lists' into develop
This commit is contained in:
commit
5744c8b407
299
git-tutorial.lyx
299
git-tutorial.lyx
|
@ -390,6 +390,13 @@ Initial commit.
|
|||
.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Индексом в Git называется промежуточное хранилище изменений, попадающих
|
||||
в ближайший коммит.
|
||||
|
@ -467,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 указывает на то, что следующим аргументом команды
|
||||
следует описание коммита, что удобно, когда нужно коммит сделать быстро.
|
||||
|
@ -625,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
|
||||
|
@ -833,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)
|
||||
по завершении работы с ветвью имеет смысл добавлять в сообщение коммита
|
||||
|
@ -867,6 +895,13 @@ Bug B fixed.
|
|||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
@ -879,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) остаются несуществующие
|
||||
ссылки в результате того, что кто-то удалил эту ветвь или несколько веток
|
||||
|
@ -919,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
|
||||
|
@ -1048,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
|
||||
Если требуется отфильтровать слишком старую историю, можно это сделать следующим
|
||||
образом:
|
||||
|
@ -1063,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
|
||||
Вот пример, как можно посчитать общий вклад разработчиков в конкретный файл
|
||||
проекта:
|
||||
|
@ -1108,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) необходимо их инициализиро
|
||||
вать и синхронизировать:
|
||||
|
@ -1171,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-клие
|
||||
нта.
|
||||
|
@ -1182,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
|
||||
|
@ -1222,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
|
||||
|
||||
|
@ -1273,6 +1360,13 @@ git log --graph --decorate --stat
|
|||
-stat -- печатать статистику по изменениям в каждом файле.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Если нужно вывести лог на определённом временном промежутке, через две точки
|
||||
вводится начало и конец:
|
||||
|
@ -1286,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, не вошедшие
|
||||
|
@ -1296,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
|
||||
|
@ -1430,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
|
||||
|
@ -1448,6 +1563,13 @@ git checkout .
|
|||
# получить из головы (HEAD) содержимое текущей директории
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Можно отменить изменения, попавшие в индекс для следующего коммита:
|
||||
\end_layout
|
||||
|
@ -1460,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
|
||||
|
@ -1654,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):
|
||||
|
@ -1701,6 +1837,13 @@ git commit -m
|
|||
# во второй коммит.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Объединение нескольких коммитов в один можно выполнить ещё проще:
|
||||
\end_layout
|
||||
|
@ -1717,6 +1860,13 @@ git rebase -i -p HEAD~5
|
|||
# которые хотим объединить, сохранить.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Разбить произвольный коммит на два последовательных коммита можно следующими
|
||||
командами:
|
||||
|
@ -1840,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
|
||||
|
@ -1883,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
|
||||
|
@ -1910,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
|
||||
|
@ -1938,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
|
||||
|
@ -2141,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 нашёл источник ошибки - ревизию, в которой она была внесена,
|
||||
для нахождения ошибки остаётся проанализировать изменения в одном текущем
|
||||
|
@ -2172,6 +2357,13 @@ git bisect reset # закончить двоичный поиск
|
|||
выпуском новой версии и слиянием исправлений в master и develop.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Случаются ситуации, когда в дереве истории Git нужно найти коммит, где ошибка
|
||||
была исправлена, например, чтобы сообщить мэнтайнеру проекта для отметки
|
||||
|
@ -2333,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
|
||||
|
@ -2407,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
|
||||
|
@ -2415,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
|
||||
В отличие от субмодулей данные поддерева хранятся физически в репозитории.
|
||||
Субмодули же, по своей сути, лишь ссылаются на данные в другом репозитории.
|
||||
|
@ -2445,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
|
||||
можно при помощи
|
||||
|
@ -2563,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
|
||||
|
@ -2891,6 +3118,13 @@ master
|
|||
develop
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Ветвь master создаётся при инициализации репозитория, что должно быть знакомо
|
||||
каждому пользователю Git.
|
||||
|
@ -2964,6 +3198,13 @@ production-ready
|
|||
Ветви исправлений (Hotfix branches)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
У каждого типа ветвей есть своё специфическое назначение и строгий набор
|
||||
правил, от каких ветвей они могут порождаться, и в какие должны вливаться.
|
||||
|
@ -3109,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.
|
||||
|
@ -3268,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).
|
||||
|
@ -3339,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
|
||||
|
@ -3378,6 +3640,13 @@ Merge made by recursive.
|
|||
(Отчёт об изменениях)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Этот шаг, в принципе, может привести к конфликту слияния (нередко бывает,
|
||||
что к причиной конфликта является изменение номера версии проекта).
|
||||
|
@ -3505,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
|
||||
|
@ -3566,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
|
||||
|
@ -3599,6 +3882,13 @@ Merge made by recursive.
|
|||
(Отчёт об изменениях)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
\begin_inset space ~
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
У этого правила есть одно исключение:
|
||||
\series bold
|
||||
|
@ -3729,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 указывает, что настройки должны быть применены глобально,
|
||||
а не только к текущему репозиторию.
|
||||
|
|
Loading…
Reference in New Issue