Основные команды и определения
- Коммиты
- Ветвления
- Слияния
- Git Rebase
- HEAD
- Относительные ссылки
- Перемещение ветки (branch forcing)
- Отмена изменений в Git
- Git Reset
- Git Revert
- Git Cherry-pick
- Git Interactive Rebase
Коммиты
Коммит в git-репозитории хранит снимок всех файлов в директории. Коммит — это набор изменений или «дельта» между текущей версией и предыдущей.
Код | Описание |
---|---|
git commit |
Коммит |
Ветвления
Ветки — это просто ссылки на определённый коммит — ничего более.
Код | Описание |
---|---|
git branch [name] |
Создание ветки |
git checkout [name] |
Переключение ветки |
Слияния
Слияния в Git создают особый вид коммита, который имеет сразу двух родителей. Коммит с двумя родителями обычно означает, что мы хотим объединить изменения из одного коммита с другим коммитом и всеми их родительскими коммитами.
Код | Описание |
---|---|
git merge [name] |
Слияние веток |
Git Rebase
При rebase
Git по сути копирует набор коммитов и переносит их в другое место. Преимущество rebase
в том, что c его помощью можно делать чистые и красивые линейные последовательности коммитов. История коммитов будет чище, если вы применяете rebase.
Код | Описание |
---|---|
git rebase [name] |
Rebase |
HEAD
HEAD — это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данным момент работаем. HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.
Отделение (detaching) HEAD
Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту.
Код | Описание |
---|---|
HEAD -> master -> C1 |
|
git checkout C1 |
|
HEAD -> C1 |
Отделение (detaching) HEAD |
Относительные ссылки
С относительными ссылками можно начать с какого-либо удобного места (например, с ветки или от HEAD) и двигаться от него.
Код | Описание |
---|---|
git checkout [name]^ |
Перемещение на один коммит назад |
git checkout [name]~[num] |
Перемещение на num коммитов назад |
Перемещение ветки (branch forcing)
Одна из наиболее распространённых целей, для которых используются относительные ссылки - это перемещение веток. Можно напрямую прикрепить ветку к коммиту при помощи опции -f
.
Код | Описание |
---|---|
git branch -f master HEAD~3 |
Переместить (принудительно) ветку master на три родителя назад от HEAD. |
Отмена изменений в Git
Есть много путей для отмены изменений в Git. Так же как и коммит, отмена изменений в Git возможна и на низком уровне (добавление в коммит отдельных файлов и наборов строк), и на высоком (как изменения реально отменяются). Сейчас сфокусируемся на высокоуровневой части.
Есть два основных способа отмены изменений в Git.
git reset [name]
git revert [name]
Git Reset
Git reset
отменяет изменения, перенося ссылку на ветку назад, на более старый коммит. Это своего рода "переписывание истории"; git reset
перенесёт ветку назад, как будто некоторых коммитов вовсе и не было.
Код | Описание |
---|---|
git reset HEAD~1 |
Git просто перенёс ссылку на master обратно на коммит C1. Теперь наш локальный репозиторий в состоянии, как будто C2 никогда не существовал. |
Git Revert
Git reset
отлично работает на локальных ветках, в локальных репозиториях. Но этот метод переписывания истории не сработает на удалённых ветках, которые используют другие пользователи.
Чтобы отменить изменения и поделиться отменёнными изменениями с остальными, надо использовать git revert
.
Код | Описание |
---|---|
Git revert HEAD |
Новый коммит C2' просто содержит изменения, полностью противоположные тем, что сделаны в коммите C2. |
Git Cherry-pick
Это очень простой и прямолинейный способ сказать, что ты хочешь копировать несколько коммитов на место, где сейчас находишься (HEAD).
Код | Код |
---|---|
git cherry-pick [commit1] [commit2] [...] |
git cherry-pick C2 C4 |
Git Interactive Rebase
Git cherry-pick
применяется, когда точно известно, какие коммиты нужны (и известны их точные хеши).
Но, в случае, когда точно не известно какие коммиты нужны можно использовать интерактивный rebase
— лучший способ отобрать набор коммитов для rebase
.
Код | Код | Описание |
---|---|---|
git rebase -i [name] |
git rebase -i HEAD~4 |
Rebase ordering C3, C4 |