Пример 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 исчезли