💻 Примеры — Merge и rebase

К оглавлению урока

⚡ Быстрые примеры

# Merge: влить feature в main
git checkout main
git merge feature

# Rebase: перебазировать feature поверх main (только локально!)
git checkout feature
git rebase main

# Amend: исправить последний коммит
git commit --amend -m "Исправленное сообщение"

# Revert: безопасно отменить последний коммит
git revert HEAD

Пример 1: Workflow с git merge

Создаём репозиторий, ветку feature, вносим изменения и сливаем в main через merge.

# Инициализация и первый коммит
git init my-project
cd my-project
echo "# My Project" > README.md
git add README.md
git commit -m "Initial commit"

# Создаём ветку feature и переключаемся на неё
git checkout -b feature

# Работаем в feature
echo "Feature content" > feature.txt
git add feature.txt
git commit -m "Add feature content"

# Переключаемся обратно на main и сливаем
git checkout main
git merge feature

# Просматриваем историю — видим merge commit
git log --oneline --graph --all

Ожидаемый вывод git log --graph:

*   abc1234 (HEAD -> main) Merge branch 'feature'
|\
| * def5678 (feature) Add feature content
|/
* ghi9012 Initial commit

Пример 2: Workflow с git rebase

Rebase переносит коммиты feature поверх main, создавая линейную историю.

# Начальная ситуация: main обновился пока мы работали в feature
git checkout main
echo "Main update" >> README.md
git commit -am "Update README on main"

# Переключаемся на feature и перебазируем поверх main
git checkout feature
git rebase main

# Если есть конфликты — разрешаем и продолжаем
# git add resolved-file.txt
# git rebase --continue

# Просматриваем историю — линейная!
git log --oneline --all
Помните: rebase переписывает хэши коммитов. Делайте rebase только на личных локальных ветках, которые не были запушены в общий репозиторий.

Пример 3: git commit --amend

Задание из лекции: дополнить коммит новыми файлами (пропущенные CSS-файлы) и поменять сообщение.

# Сделали коммит, но забыли добавить style.css
git add index.html
git commit -m "Add main page"

# Понимаем, что забыли style.css
git add style.css
git commit --amend -m "Add main page and styles"

# Или добавить файл без изменения сообщения
git add forgotten.js
git commit --amend --no-edit

# Проверяем — теперь один коммит со всеми файлами
git log --oneline
git show HEAD --name-only

Пример 4: git revert — безопасная отмена

В отличие от reset, revert безопасно работает на публичных ветках.

# Видим проблемный коммит в истории
git log --oneline
# abc1234 Buggy commit
# def5678 Good commit
# ghi9012 Initial commit

# Безопасно отменяем проблемный коммит (создаётся новый коммит-откат)
git revert abc1234

# Или отменить последний коммит
git revert HEAD

# Проверяем — история не изменилась, добавился новый коммит
git log --oneline
# xyz5555 Revert "Buggy commit"
# abc1234 Buggy commit
# def5678 Good commit
# ghi9012 Initial commit

Пример 5: git reset — сравнение режимов

Демонстрация разницы между --soft, --mixed и --hard.

# Делаем три коммита
echo "A" > a.txt && git add a.txt && git commit -m "Commit A"
echo "B" > b.txt && git add b.txt && git commit -m "Commit B"
echo "C" > c.txt && git add c.txt && git commit -m "Commit C"

# git log показывает: C -> B -> A -> Initial

# --soft: HEAD перемещается, изменения сохраняются в staging
git reset --soft HEAD~1
git status   # b.txt будет в "Changes to be committed"

# --mixed: HEAD перемещается, staging сбрасывается
git reset --mixed HEAD~1
git status   # b.txt будет в "Changes not staged for commit"

# --hard: HEAD перемещается, staging и рабочий каталог сбрасываются
# ⚠️ ВНИМАНИЕ: изменения удаляются безвозвратно!
git reset --hard HEAD~1
git status   # рабочий каталог чист; c.txt и b.txt исчезли