Вопросы и ответы с собеседований по Git
Вопросы и ответы про Git для собеседования разработчика. В чём разница между Git и Github, какие команды используются в повседневной работе, чем различаются git pull и git fetch, зачем нужен git stash, как вывести историю коммитов и многое другое.
Что такое Git?
Git - программное обеспечение, призванное помочь в версионировании кода и координации командной разработки. Является основой реализации распределенной системы контроля версий "GitHub".
Что такое GitHub?
GitHub - это платформа для размещения репозиториев с исходным кодом, предоставляющая возможность взаимодействия с ними посредством Git.
Что такое git-репозиторий?
git-репозиторий - это проинициализированная с помощью git директория, хранящая файлы исходного кода проекта. Репозиторий может быть либо локальным, либо удаленным.
Как проинициализировать git-репозиторий?
Для инициализации репозитория необходимо установить git, перейти в целевую директорию проекта и выполнить в ней консольную команду git init.
Как скачать удаленный репозиторий?
$ git clone https://github.com/schacon/ticgit'
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100%, 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
Это правильнее называть не скачиванием, а клонированием. Клонирование осуществляется командой git clone <repository_url>.
Как вывести список подключенных удаленных репозиториев?
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
Эту функцию выполняет команда git remote -v.
Как к локальному репозиторию подключить удалённый?
$ git remote add origin https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/paulboone/ticgit (fetch)
origin	https://github.com/paulboone/ticgit (push)
Для того, чтобы к локальному репозиторию подключить удалённый репозиторий, с которым будет осуществляться последующее взаимодействие и синхронизация, необходимо выполнить команду git remote add <repository_local_name> <repository_url>
Как получить изменения из удалённого репозитория?
$ git fetch origin master
Правильным ответом будет git fetch.
В работе мы используем git pull, но git pull не только скачивает изменения из удалённого репозитория, но и применяет их к локальному репозиторию. Грубо говоря, можно сказать, что git pull = git fetch + git merge.
Как проиндексировать изменённый файл?
$ git add .
$ git add CONTRIBUTING.md
Команда git add вносит изменённый файл под версионный контроль или, еще можно сказать, начинает его отслеживание git-ом.
Как зафиксировать проиндексированные изменения?
$ git commit -m "Story 182: fix benchmarks for speed"
Команда git commit фиксирует изменения, проиндексированные прежде с помощью git add . в один "пакет изменений" с сопровождающим сообщением, указывающимся через атрибут -m. То-есть полная команда будет выглядеть так: git commit -m "Вот мой коммит".
Можно сказать, что git commit делает снимок проиндексированных с помощью git add файлов.
Как применить git commit без git add?
$ git commit -a -m 'Add new benchmarks'
Если у вас есть желание пропустить этап индексирования, Git предоставляет простой способ.
Добавление параметра -a в команду git commit заставляет Git автоматически индексировать каждый уже отслеживаемый на момент коммита файл, позволяя обойтись без git add.
Как отправить изменения в удалённый репозиторий?
$ git push origin master
После того, как выполнены git add и git commit, остается лишь выполнить git push, чтобы отправить закоммиченные изменения в удалённый репозиторий из локального.
Что такое ветка?
Под веткой принято понимать независимую последовательность коммитов в хронологическом порядке. Однако, конкретно в Git реализация ветки выполнена как указатель на последний коммит в рассматриваемой ветке. После создания ветки уже новый указатель ссылается на текущий коммит. Имя основной ветки Git-проекта по умолчанию — master (однако зачастую бывает main, например, в GitHub), она появляется сразу при инициализации репозитория.
Как создать новую ветку?
$ git branch testing
Команда git branch <branch_name> создаёт новую ветку. 
Однако, после создания вы, скорее всего, захотите на неё переключиться с помощью команды git checkout <branch_name>.
Для такого случая можно использовать всего одну команду вместо двух: git checkout -b <branch_name> - она создаёт новую ветку и перемещает вас в неё.
Как удалить ветку?
git branch -d <branch_name>
Команда git branch -d <branch_name> удаляет существующую ветку из локального репозитория.
Для удаления ветки в удаленном репозитории используйте git push origin -d <branch_name>.
В чём разница между git pull и git fetch?
Разница заключается в том, что git fetch просто извлекает изменения из удалённого репозитория, а git pull извлекает их и применяет к локальному репозиторию. Упростив действительность. можно сказать, что git pull = git fetch + git merge.
Что такое git stash?
Команда git stash позволяет на время «сдать в архив» (или отложить) изменения, сделанные в рабочей копии, чтобы вы могли применить их позже. Откладывание изменений полезно, если вам необходимо переключить контекст и вы пока не готовы к созданию коммита.
Вернуть изменения в рабочую область можно, выполнив команду git stash pop.
Как сравнить файлы двух веток?
$ git diff master
git diff <branch_name_to_compare> выведет разницу, образованную между текущей локальной веткой и веткой, чьё название передается аргументом.
Как дополнить уже сделанный коммит?
$ git commit --amend
$ git commit --amend --no-edit // если не нужно редактирование комментария
При выполнении git commit --amend будет изменен последний коммит. Вместо создания нового коммита проиндексированные изменения будут добавлены в предыдущий коммит. Кроме того, эта команда откроет настроенный текстовый редактор системы с предложением изменить указанный ранее комментарий к коммиту.
Если же вы хотите оставить прежний комментарий, используйте git commit --amend --no-edit.
Как вывести историю коммитов?
Команда git log отображает отправленные снимки состояния и позволяет просматривать и фильтровать историю коммитов, а также искать в ней конкретные изменения. 
С помощью git status можно просматривать рабочий каталог и раздел проиндексированных файлов, в то время как git log показывает только историю коммитов.