Перейти к основному содержимому

200 вопросов по Git

200 вопросов по Git

Основы Git

Вопрос

Что такое Git?

Ответ

Git — это распределённая система управления версиями, предназначенная для отслеживания изменений в файлах и координации работы между несколькими участниками проекта.


Вопрос

Как инициализировать новый репозиторий Git?

Ответ

Команда git init создаёт новый репозиторий в текущей директории. Она создаёт скрытую папку .git, содержащую всю служебную информацию репозитория.

git init

Вопрос

Как клонировать существующий репозиторий?

Ответ

Команда git clone <URL> загружает копию удалённого репозитория на локальную машину, включая всю историю коммитов и ветки.

git clone https://github.com/user/repo.git

Вопрос

Что такое рабочая директория, индекс и репозиторий в Git?

Ответ

Рабочая директория — это папка с файлами проекта, над которыми работает пользователь.
Индекс (staging area) — промежуточная область, куда добавляются изменения перед фиксацией.
Репозиторий — хранилище всех коммитов и метаданных проекта, расположено в подкаталоге .git.


Вопрос

Как проверить статус текущего репозитория?

Ответ

Команда git status показывает состояние рабочей директории и индекса: какие файлы изменены, какие добавлены в индекс, есть ли неотслеживаемые файлы.

git status

Вопрос

Как добавить файл в индекс?

Ответ

Команда git add <файл> помещает изменения указанного файла в индекс. Можно использовать шаблоны или точки для добавления нескольких файлов.

git add README.md
git add .

Вопрос

Как зафиксировать изменения?

Ответ

Команда git commit -m "сообщение" создаёт новый коммит из содержимого индекса. Сообщение описывает суть изменений.

git commit -m "Добавлен файл конфигурации"

Вопрос

Как посмотреть историю коммитов?

Ответ

Команда git log выводит список всех коммитов в текущей ветке с хешами, авторами, датами и сообщениями.

git log

Для краткого вывода используется git log --oneline.


Вопрос

Как посмотреть изменения между рабочей директорией и индексом?

Ответ

Команда git diff показывает разницу между файлами в рабочей директории и индексом.

git diff

Вопрос

Как посмотреть изменения между индексом и последним коммитом?

Ответ

Команда git diff --cached (или git diff --staged) отображает различия между индексом и последним коммитом.

git diff --cached

Вопрос

Как отменить изменения в рабочей директории?

Ответ

Команда git checkout -- <файл> отменяет локальные изменения в указанном файле, восстанавливая его состояние из последнего коммита.

git checkout -- config.json

Вопрос

Как удалить файл из индекса, но оставить в рабочей директории?

Ответ

Команда git rm --cached <файл> удаляет файл из индекса и истории, но сохраняет его в рабочей директории.

git rm --cached .env

Вопрос

Как переименовать файл с учётом отслеживания в Git?

Ответ

Команда git mv old.txt new.txt переименовывает файл и автоматически регистрирует это изменение как удаление старого и добавление нового файла.

git mv old_name.py new_name.py

Вопрос

Как посмотреть, какие файлы отслеживает Git?

Ответ

Команда git ls-files выводит список всех файлов, находящихся под управлением Git в текущем репозитории.

git ls-files

Вопрос

Как игнорировать файлы в Git?

Ответ

Файл .gitignore содержит шаблоны имён файлов и директорий, которые Git не будет отслеживать. Каждый шаблон записывается на отдельной строке.

Пример .gitignore:

*.log
/node_modules
.env

Вопрос

Как создать коммит без использования индекса?

Ответ

Флаг -a в команде git commit -a -m "сообщение" автоматически добавляет все отслеживаемые изменённые файлы в индекс перед коммитом.

git commit -a -m "Обновление логики"

Вопрос

Как изменить сообщение последнего коммита?

Ответ

Команда git commit --amend -m "Новое сообщение" заменяет сообщение последнего коммита новым. Эта операция перезаписывает историю.

git commit --amend -m "Исправлено описание функции"

Вопрос

Как посмотреть изменения, внесённые конкретным коммитом?

Ответ

Команда git show <хеш> выводит метаданные коммита и полный diff изменений, внесённых этим коммитом.

git show a1b2c3d

Вопрос

Как сравнить два коммита?

Ответ

Команда git diff <хеш1> <хеш2> показывает различия между состояниями проекта в двух коммитах.

git diff abc123 def456

Вопрос

Как посмотреть, кто изменил каждую строку файла?

Ответ

Команда git blame <файл> показывает для каждой строки файла хеш коммита, автора и дату последнего изменения этой строки.

git blame main.py

Ветвление и слияние

Вопрос

Что такое ветка в Git?

Ответ

Ветка — это лёгкий подвижный указатель на один из коммитов. По умолчанию имя основной ветки — main или master.


Вопрос

Как создать новую ветку?

Ответ

Команда git branch <имя> создаёт новую ветку, указывающую на текущий коммит.

git branch feature/login

Вопрос

Как переключиться на другую ветку?

Ответ

Команда git switch <имя> переключает рабочую директорию на указанную ветку.

git switch feature/login

Альтернатива: git checkout <имя>.


Вопрос

Как создать и сразу переключиться на новую ветку?

Ответ

Команда git switch -c <имя> создаёт новую ветку и переключается на неё.

git switch -c bugfix/header

Эквивалент: git checkout -b <имя>.


Вопрос

Как посмотреть список всех веток?

Ответ

Команда git branch показывает все локальные ветки. Текущая ветка помечена звёздочкой.

git branch

Для просмотра удалённых веток: git branch -r.
Для всех веток: git branch -a.


Вопрос

Как удалить ветку?

Ответ

Команда git branch -d <имя> удаляет указанную ветку, если она полностью слита в текущую.
Если ветка не слита, используется принудительное удаление: git branch -D <имя>.

git branch -d feature/old

Вопрос

Что такое слияние (merge) в Git?

Ответ

Слияние — это процесс объединения изменений из одной ветки в другую. Git создаёт новый коммит слияния, если история расходится.


Вопрос

Как выполнить слияние одной ветки в другую?

Ответ

Сначала переключаются на целевую ветку, затем вызывают git merge <источник>.

git switch main
git merge feature/new-ui

Вопрос

Что такое fast-forward слияние?

Ответ

Fast-forward слияние происходит, когда целевая ветка не имеет новых коммитов после ответвления. В этом случае Git просто перемещает указатель вперёд, не создавая коммит слияния.


Вопрос

Как запретить fast-forward при слиянии?

Ответ

Флаг --no-ff заставляет Git всегда создавать коммит слияния, даже если возможно fast-forward.

git merge --no-ff feature/auth

Вопрос

Что такое конфликт слияния?

Ответ

Конфликт возникает, когда Git не может автоматически объединить изменения в одном и том же участке файла из разных веток. Требуется ручное разрешение.


Вопрос

Как разрешить конфликт слияния?

Ответ

Необходимо отредактировать конфликтующие файлы, удалить маркеры конфликта (<<<<<<<, =======, >>>>>>>), добавить исправленные файлы в индекс и сделать коммит.

# после редактирования
git add conflicted_file.txt
git commit

Вопрос

Как отменить незавершённое слияние?

Ответ

Команда git merge --abort отменяет текущее слияние и возвращает репозиторий в состояние до начала операции.

git merge --abort

Вопрос

Как посмотреть, какие ветки уже слиты в текущую?

Ответ

Команда git branch --merged показывает список веток, изменения из которых полностью включены в текущую ветку.

git branch --merged

Вопрос

Как посмотреть, какие ветки не слиты?

Ответ

Команда git branch --no-merged выводит ветки, содержащие коммиты, отсутствующие в текущей ветке.

git branch --no-merged

Вопрос

Что такое HEAD в Git?

Ответ

HEAD — это ссылка на текущий коммит. Обычно он указывает на последний коммит текущей ветки, но может указывать и напрямую на коммит (состояние «detached HEAD»).


Вопрос

Как временно сохранить незавершённые изменения?

Ответ

Команда git stash сохраняет текущие изменения в рабочей директории и индексе во временное хранилище и возвращает репозиторий к чистому состоянию последнего коммита.

git stash

Вопрос

Как вернуть изменения из stash?

Ответ

Команда git stash pop применяет последнее сохранённое состояние из stash и удаляет его из хранилища.

git stash pop

Для применения без удаления: git stash apply.


Вопрос

Как посмотреть список сохранённых состояний stash?

Ответ

Команда git stash list выводит все сохранённые состояния с индексами.

git stash list

Вопрос

Как применить конкретный stash по индексу?

Ответ

Указывают индекс из списка: git stash apply stash@{2}.

git stash apply stash@{1}

Вопрос

Как удалить запись из stash?

Ответ

Команда git stash drop stash@{n} удаляет указанную запись. Без аргумента удаляется последняя.

git stash drop stash@{0}

Работа с историей

Вопрос

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

Ответ

Команда git reset --soft HEAD~1 отменяет последний коммит, но оставляет изменения в индексе.
Если нужно оставить изменения только в рабочей директории (не в индексе), используется git reset HEAD~1.

git reset HEAD~1

Вопрос

Как полностью удалить последний коммит вместе с изменениями?

Ответ

Команда git reset --hard HEAD~1 удаляет последний коммит и все связанные с ним изменения из рабочей директории и индекса. Эта операция необратима.

git reset --hard HEAD~1

Вопрос

Как изменить последние N коммитов?

Ответ

Команда git rebase -i HEAD~N запускает интерактивный режим rebase для последних N коммитов. В открывшемся редакторе можно выбрать действия: pick, reword, edit, squash, fixup и другие.

git rebase -i HEAD~3

Вопрос

Что делает команда git cherry-pick?

Ответ

git cherry-pick <хеш> применяет изменения из указанного коммита к текущей ветке как новый коммит. Это позволяет переносить отдельные коммиты между ветками без слияния всей истории.

git cherry-pick abc1234

Вопрос

Как найти коммит по части сообщения?

Ответ

Команда git log --grep="часть сообщения" фильтрует историю по содержимому сообщений коммитов.

git log --grep="исправление"

Вопрос

Как найти коммит, в котором изменился определённый файл?

Ответ

Команда git log --follow -- <файл> показывает всю историю изменений указанного файла, включая переименования.

git log --follow -- src/main.py

Вопрос

Как посмотреть, кто автор конкретной строки кода в файле?

Ответ

Команда git blame <файл> выводит для каждой строки хеш коммита, имя автора и дату последнего изменения этой строки.

git blame app.js

Вопрос

Как посмотреть изменения между двумя ветками?

Ответ

Команда git diff ветка1..ветка2 показывает различия между состояниями двух веток.

git diff main..feature/auth

Вопрос

Как узнать, какие коммиты есть в одной ветке, но отсутствуют в другой?

Ответ

Команда git log ветка1..ветка2 выводит коммиты, присутствующие в ветка2, но отсутствующие в ветка1.

git log main..feature/new-ui

Вопрос

Как временно переключиться на другой коммит?

Ответ

Команда git checkout <хеш> переводит репозиторий в состояние «detached HEAD», соответствующее указанному коммиту. Любые новые коммиты в этом состоянии не будут связаны с веткой.

git checkout a1b2c3d

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

Вопрос

Что такое origin в Git?

Ответ

origin — это стандартное имя удалённого репозитория, добавляемого при клонировании. Оно указывает на URL-адрес, с которого был склонирован проект.


Вопрос

Как посмотреть список удалённых репозиториев?

Ответ

Команда git remote -v выводит список всех удалённых репозиториев с их URL-адресами.

git remote -v

Вопрос

Как добавить новый удалённый репозиторий?

Ответ

Команда git remote add <имя> <URL> регистрирует новый удалённый репозиторий под указанным именем.

git remote add upstream https://github.com/original/repo.git

Вопрос

Как отправить локальные коммиты в удалённый репозиторий?

Ответ

Команда git push <удалённый> <ветка> отправляет локальные коммиты из указанной ветки в удалённый репозиторий.

git push origin feature/login

Вопрос

Как получить обновления из удалённого репозитория?

Ответ

Команда git fetch загружает новые коммиты и объекты из удалённого репозитория, не изменяя рабочую директорию.
Для автоматического слияния после получения используется git pull.

git fetch origin

Вопрос

В чём разница между git fetch и git pull?

Ответ

git fetch только загружает изменения из удалённого репозитория.
git pull выполняет fetch, а затем автоматически сливает изменения в текущую ветку.


Вопрос

Как обновить локальную ветку до состояния удалённой?

Ответ

Сначала выполняют git fetch, затем переключаются на нужную ветку и делают git reset --hard origin/<ветка>.

git fetch origin
git switch main
git reset --hard origin/main

Вопрос

Как удалить удалённую ветку?

Ответ

Команда git push origin --delete <имя> удаляет указанную ветку на удалённом репозитории.

git push origin --delete feature/old

Вопрос

Как переименовать локальную ветку и обновить её на удалённом репозитории?

Ответ

Сначала переименовывают локальную ветку:

git branch -m старое_имя новое_имя

Затем удаляют старую удалённую ветку и пушат новую:

git push origin --delete старое_имя
git push origin -u новое_имя

Вопрос

Что такое tracking-ветка?

Ответ

Tracking-ветка — это локальная ветка, связанная с удалённой. При выполнении git push или git pull Git автоматически знает, с какой удалённой веткой взаимодействовать.


Перезапись истории

Вопрос

Что такое rebase в Git?

Ответ

Rebase — это операция перемещения или объединения коммитов одной ветки на конец другой. В отличие от merge, rebase создаёт линейную историю без коммитов слияния.


Вопрос

Как применить rebase текущей ветки на основную?

Ответ

Переключаются на целевую ветку, обновляют её, затем переключаются обратно и выполняют rebase:

git switch main
git pull
git switch feature
git rebase main

Вопрос

Что происходит при конфликте во время rebase?

Ответ

Git останавливает процесс rebase и сообщает о конфликте. Пользователь должен разрешить конфликт вручную, добавить исправленные файлы в индекс и продолжить:

git add .
git rebase --continue

Для отмены: git rebase --abort.


Вопрос

Как объединить несколько коммитов в один?

Ответ

Используют интерактивный rebase с командой squash. Например, чтобы объединить последние 3 коммита:

git rebase -i HEAD~3

В редакторе помечают первый коммит как pick, остальные — как squash.


Вопрос

Что делает fixup в интерактивном rebase?

Ответ

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


Вопрос

Можно ли переписать историю уже отправленную в удалённый репозиторий?

Ответ

Технически можно с помощью git push --force, но это опасно в совместной работе, так как нарушает историю у других участников. Лучше избегать перезаписи общих веток.


Вопрос

Как безопасно принудительно отправить изменения в удалённый репозиторий?

Ответ

Используют git push --force-with-lease. Эта команда проверяет, не было ли новых коммитов на удалённой ветке с момента последнего fetch, и отменяет push при расхождении.

git push --force-with-lease origin feature

Вопрос

Как отменить изменения, внесённые конкретным коммитом, не удаляя сам коммит?

Ответ

Команда git revert <хеш> создаёт новый коммит, который отменяет изменения указанного коммита. Это безопасный способ отката в общих ветках.

git revert abc1234

Вопрос

В чём разница между reset и revert?

Ответ

git reset переносит указатель ветки назад, удаляя коммиты из истории.
git revert создаёт новый коммит, отменяющий изменения, сохраняя полную историю.


Вопрос

Как восстановить удалённый коммит?

Ответ

Если коммит ещё не удалился сборщиком мусора, его можно найти через git reflog, а затем восстановить с помощью git checkout или git reset.

git reflog
git checkout -b recovery_branch abc1234

Подмодули и поддеревья

Вопрос

Что такое подмодуль в Git?

Ответ

Подмодуль — это способ включить один Git-репозиторий как поддиректорию другого репозитория, сохраняя при этом независимую историю.


Вопрос

Как добавить подмодуль в проект?

Ответ

Команда git submodule add <URL> <путь> клонирует указанный репозиторий в заданную поддиректорию и регистрирует его как подмодуль.

git submodule add https://github.com/user/lib.git libs/common

Вопрос

Как инициализировать и обновить подмодули после клонирования основного репозитория?

Ответ

После клонирования выполняют:

git submodule init
git submodule update

Или одной командой:

git submodule update --init

Вопрос

Как обновить подмодули до последних коммитов из их удалённых репозиториев?

Ответ

Команда git submodule update --remote обновляет каждый подмодуль до последнего коммита в его отслеживаемой ветке.

git submodule update --remote

Вопрос

Что такое git subtree?

Ответ

Git subtree — это альтернатива подмодулям, позволяющая влить содержимое одного репозитория в поддиректорию другого, без создания отдельной ссылки на внешний репозиторий.


Вопрос

Как добавить репозиторий через subtree?

Ответ

Команда git subtree add --prefix=<путь> <URL> <ветка> вливает указанную ветку внешнего репозитория в локальную поддиректорию.

git subtree add --prefix=libs/utils https://github.com/user/utils.git main

Вопрос

Как обновить subtree?

Ответ

Используют ту же команду с флагом --pull:

git subtree pull --prefix=libs/utils https://github.com/user/utils.git main

Вопрос

В чём преимущество subtree перед подмодулями?

Ответ

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


Вопрос

Можно ли отправлять изменения обратно в репозиторий, добавленный через subtree?

Ответ

Да, с помощью git subtree push, указывая тот же префикс и URL.

git subtree push --prefix=libs/utils https://github.com/user/utils.git main

Вопрос

Где хранится конфигурация подмодулей?

Ответ

Список подмодулей и их путей хранится в файле .gitmodules в корне основного репозитория.


Конфигурация и настройка

Вопрос

Как задать имя и email для коммитов?

Ответ

Команды:

git config user.name "Имя Фамилия"
git config user.email "email@example.com"

Эти данные используются во всех коммитах текущего пользователя.


Вопрос

В чём разница между --global, --local и --system в git config?

Ответ

--global применяет настройки ко всем репозиториям пользователя (файл ~/.gitconfig).
--local (по умолчанию) применяет настройки только к текущему репозиторию (.git/config).
--system применяет настройки ко всей системе (обычно /etc/gitconfig).


Вопрос

Как настроить свой редактор для сообщений коммитов?

Ответ

Команда:

git config --global core.editor "code -w"

Флаг -w заставляет VS Code ждать закрытия окна перед продолжением.


Вопрос

Как включить цветной вывод в терминале?

Ответ

Команда:

git config --global color.ui auto

Вопрос

Как настроить псевдонимы (aliases) в Git?

Ответ

Добавляют псевдоним через git config:

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch

Теперь можно использовать git st, git co, git br.


Вопрос

Как посмотреть текущую конфигурацию Git?

Ответ

Команда git config --list выводит все активные настройки.

git config --list

Вопрос

Как задать шаблон сообщения коммита по умолчанию?

Ответ

Указывают путь к файлу-шаблону:

git config commit.template ~/.gitmessage.txt

При каждом git commit содержимое этого файла будет подставлено в редактор.


Вопрос

Как настроить автоматическое исправление опечаток в командах?

Ответ

Git по умолчанию предлагает исправления для неизвестных команд. Эту функцию можно отключить:

git config help.autocorrect 0

Значение в миллисекундах (например, 10) автоматически выполнит предложенную команду через указанное время.


Вопрос

Как изменить поведение окончаний строк?

Ответ

Настройка core.autocrlf управляет преобразованием окончаний строк:

  • На Windows: git config --global core.autocrlf true
  • На Linux/macOS: git config --global core.autocrlf input

Вопрос

Как игнорировать изменения прав доступа к файлам?

Ответ

Команда:

git config core.filemode false

Полезно при работе в средах, где права файлов меняются вне зависимости от намерений разработчика (например, в некоторых контейнерах или сетевых файловых системах).


Безопасность и целостность

Вопрос

Как Git обеспечивает целостность данных?

Ответ

Git использует SHA-1 хеши для идентификации всех объектов (коммитов, деревьев, блобов). Любое изменение в содержимом приводит к новому хешу, что делает подделку истории практически невозможной.


Вопрос

Что такое объекты в Git?

Ответ

Git хранит данные в виде четырёх типов объектов:

  • blob — содержимое файла
  • tree — структура директории
  • commit — метаданные и ссылка на tree
  • tag — аннотированный тег

Все объекты неизменяемы и адресуются по хешу.


Вопрос

Как посмотреть содержимое объекта по хешу?

Ответ

Команда git cat-file -p <хеш> выводит человекочитаемое представление объекта.

git cat-file -p abc1234

Вопрос

Что такое reflog?

Ответ

Reflog — это журнал всех изменений указателей (HEAD, веток), даже если они не отражены в основной истории. Он позволяет восстанавливать «потерянные» коммиты.


Вопрос

Как долго хранятся записи в reflog?

Ответ

По умолчанию записи хранятся 90 дней для достижимых коммитов и 30 дней для недостижимых. Эти сроки можно настроить через gc.reflogExpire и gc.reflogExpireUnreachable.


Вопрос

Как защитить ветку от принудительного push?

Ответ

На стороне сервера (например, в GitHub, GitLab) можно включить защиту ветки, запрещающую force push и/или требующую pull request и проверки.


Вопрос

Что такое подписанный тег?

Ответ

Подписанный тег — это аннотированный тег, заверенный GPG-ключом автора. Он гарантирует подлинность и целостность релиза.

git tag -s v1.0.0 -m "Релиз 1.0.0"

Вопрос

Как проверить подпись тега?

Ответ

Команда git tag -v <имя> проверяет подпись тега с использованием доверенных GPG-ключей.

git tag -v v1.0.0

Вопрос

Можно ли подписывать коммиты?

Ответ

Да, с помощью флага -S:

git commit -S -m "Подписанный коммит"

Это требует настроенного GPG-ключа.


Вопрос

Как настроить Git на автоматическую подпись коммитов?

Ответ

Устанавливают конфигурацию:

git config commit.gpgsign true
git config user.signingkey <ID_ключа>

Работа в команде и процессы

Вопрос

Что такое Git Flow?

Ответ

Git Flow — это модель ветвления, предполагающая строгую структуру: основные ветки main и develop, а также временные ветки feature, release, hotfix. Каждый тип ветки имеет чёткое назначение и правила слияния.


Вопрос

Какие ветки считаются постоянными в Git Flow?

Ответ

Постоянными ветками являются main (или master) — для production-релизов, и develop — для интеграции новых функций.


Вопрос

Для чего используется ветка feature?

Ответ

Ветка feature создаётся от develop для разработки отдельной функции. После завершения она сливается обратно в develop и удаляется.


Вопрос

Чем отличается ветка release от feature?

Ответ

Ветка release создаётся от develop, когда функционал готов к релизу. В ней проводят финальное тестирование, исправляют баги и подготавливают версию. После завершения она сливается в main и develop.


Вопрос

Когда создаётся ветка hotfix?

Ответ

Ветка hotfix создаётся напрямую от main, когда требуется срочное исправление в production. После исправления она сливается обратно в main и develop.


Вопрос

Что такое GitHub Flow?

Ответ

GitHub Flow — это упрощённая модель ветвления, основанная на одной основной ветке (main), из которой создаются короткоживущие feature-ветки. Все изменения проходят через pull request и автоматическое тестирование перед слиянием.


Вопрос

В чём преимущество GitHub Flow перед Git Flow?

Ответ

GitHub Flow проще, лучше подходит для непрерывной доставки (CI/CD), не требует сложных правил управления ветками и эффективен при частых релизах.


Вопрос

Что такое pull request?

Ответ

Pull request — это запрос на слияние изменений из одной ветки в другую, сопровождаемый обсуждением, проверкой кода и автоматическими тестами. Используется на платформах вроде GitHub, GitLab, Bitbucket.


Вопрос

Как обеспечить качество кода при работе в команде?

Ответ

Используют pull request с обязательным code review, автоматическими проверками (CI), соглашениями о форматировании и политиками защиты веток.


Вопрос

Что такое squash merge?

Ответ

Squash merge объединяет все коммиты feature-ветки в один коммит перед слиянием в целевую ветку. Это упрощает историю и делает её более читаемой.


Расширенные операции

Вопрос

Как найти «плохой» коммит, вызвавший ошибку?

Ответ

Используют git bisect — бинарный поиск по истории коммитов. Указывают хороший и плохой коммиты, а затем Git последовательно предлагает коммиты для проверки.

git bisect start
git bisect bad # текущий коммит плохой
git bisect good v1.0.0 # v1.0.0 — последний хороший
# после проверки каждого шага:
git bisect good # или git bisect bad

Вопрос

Как завершить сессию git bisect?

Ответ

После нахождения проблемного коммита выполняют:

git bisect reset

Это возвращает HEAD в исходное состояние.


Вопрос

Как применить серию коммитов из одной ветки в другую без полного слияния?

Ответ

Используют git cherry-pick для каждого коммита или диапазон:

git cherry-pick A..B

Это применяет все коммиты после A до B включительно.


Вопрос

Как скопировать только часть изменений из коммита?

Ответ

Сначала применяют коммит с cherry-pick, затем отменяют ненужные изменения вручную, либо используют git show <хеш> -- <файл> и патчинг:

git show abc1234 -- src/utils.py | git apply -

Вопрос

Что делает команда git worktree?

Ответ

git worktree add <путь> <ветка> создаёт дополнительную рабочую директорию, привязанную к другой ветке, без необходимости переключаться и терять локальные изменения.

git worktree add ../my-feature feature/login

Вопрос

Можно ли иметь несколько рабочих директорий одновременно?

Ответ

Да, с помощью git worktree. Каждая директория может быть настроена на разную ветку, что удобно для параллельной работы над несколькими задачами.


Вопрос

Как удалить рабочую директорию, созданную через worktree?

Ответ

Сначала удаляют папку, затем сообщают Git:

rm -rf ../my-feature
git worktree prune

Вопрос

Как посмотреть, какие объекты занимают больше всего места в репозитории?

Ответ

Используют сторонние инструменты, например git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | grep blob | sort -k3 -n -r | head.

Это помогает найти большие файлы, случайно добавленные в историю.


Вопрос

Как удалить большой файл из всей истории Git?

Ответ

Используют git filter-repo (современный инструмент) или BFG Repo-Cleaner. Пример:

git filter-repo --path-glob '*.zip' --invert-paths

После этого требуется принудительная отправка: git push --force-with-lease.


Вопрос

Почему не рекомендуется использовать git filter-branch?

Ответ

git filter-branch устарел, медленный, подвержен ошибкам и может повредить репозиторий. Официальная документация рекомендует использовать git filter-repo вместо него.


Интеграции и хостинги

Вопрос

Как привязать локальный репозиторий к удалённому на GitHub?

Ответ

Создают репозиторий на GitHub, затем выполняют:

git remote add origin https://github.com/user/repo.git
git branch -M main
git push -u origin main

Вопрос

Что означает флаг -u в git push -u origin main?

Ответ

Флаг -u (или --set-upstream) устанавливает связь между локальной веткой и удалённой, чтобы в будущем можно было использовать git push и git pull без указания параметров.


Вопрос

Как клонировать только одну ветку?

Ответ

Используют --single-branch:

git clone -b main --single-branch https://github.com/user/repo.git

Это экономит трафик и место на диске.


Вопрос

Как посмотреть все теги в удалённом репозитории?

Ответ

Команда git ls-remote --tags origin выводит список всех тегов на удалённом сервере.

git ls-remote --tags origin

Вопрос

Как получить все теги локально?

Ответ

Команда git fetch --tags загружает все теги из удалённого репозитория.

git fetch --tags

Вопрос

Что такое shallow clone?

Ответ

Shallow clone — это клонирование репозитория с ограниченной глубиной истории (например, только последний коммит). Используется для ускорения CI/CD.

git clone --depth 1 https://github.com/user/repo.git

Вопрос

Можно ли сделать push из shallow clone?

Ответ

Нет, shallow clone не содержит полной истории, поэтому push невозможен. Для отправки изменений требуется полный клон.


Вопрос

Как преобразовать shallow clone в полный?

Ответ

Выполняют:

git fetch --unshallow

Или, если не поддерживается:

git fetch --depth=2147483647

Вопрос

Что такое sparse checkout?

Ответ

Sparse checkout позволяет клонировать только определённые поддиректории репозитория, игнорируя остальное. Полезно для больших монорепозиториев.

git clone --filter=blob:none --sparse <URL>
cd repo
git sparse-checkout set dir1 dir2

Вопрос

Как настроить автопуллинг при входе в директорию?

Ответ

Создают скрипт или alias, но Git не предоставляет встроенной функции для автоматического pull при входе в папку. Такое поведение реализуется через оболочку (например, .bashrc или .zshrc) с осторожностью.


Восстановление и диагностика

Вопрос

Как восстановить файл на состояние из конкретного коммита?

Ответ

Команда git checkout <хеш> -- <файл> восстанавливает указанный файл из заданного коммита в рабочую директорию.

git checkout abc1234 -- config.json

Вопрос

Как создать новую ветку из старого коммита?

Ответ

Команда git switch -c <новая_ветка> <хеш> создаёт ветку, указывающую на указанный коммит.

git switch -c recovery-branch abc1234

Вопрос

Что делать, если случайно удалили ветку?

Ответ

Используют git reflog, чтобы найти хеш последнего коммита удалённой ветки, затем воссоздают её:

git reflog
git switch -c восстановленная_ветка abc1234

Вопрос

Как проверить, не повреждён ли репозиторий?

Ответ

Команда git fsck проверяет целостность объектов и ссылок в репозитории, сообщая о потерянных или повреждённых данных.

git fsck

Вопрос

Как найти «висячие» (dangling) объекты?

Ответ

Команда git fsck --lost-found выводит все объекты, на которые нет ссылок из текущей истории. Их можно исследовать вручную.

git fsck --lost-found

Вопрос

Где хранятся восстановленные объекты после fsck?

Ответ

При использовании --lost-found Git сохраняет содержимое dangling-объектов в .git/lost-found/. Blobs помещаются в подкаталог other, коммиты — в commit.


Вопрос

Как очистить ненужные объекты из репозитория?

Ответ

Команда git gc (garbage collection) удаляет недостижимые объекты и оптимизирует хранилище.

git gc --prune=now

Вопрос

Как посмотреть размер репозитория?

Ответ

Команда git count-objects -vH показывает объём пакетов и объектов в человекочитаемом виде.

git count-objects -vH

Для полного размера всей папки .git используют системные команды: du -sh .git.


Вопрос

Как узнать, какие файлы были изменены в последнем коммите?

Ответ

Команда git show --name-only HEAD выводит только имена файлов, изменённых в последнем коммите.

git show --name-only HEAD

Вопрос

Как сравнить рабочую директорию с произвольным коммитом?

Ответ

Команда git diff <хеш> показывает различия между текущими файлами и состоянием проекта в указанном коммите.

git diff abc1234

Практические сценарии

Вопрос

Как разделить один большой коммит на несколько мелких?

Ответ

Выполняют git reset --soft HEAD~1, чтобы отменить коммит, но оставить изменения в индексе. Затем последовательно добавляют части изменений и делают отдельные коммиты.

git reset --soft HEAD~1
# редактируют индекс частями
git add часть1
git commit -m "Часть 1"
git add часть2
git commit -m "Часть 2"

Вопрос

Как перенести коммиты из одной ветки в другую без копирования всей истории?

Ответ

Используют git cherry-pick для каждого нужного коммита или интерактивный rebase с выбором коммитов.


Вопрос

Как избежать конфликтов при частой работе с общей веткой?

Ответ

Регулярно выполняют git pull --rebase, чтобы локальные коммиты применялись поверх актуальной версии основной ветки, сохраняя линейную историю.

git pull --rebase origin main

Вопрос

Как подготовить чистую историю перед отправкой в общий репозиторий?

Ответ

Локально выполняют интерактивный rebase (git rebase -i), объединяют мелкие исправления через fixup, переформулируют сообщения, устраняют лишние коммиты.


Вопрос

Что делать, если push отклонён из-за расхождения истории?

Ответ

Сначала получают изменения: git pull --rebase, разрешают конфликты, если есть, затем повторяют push.


Вопрос

Как отследить, кто когда удалил строку кода?

Ответ

Используют git log -S "фрагмент_кода", чтобы найти коммиты, в которых указанная строка появлялась или исчезала.

git log -S "function oldLogic()"

Вопрос

Как найти коммит по хешу, если известны только первые символы?

Ответ

Git автоматически распознаёт уникальный префикс хеша. Достаточно указать первые 4–7 символов, если они однозначны.

git show a1b2

Вопрос

Как экспортировать изменения из одного репозитория в другой без общего происхождения?

Ответ

Создают патч с помощью git format-patch, затем применяют его в целевом репозитории через git am.

# в исходном репозитории
git format-patch -1 abc1234
# в целевом
git am 0001-*.patch

Вопрос

Как клонировать репозиторий без файлов (только история)?

Ответ

Используют bare-клон:

git clone --bare https://github.com/user/repo.git

Это создаёт репозиторий без рабочей директории, только .git-содержимое.


Вопрос

Зачем нужен bare-репозиторий?

Ответ

Bare-репозиторий используется как центральное хранилище для push/pull в серверных сценариях, поскольку он не содержит рабочей директории и не может находиться в состоянии «detached HEAD».


Завершение

Вопрос

Как посмотреть статистику по авторам проекта?

Ответ

Используют сторонние скрипты или команду:

git shortlog -sn

Она показывает количество коммитов по каждому автору.


Вопрос

Как настроить шаблон репозитория по умолчанию?

Ответ

Создают глобальный шаблон в ~/.git_template, затем указывают:

git config --global init.templateDir ~/.git_template

Все новые репозитории будут инициализироваться с этим содержимым.


Вопрос

Как игнорировать права на файлы только для текущего репозитория?

Ответ

Выполняют:

git config core.filemode false

Это не затрагивает другие репозитории.


Вопрос

Можно ли использовать Git без интернета?

Ответ

Да, Git полностью работает локально. Все операции — коммиты, ветвление, слияние, просмотр истории — доступны без подключения к сети. Интернет требуется только для взаимодействия с удалёнными репозиториями.


Вопрос

Как быстро переключаться между последними двумя ветками?

Ответ

Команда git switch - переключается на предыдущую ветку, аналогично cd - в shell.

git switch feature/auth
git switch - # возвращается обратно

Вопрос

Как посмотреть граф истории коммитов в терминале?

Ответ

Команда:

git log --oneline --graph --all

Показывает древовидную структуру ветвления и слияния.


Вопрос

Как настроить автоматическое форматирование кода перед коммитом?

Ответ

Создают pre-commit hook в .git/hooks/pre-commit, который запускает форматтер (например, prettier, black, dotnet format). Если форматтер вносит изменения, коммит прерывается.


Вопрос

Что такое hooks в Git?

Ответ

Hooks — это скрипты, автоматически выполняемые при определённых событиях (коммит, push, merge и т.д.). Они хранятся в .git/hooks/ и позволяют автоматизировать проверки и действия.


Вопрос

Как распространить hooks среди команды?

Ответ

Git не отслеживает .git/hooks/. Поэтому используют менеджеры хуков (например, Husky для JS, pre-commit для Python) или скрипты инициализации, копирующие хуки из общей директории проекта.


Вопрос

Как убедиться, что все участники используют одинаковые настройки Git?

Ответ

Включают файл .gitconfig.example в репозиторий с рекомендованными настройками и инструкцией по применению. Политики вроде .editorconfig, .gitattributes, .gitignore также способствуют единообразию.