Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Какими командами git пользовался
Введение
Этот вопрос проверяет, насколько хорошо вы знаете практическое использование Git. Ответ показывает вашу способность работать в командах, управлять версиями кода и разрешать конфликты. Дам развёрнутый ответ от лица опытного разработчика.
Основные категории команд
1. Инициализация и клонирование
Создание нового репозитория
git init # инициализировать локальный репо
git init --initial-branch=main # создать с main веткой
Клонирование существующего репо
git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git # через SSH (рекомендуется)
git clone --depth 1 <url> # shallow clone (только последний коммит)
git clone -b develop <url> # клонировать specific branch
2. Базовые операции (ежедневные)
Проверка статуса
git status # видеть изменённые файлы
git status -s # короткий формат
Добавление файлов в staging area
git add . # добавить ВСЕ файлы (осторожно!)
git add src/main/java/User.java # добавить конкретный файл
git add -p # interactive staging (выбрать части)
git add -u # добавить только обновлённые (не новые)
Коммит
git commit -m "feat: add user authentication"
git commit -m "fix: resolve null pointer exception" # conventional commits
git commit -am "update" # add и commit вместе
git commit --amend # изменить последний коммит
git commit --amend --no-edit # amend без изменения сообщения
Просмотр истории
git log # история коммитов
git log --oneline # одна строка на коммит
git log --graph --all --decorate # красивая визуализация ветвей
git log -p # показать diff для каждого коммита
git log --author="Ivan" # фильтр по автору
git log --since="2 weeks ago" # фильтр по дате
git show <hash> # показать конкретный коммит
3. Работа с ветками (Branching)
Создание и переключение
git branch # список локальных веток
git branch -a # все ветки (локальные + remote)
git branch feature/user-auth # создать новую ветку
git checkout feature/user-auth # переключиться на ветку
git checkout -b feature/user-auth # создать и переключиться
# Современный способ (Git 2.23+)
git switch feature/user-auth # переключиться
git switch -c feature/user-auth # создать и переключиться
Удаление ветки
git branch -d feature/completed # удалить локальную ветку
git branch -D feature/incomplete # принудительно удалить
git push origin --delete feature/removed # удалить remote ветку
Переименование ветки
git branch -m old-name new-name # переименовать
git push origin -u new-name # отправить новое имя
git push origin --delete old-name # удалить старое имя в remote
4. Pull и Push (синхронизация с remote)
Fetch (получить, но не merge)
git fetch # получить все изменения с remote
git fetch origin # получить с конкретного remote
git fetch origin develop # получить конкретную ветку
Pull (fetch + merge)
git pull # получить и слить с текущей веткой
git pull --rebase # вместо merge использовать rebase
git pull origin feature/new-feature # pull конкретную ветку
Push (отправить свои коммиты)
git push # отправить текущую ветку
git push origin feature/auth # отправить specific branch
git push -u origin feature/auth # отправить и set upstream
git push origin develop # отправить develop
git push --all # отправить все ветки
git push --force # переписать history (ОПАСНО!)
git push --force-with-lease # более безопасный force push
5. Слияние (Merging)
Базовое слияние
git merge feature/user-auth # слить feature в текущую ветку
git merge --no-ff feature/auth # создать merge commit (сохранит историю)
git merge --squash feature/auth # сжать все коммиты в один
Разрешение конфликтов
# При конфликте:
# 1. Вручную отредактировать файлы
# 2. Пометить как resolved
git add . # пометить решённые
git commit # завершить merge
# Отменить слияние
git merge --abort # отменить в процессе слияния
Rebase (переиспользование базы)
git rebase main # переиспользовать main как базу
git rebase -i HEAD~3 # интерактивный rebase последних 3 коммитов
# i = interactive
# можно выбрать: pick, squash, reword, drop и т.д.
6. Отмена изменений
Отмена локальных изменений
git checkout -- src/User.java # отменить изменения в файле
git reset HEAD src/User.java # unstage файл
git reset --hard HEAD~1 # отменить последний коммит и изменения (ОПАСНО!)
git reset --soft HEAD~1 # отменить коммит, но сохранить изменения
git clean -fd # удалить неиспользуемые файлы и директории
Revert (создать новый коммит, отменяющий старый)
git revert <hash> # создать коммит, отменяющий другой
git revert HEAD # отменить последний коммит
7. Стёш (временное сохранение)
Сохранение незаконченной работы
git stash # сохранить изменения
git stash save "работаю над авто" # с описанием
git stash list # список сохранений
git stash pop # вернуть последнее сохранение
git stash apply stash@{2} # вернуть конкретное сохранение
git stash drop stash@{0} # удалить сохранение
8. Тегирование
Создание тегов для releases
git tag v1.0.0 # создать простой тег
git tag -a v1.0.0 -m "Release 1.0.0" # annotated тег (рекомендуется)
git tag -l # список тегов
git show v1.0.0 # показать информацию о теге
git push origin v1.0.0 # отправить тег
git push origin --tags # отправить все теги
9. Синхронизация fork и upstream
Работа с fork репозитория
# Один раз: добавить upstream
git remote add upstream https://github.com/original/repo.git
# Синхронизировать fork с upstream
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
10. Поиск и отладка
Поиск проблемного коммита
git bisect start # начать binary search
git bisect bad # текущий коммит плохой
git bisect good <old-hash> # этот коммит был хороший
# Git автоматически ищет проблемный коммит
Поиск коммита по содержимому
git log -S "specificString" # найти коммиты, изменившие эту строку
git log -p -- src/User.java # история изменений конкретного файла
git blame src/User.java # кто последний изменял каждую строку
Поиск в коммитах
git grep "TODO" # искать во всех файлах
git grep "password" HEAD # искать в конкретной версии
11. Upstream tracking
Настройка отслеживания
git push -u origin feature/auth # создать upstream для текущей ветки
git branch -u origin/develop # изменить upstream существующей ветки
git branch -vv # показать tracked branches
12. Конфигурация
Локальная конфигурация
git config --global user.name "Ivan" # установить имя
git config --global user.email "ivan@example.com"
git config --list # показать все параметры
git config core.editor vim # изменить редактор
Практический workflow
Типичный день работы:
# Утро: обновить локальный код
git fetch origin # получить последние изменения
git status # проверить статус
# Начать новую фичу
git checkout -b feature/user-profile
# Работа (несколько раз в день)
code src/User.java # редактируем код
git add src/User.java # добавляем изменения
git commit -m "feat: add user profile endpoint"
# Перед push: синхронизировать с main
git fetch origin
git rebase origin/main # переиспользовать main как базу
# Отправить
git push -u origin feature/user-profile
# Создать Pull Request в GitHub/GitLab
# После review и approve:
git checkout main
git pull
git branch -d feature/user-profile
git push origin --delete feature/user-profile
Команды, которые я НЕ использую
❌ git push --force # слишком опасно, используй --force-with-lease
❌ git reset --hard # теряет все изменения, используй с осторожностью
❌ git pull (без понимания) # может создать ненужные merge commits
❌ git rebase main (при конфликтах в shared branch) # усложняет историю
Best practices, которые я применяю
✅ Atomic commits # один коммит = одна логическая единица
git add -p # выбрать части для коммита
✅ Descriptive messages # "feat:" / "fix:" / "refactor:"
git commit -m "fix: resolve null pointer in PaymentService"
✅ Sync перед push # fetch + rebase = clean history
git fetch
git rebase origin/main
✅ Review свой код перед push
git diff # просмотреть изменения
git diff --cached # просмотреть staged изменения
✅ Использовать --force-with-lease вместо --force
git push --force-with-lease # безопаснее для команды
Команды для спасения
# Случайно удалили коммит?
git reflog # история всех операций
git reset --hard <hash> # вернуться к коммиту
# Нужно отменить push?
# К сожалению, невозможно отменить push (в shared repo)
# Но можно создать revert коммит:
git revert <hash>
git push
# Нужно отменить merge?
git merge --abort # во время merge
git reset --hard ORIG_HEAD # после merge
Вывод
Основные команды, которые нужно знать:
- Ежедневные: status, add, commit, push, pull
- Ветки: branch, checkout/switch, merge
- История: log, diff, show, blame
- Синхронизация: fetch, push, pull
- Отмена: reset, revert, stash
- Исправление: rebase, cherry-pick, bisect
Главное правило: Всегда проверяй git status и git diff перед коммитом. 95% проблем с Git происходят из-за поспешности разработчика, а не из-за ошибок Git.