Команды Git
Разбор ключевых команд Git: pull, fetch, push, stash, revert, checkout — что делают, чем отличаются и когда применяются.
Что такое команды Git
Команды Git — операции, которые вы вызываете в терминале, чтобы фиксировать изменения, обмениваться ими с сервером и перемещаться по истории. Ниже — те, вокруг которых больше всего путаницы.
git fetch и git pull
Обе команды забирают изменения с сервера, но по-разному.
git fetch — скачивает новые коммиты в локальную копию удалённых веток (origin/main) и на этом останавливается. Ваша рабочая ветка не меняется, файлы на диске те же. Это безопасная разведка: посмотреть, что нового, ничего не сломав.
git pull — это fetch плюс немедленное слияние скачанного в вашу текущую ветку. То есть pull = fetch + merge (или fetch + rebase при соответствующей настройке). Именно pull способен породить конфликт прямо сейчас.
git fetch origin # скачать, не трогая рабочую ветку
git log HEAD..origin/main # что прилетело нового
git diff origin/main # чем отличается от моего состояния
git merge origin/main # теперь слить осознанно
git pull # то же самое одной командой
git pull --rebase # без merge-коммита, история линейная
Практическое правило: fetch + просмотр — когда важно понимать, что вливается; pull --rebase — в повседневной работе над веткой.
git push
Отправляет ваши коммиты в удалённый репозиторий.
git push origin main
git push -u origin feature/auth # первый push ветки, запомнить связь
git push --force-with-lease # после rebase: безопаснее, чем --force
--force перезаписывает историю на сервере и способен стереть чужие коммиты. --force-with-lease откажется от push, если на сервере появилось что-то, чего вы не видели, — используйте его.
git stash
Убирает незакоммиченные изменения «в карман» и возвращает чистый рабочий каталог. Классический сценарий: вы посреди работы, а нужно срочно переключиться на хотфикс.
git stash # спрятать правки
git stash -u # вместе с новыми (untracked) файлами
git stash list # stash@{0}, stash@{1}...
git stash pop # вернуть последний и удалить из списка
git stash apply stash@{1} # вернуть конкретный, оставив в списке
git stash drop stash@{0} # выбросить
Stash — временное хранилище, а не замена коммитам: он локальный, на сервер не уезжает и легко забывается на недели.
git revert
Отменяет изменения, внесённые коммитом, создавая новый коммит с обратными правками. История не переписывается — поэтому это единственный корректный способ откатить то, что уже ушло в общую ветку.
git revert a1b2c3d # отменить один коммит
git revert HEAD # отменить последний
git revert -m 1 <merge-sha> # отменить merge-коммит
git revert --no-commit a1b2c3d b4e5f6a # несколько, одним коммитом
revert vs reset
git revert |
git reset |
|
|---|---|---|
| Что делает | Новый коммит-антипод | Двигает указатель ветки назад |
| История | Сохраняется | Переписывается |
| Безопасно для общей ветки | Да | Нет |
| Типичное применение | Откат бага с прода | Правка своих локальных коммитов |
git reset --soft HEAD~1 # снять последний коммит, правки оставить в staging
git reset --mixed HEAD~1 # снять коммит, правки в рабочем каталоге
git reset --hard HEAD~1 # снять коммит и выбросить правки — необратимо
git checkout и его замена
checkout исторически перегружен: он и переключает ветки, и восстанавливает файлы. Из-за этого в новых версиях Git его разделили на две понятные команды.
git checkout main # старый способ переключиться
git switch main # новый, только про ветки
git switch -c feature/new # создать и перейти
git checkout -- file.py # старый способ откатить файл
git restore file.py # новый, только про файлы
git restore --staged file.py # убрать из staging, правки оставить
git checkout <sha> переводит репозиторий в состояние detached HEAD: вы стоите на коммите вне ветки. Коммиты, сделанные здесь, никому не видны и потеряются при переключении — если понадобилось, создайте ветку: git switch -c fix-from-old.
Разбор ситуации
git log --oneline --graph --all -20 # как выглядит история на самом деле
git reflog # журнал всех перемещений HEAD
git show a1b2c3d # что именно менял коммит
git blame file.py # кто и когда написал строку
git diff --staged # что уйдёт в коммит
git reflog — страховка: даже после reset --hard или неудачного rebase потерянные коммиты находятся здесь и восстанавливаются через git switch -c recovery <sha>.
Связанные термины
- Git — сама система контроля версий
- Git-репозиторий — где хранится история
- git rebase — перенос коммитов и правка истории
- Git Flow — модели ветвления
- Команды CLI — среда, где всё это выполняется
- GitHub — типичный remote для push и pull
Готовы запустить GPU-задачу?
Запустить GPU-сервер