# Git

# GIT Top Commands

##### <span style="color:rgb(53,152,219);">Операции STATUS</span>

**Инициализация каталога как Git-репозитория**

```ruby
git init
```

**Команда показывающая какие файлы в каком состоянии находятся**

```ruby
git status
```

**Показать историю коммитов в текущей ветке / всех ветках**

```ruby
git log
git log --all
```

##### <span style="color:rgb(53,152,219);">Операции BRANCH ветвления</span>

**Отобразить активные ветки / все активные и доступные ветки**

```ruby
git branch
git branch -a
```

**Переключиться на другую ветку**

```ruby
git checkout <branch-name>
```

**Создать новую ветку и переключиться на неё**

```ruby
git checkout -b <branch-name>
```

**Проиндексировать все файлы в папке** (для commit)

```ruby
git add .
```

**Удалить ветку из remote REPO**

```ruby
git push origin --delete develop
```

**Отправка всех веток локального репозитория на удалённый репозиторий**

```ruby
git push <link.repo> --all
git push --force <branch-name>
```


##### <span style="color:rgb(53,152,219);">Операции с COMMITs</span>

**Создать коммит с указанием имени**

```ruby
git commit -m "new commit"
```

**Автоматическая индексация всех уже отслеживаемых файлов**

```ruby
git commit -a
git commit -am "new commit" (автоиндекс+имя)
```

**Редактор названия коммитов по-умолчанию**

```ruby
git config --global core.editor "vim"
```

**Изменить сообщение последнего коммита**

```ruby
git commit --amend
```

**Забыть все последующие коммиты от указанного по &lt;hash&gt;**

```ruby
git reset --hard <hash>
```

**Изменить дату текущего коммита**

```ruby
GIT_COMMITTER_DATE="Thu Jun 08 13:44:15 2023 +0300" git commit --amend
```

##### <span style="color:rgb(53,152,219);">Операции с TAGs</span>

**Создать новый Tag**

```ruby
git tag -a v1.0 -m "feature01"
git tag --list
```

**Отправить Tag на удалённый репозиторий**

```ruby
git push origin v1.0
```

##### <span style="color:rgb(53,152,219);">Операции с ALIASes</span>

**Алиасы для графического формата команды git log:**

**Подключить алиас с ключом --all** (отображение всех ветвей)

```ruby
git config --global alias.log0 "log \
  --graph \
  --abbrev-commit \
  --decorate \
  --format=format:'\
%C(bold blue)%h%C(reset) - \
%C(bold green)(%ci)%C(reset) \
%C(white)%s%C(reset) \
%C(dim white)- %an%C(reset)\
%C(auto)%d%C(reset)' \
  --all
```

**Подключить алиас с ключом --branches (отображение локальных веток)**

```ruby
git config --global alias.log1 "log \
  --graph \
  --abbrev-commit \
  --decorate \
  --format=format:'\
%C(bold blue)%h%C(reset) - \
%C(bold green)(%ci)%C(reset) \
%C(white)%s%C(reset) \
%C(dim white)- %an%C(reset)\
%C(auto)%d%C(reset)' \
  --branches"
```

**Отключить алиас**

```ruby
git config --global --unset alias.log1
```

##### <span style="color:rgb(53,152,219);">Операции с REPOs</span>

**Клонировать удалённый репозиторий** (папка будет создана)

```ruby
git clone <link.repo>
```

**Клонировать удалённый репозиторий по branch+tag**

```ruby
git clone <link.repo> --branch '<tag-name>'
```

**Скачать изменения без слияния (fetch)**  
Изменения сохраняются в FETCH\_HEAD

```ruby
git fetch origin develop
```

**Посмотреть HASH скачанного коммита**

```ruby
git rev-parse FETCH_HEAD         # полный hash
git log FETCH_HEAD -1 --oneline  # краткий hash
git diff HEAD FETCH_HEAD         # посмотреть изменения
```

**Слить изменения**

Способ 1: Через временную ветку

```ruby
git branch temp-branch FETCH_HEAD # создать ветку
git merge temp-branch             # смержить
git branch -d temp-branch         # удалить ветку
```

Способ 2: Через HASH

```ruby
git merge FETCH_HEAD     # смержить напрямую
git merge <hash>         # смержить по hash
git pull origin develop  # fetch + merge одной командой
```

##### <span style="color:rgb(53,152,219);">Примеры Операций с REPOs</span>

**<span style="color:rgb(0,0,0);">Пример с Новым Repo</span>**

```ruby
# Инициализация и Push-инг Commit-а в Новый Repo
git init
git config --global user.name "Yuriy"
git config --global user.email "xeonmp22@gmail.com"
git init --initial-branch=main
#git remote set-url origin git@gitlab.rebrainme.com:devops_users_repos/725/devops/07_cicd.dev.git
#git remote remove origin
git remote add origin git@gitlab.rebrainme.com:devops_users_repos/725/devops/07_cicd.dev.git
git add .
git commit -am "34: Logging 6/prom.grafana"
# При 1-ом Commit-е делаем --set-upstream
git push -u origin main
# Для последующих Commit-ов
git push --all
```

**Пример с Рабочим Repo**

```ruby
# Очистка рабочего Repo от файлов Старых Commit-ов
cd $HOME/rebrainme/devops/07_cicd
git rm -rf roles/
cd ../07_cicd.dev
rm -rf .git

# Копирование новых файлов в рабочий Repo
cp -r .gitignore main.tf playbook.yml README.md roles/ ../07_cicd
cd ../07_cicd
git add .
git commit -am "34: Logging 6/prom.grafana"
git push --all
```

# Merge/Rebase Examples

#### <span style="color:rgb(53,152,219);">Исходный вариант</span>

**Схема коммитов до объединения веток**

```ruby
* efa552b - (2026-06-25 13:32:25 +0300) v6: develop - shion (develop)
* c828a46 - (2026-06-25 13:32:25 +0300) v5: develop - shion
* e17a9c1 - (2026-06-25 13:32:25 +0300) v4: develop - shion
| * 10834a6 - (2026-06-25 13:32:08 +0300) v6: main - shion (HEAD -> main)
| * ecb682a - (2026-06-25 13:32:08 +0300) v5: main - shion
| * 3725452 - (2026-06-25 13:32:08 +0300) v4: main - shion
|/
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion
```


<details id="bkmrk-code.txt-01_main02_m"><summary>code.txt \[Main ver.\]</summary>

01\_main  
02\_main  
03\_main  
04\_main  
05\_main  
06\_main

</details><details id="bkmrk-code-dev.txt-01_deve"><summary>code.txt \[Develop ver.\]</summary>

01\_main  
02\_main  
03\_main  
04\_develop  
05\_develop  
06\_develop

</details>#### <span style="color:rgb(53,152,219);">Git Merge</span>

##### Вариант 1. Автообновление Main

```ruby
git checkout main
# Включаем режим union-слияния для файла code.txt
echo "code.txt merge=union" > .gitattributes
# Слияние ветки develop с приоритетом изменений main
git merge -Xours develop -m "Merge branch 'develop'"
rm .gitattributes
```

<p class="callout info">Ветка develop вливается в ветку main. Файлы объединяются построчно  
В конфликтных местах (строки 04-06) побеждает версия из main  
Не конфликтующие строки (07-09 из develop) добавляются в результирующий файл<span style="background-color:rgb(255,255,255);">  
</span></p>

```ruby
*   6a3d02b - (2026-06-25 13:34:55 +0300) Merge branch 'develop' - shion (HEAD -> main)
|\
| * efa552b - (2026-06-25 13:32:25 +0300) v6: develop - shion (develop)
| * c828a46 - (2026-06-25 13:32:25 +0300) v5: develop - shion
| * e17a9c1 - (2026-06-25 13:32:25 +0300) v4: develop - shion
* | 10834a6 - (2026-06-25 13:32:08 +0300) v6: main - shion
* | ecb682a - (2026-06-25 13:32:08 +0300) v5: main - shion
* | 3725452 - (2026-06-25 13:32:08 +0300) v4: main - shion
|/
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion
```


<details id="bkmrk-code.txt-%5Bmain-ver.%5D"><summary>code.txt \[Merge\]</summary>

01\_main  
02\_main  
03\_main  
04\_main  
05\_main  
06\_main  
<span style="color:rgb(224,62,45);">04\_develop</span>  
<span style="color:rgb(224,62,45);">05\_develop</span>  
<span style="color:rgb(224,62,45);">06\_develop</span>

</details>##### Вариант 2. Автообновление Develop

```ruby
git checkout develop
# Включаем режим union-слияния для объединения строк файла code.txt
echo "code.txt merge=union" > .gitattributes
# Слияние ветки main с приоритетом изменений develop
git merge -Xtheirs main -m "Merge branch 'main' into develop"
rm .gitattributes
```

<p class="callout info">Ветка main вливается в ветку develop. Файлы объединяются построчно  
В конфликтных местах (строки 04-06) побеждает версия из develop (-Xours)  
Не конфликтующие строки (04-06 из main) добавляются в результирующий файл</p>

```ruby
*   47739bd - (2026-06-25 13:39:07 +0300) Merge branch 'main' into develop - shion (HEAD -> develop)
|\
| * 10834a6 - (2026-06-25 13:32:08 +0300) v6: main - shion (main)
| * ecb682a - (2026-06-25 13:32:08 +0300) v5: main - shion
| * 3725452 - (2026-06-25 13:32:08 +0300) v4: main - shion
* | efa552b - (2026-06-25 13:32:25 +0300) v6: develop - shion
* | c828a46 - (2026-06-25 13:32:25 +0300) v5: develop - shion
* | e17a9c1 - (2026-06-25 13:32:25 +0300) v4: develop - shion
|/
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion
```


<details id="bkmrk-code.txt-%5Bdev-ver.%5D-"><summary>code.txt \[Dev ver.\]</summary>

01\_main  
02\_main  
03\_main  
<span style="color:rgb(224,62,45);">04\_develop</span>  
<span style="color:rgb(224,62,45);">05\_develop</span>  
<span style="color:rgb(224,62,45);">06\_develop</span>

</details>#### <span style="color:rgb(53,152,219);">Git Rebase</span>

##### Вариант 1. Обновление Main

```ruby
git checkout develop
git rebase main
```

<div class="Fsg96" id="bkmrk--2"></div><p class="callout info">**Суть:** Коммиты из ветки develop переносятся в конец ветки main и пересоздаются с новыми hash  
**Файлы:** При перебазировании каждый коммит из develop по очереди применяется поверх текущего состояния main  
**Хронология:** Ветка develop перестраивается поверх main, её коммиты получают новые hash  
Конфликты разрешаются в пользу ветки develop  
</p>

<p class="callout success">Rebase main (+develop) — подобен процессу, когда вы синхронизируете свою инфраструктуру (main)  
с последними изменениями с тестового стенда (develop), перестраивая историю develop поверх main,  
но сохраняя все свои экспериментальные наработки (develop) в конфликтных местах  
Вы поднимаете main на новый уровень, содержащий все изменения develop  
и история main становится линейным продолжением истории develop  
</p>

```ruby
* f7f88b7 - (2026-06-25 15:53:56 +0300) v6: develop - shion (HEAD -> develop)
* d5f3c38 - (2026-06-25 15:53:56 +0300) v5: develop - shion
* ce362ac - (2026-06-25 15:53:56 +0300) v4: develop - shion
* 10834a6 - (2026-06-25 13:32:08 +0300) v6: main - shion (main)
* ecb682a - (2026-06-25 13:32:08 +0300) v5: main - shion
* 3725452 - (2026-06-25 13:32:08 +0300) v4: main - shion
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion
```

<details id="bkmrk-code.txt-%5Brebase%5D-01-1"><summary>code.txt \[Rebase\]</summary>

01\_main  
02\_main  
03\_main  
<span style="color:rgb(224,62,45);">04\_develop</span>  
<span style="color:rgb(224,62,45);">05\_develop</span>  
<span style="color:rgb(224,62,45);">06\_develop</span>

</details>##### Вариант 2. Обновление Develop

```ruby
git checkout main
git rebase develop
```

<p class="callout info">**Суть:** Commits из ветки main переносятся в конец ветки develop и пересоздаются с новыми hash  
**Файлы:** При перебазировании каждый commit из main по очереди применяется поверх текущего состояния develop  
**Хронология:** Ветка main перестраивается поверх develop, её коммиты получают новые hash  
Конфликты разрешаются в пользу ветки main  
</p>

<p class="callout success">Rebase develop (+main) - подобен процессу, когда вы обновляете свой тестовый стенд(develop),  
пересобирая его на основе последней версии инфраструктуры (main), но с сохранением всех кастомных доработок.  
Теперь develop базируется на свежей стабильной версии, а его история является логичным продолжением истории main.</p>

```ruby
* 94f8376 - (2026-06-25 16:12:33 +0300) v6: main - shion (HEAD -> main)
* daea4c3 - (2026-06-25 16:12:33 +0300) v5: main - shion
* 98ceae4 - (2026-06-25 16:12:33 +0300) v4: main - shion
* efa552b - (2026-06-25 13:32:25 +0300) v6: develop - shion (develop)
* c828a46 - (2026-06-25 13:32:25 +0300) v5: develop - shion
* e17a9c1 - (2026-06-25 13:32:25 +0300) v4: develop - shion
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion
```

<details id="bkmrk-code.txt-%5Brebase%5D-01"><summary>code.txt \[Rebase\]</summary>

01\_main  
02\_main  
03\_main  
<span style="color:rgb(224,62,45);">04\_main</span>  
<span style="color:rgb(224,62,45);">05\_main</span>  
<span style="color:rgb(224,62,45);">06\_main</span>

</details>
##### Правила REBASE

<p class="callout warning">Если в develop больше строк, (например 07-09) и они не конфликтуют с main, то они сохраняются и после rebase  
Конфликт возникает только там, где строки пересекаются (04-06)</p>

<p class="callout danger">ЗАПРЕЩЕНО производить git rebase с ветками которые вы уже отправили в общий репозиторий !  
</p>

# GIT HandBook

<p class="callout info">Источник **[git-scm.com](https://git-scm.com/book/ru/v2)** </p>

- **[Git Cheat Sheet](https://git-scm.com/cheat-sheet)**
- [Подключение к аккаунту Github используя SSH-ключ](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
- [Первоначальная настройка Git](https://git-scm.com/book/ru/v2/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%9F%D0%B5%D1%80%D0%B2%D0%BE%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-Git)
- **Команды:**
- [git **add**](https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9#_%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D1%8F_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D1%91%D0%BD%D0%BD%D1%8B%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2)
- [git **commit**](https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9#_r_committing_changes)
- [git **ignore**](https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9#r_ignoring)
- [git **rm**](https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9#r_removing_files)
- [git **log**](https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%9F%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2)
- [git **tag**](https://git-scm.com/docs/git-tag/ru)
- <span style="color:rgb(185,106,217);">[git](https://book.wiki-docs.ru/books/git/page/mergerebase-examples "Примеры Merge и Rebase")</span>**<span style="color:rgb(185,106,217);">[ ](https://book.wiki-docs.ru/books/git/page/mergerebase-examples "Примеры Merge и Rebase")[merge/rebase](https://wiki-docs.ru/books/git/page/mergerebase-examples "Примеры Merge и Rebase")</span>**
- [git **cherry-pick**](https://git-scm.com/book/ru/v2/%D0%9F%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-C:-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B-Git-%D0%92%D0%BD%D0%B5%D1%81%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9)
- [Основы ветвления и слияния в Git](https://git-scm.com/book/ru/v2/%D0%92%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-Git-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B2%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D1%8F)
- [Изменение истории: **rebase -i** (squash)](https://git-scm.com/book/ru/v2/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8#r_changing_multiple)
- [Создание pull requests в сторонний репозиторий](https://git-scm.com/book/ru/v2/GitHub-%D0%92%D0%BD%D0%B5%D1%81%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B2%D0%BA%D0%BB%D0%B0%D0%B4%D0%B0-%D0%B2-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B)

<p class="callout info">**Другие Источники**</p>

- [Интерактивное демо по ветвлению <span style="color:rgb(224,62,45);">\[+vpn\]</span>](https://learngitbranching.js.org/?locale=ru_RU)
- [Ручное разрешение конфликтов слияния](http://fkn.ktu10.com/?q=node/8951)
- [Методология ветвления git-flow](https://habr.com/ru/post/106912/)

[ ![git-branch1.jpg](https://book.wiki-docs.ru/uploads/images/gallery/2026-06/scaled-1680-/git-branch1.jpg)](https://book.wiki-docs.ru/uploads/images/gallery/2026-06/git-branch1.jpg)