Версионирование без лишней магии

Git: держать нить.

Большой рабочий список: от первой ветки до rebase, конфликтов, откатов и аккуратной синхронизации с командой.

Ориентация

git status

Покажет текущую ветку, изменённые и неотслеживаемые файлы.

git log --oneline --graph -12

Компактная история последних коммитов с ветвлениями.

git diff

Изменения, ещё не добавленные в индекс.

git diff --staged

То, что попадёт в следующий коммит.

Ветки: создать и сменить

git branch --all

Список локальных и удалённых веток; текущая отмечена звёздочкой.

git switch main

Перейти на существующую локальную ветку.

git switch -c feature/name

Создать ветку от текущего коммита и сразу перейти в неё.

git switch -c feature/name origin/main

Создать новую ветку от актуальной удалённой main.

git switch --track origin/feature/name

Создать локальную ветку, отслеживающую уже существующую удалённую.

git branch -m old-name new-name

Переименовать локальную ветку.

git branch -d feature/name

Удалить уже слитую локальную ветку. Git откажется, если коммиты ещё не слиты.

Удалённый репозиторий

git remote -v

Показать адреса подключённых удалённых репозиториев.

git fetch --prune

Загрузить изменения с сервера, не меняя рабочие файлы; убрать ссылки на удалённые ветки.

git pull --ff-only

Безопасно подтянуть изменения, только если возможен простой fast-forward.

git push -u origin feature/name

Отправить новую ветку и запомнить удалённый upstream.

git push origin --delete feature/name

Удалить удалённую ветку после merge.

git ls-remote --heads origin

Посмотреть ветки на сервере без изменения локального репозитория.

Влить изменения: merge

git switch main

Перейти на ветку, в которую нужно добавить работу.

git pull --ff-only

Сначала обновить её из удалённого репозитория.

git merge --no-ff feature/name

Влить feature-ветку отдельным merge-коммитом — история сохраняет контекст задачи.

git merge --abort

Отменить незавершённое слияние и вернуться к состоянию до него.

git log --oneline --graph --all

Проверить, как merge выглядит в общей истории.

Обновить ветку: rebase

git fetch origin

Сначала получить свежую историю, не меняя рабочую ветку.

git switch feature/name

Перейти в ветку, которую нужно обновить.

git rebase origin/main

Перенести собственные коммиты поверх актуальной main. Удобно перед pull request.

git rebase -i HEAD~3

Интерактивно переупорядочить, объединить или переименовать последние три локальных коммита.

git rebase --continue

Продолжить после разрешения конфликта и git add исправленных файлов.

git rebase --skip

Пропустить текущий конфликтующий коммит, только если он больше не нужен.

git rebase --abort

Полностью отменить rebase и вернуться к точке его старта.

Не делайте rebase чужой общей ветки: он переписывает историю коммитов

Конфликты

git status

Покажет файлы с конфликтами и следующий ожидаемый шаг.

git diff --name-only --diff-filter=U

Вывести только файлы, которые требуют ручного разрешения.

git add path/to/file

Отметить конфликт в файле как решённый после правки.

git checkout --ours path/to/file

При merge оставить версию текущей ветки. Проверяйте результат перед git add.

git checkout --theirs path/to/file

При merge взять версию вливаемой ветки. Во время rebase значения ours/theirs меняются местами — надёжнее править вручную.

Сохранить работу

git add path/to/file

Добавить конкретный файл в следующий коммит.

git commit -m "Короткое действие"

Зафиксировать подготовленные изменения.

git stash push -m "wip: описание"

Временно убрать незавершённую работу из дерева.

git stash pop

Вернуть последнюю отложенную работу обратно.

Поправить и откатить

git restore path/to/file

Отменить незастейдженные изменения файла.

git restore --staged path/to/file

Убрать файл из индекса, сохранив изменения в рабочей копии.

git commit --amend --no-edit

Добавить забытый стейдженный файл в последний коммит.

git revert commit-sha

Создать новый коммит, отменяющий изменения указанного. Безопасный способ для уже опубликованной истории.

git reflog

Журнал перемещений HEAD; помогает найти коммит, если ветка ушла не туда.

git reset --soft HEAD~1

Убрать последний локальный коммит, но оставить все его изменения подготовленными к коммиту.

Перед отменой всегда смотрите git status и git diff