Git Bash: что это, как установить и основные команды

Ноутбук на рабочем столе, на экране тёмное окно терминала с размытыми строками команд Программное обеспечение

Git Bash это окно с командной оболочкой bash, которое ставится в Windows вместе с пакетом Git for Windows. В нём работают команды системы контроля версий git и привычные по Linux инструменты Unix: ls, cd, cat, grep, ssh. Отдельно Git Bash не скачивают, он часть пакета: установщик берут на странице загрузки сайта проекта gitforwindows.org.

Команды из примеров прогнаны в Git for Windows 2.56.0(2) на Windows 10, вывод в блоках взят из этого прогона.

Что такое Git Bash и что входит в пакет

Git for Windows построен на проекте MSYS2. Из него в пакет приходят слой эмуляции POSIX (среда выполнения MSYS2), оболочка bash и набор утилит Unix. Git Bash это bash из этой среды, открытый в окне терминала MinTTY. Команда git в нём ведёт себя так же, как в Linux.

Что внутри Зачем Версия в проверенной сборке
bash командная оболочка 5.3.15
MinTTY окно терминала, в котором открывается Git Bash 3.8.3
среда выполнения MSYS2 слой эмуляции POSIX, на нём работают bash и утилиты собрана на Cygwin 3.6.10
git сама система контроля версий 2.56.0
OpenSSH ssh, ssh-keygen для работы с GitHub и серверами 10.5p1
vim и nano текстовые редакторы в консоли 9.2 и 9.2
Git Credential Manager хранит логины и токены для GitHub, Azure Repos и других сервисов включён по умолчанию (нужен .NET Framework 4.7.2 или новее)

Каталог /usr/bin нашей установки содержит 366 файлов: ls, cat, grep, find, sed, awk, tar, less, touch и другие. Кроме Git Bash, установщик кладёт в меню «Пуск» ярлыки Git CMD и Git GUI. Git GUI это графический интерфейс почти ко всем командам git, со встроенным просмотром различий между версиями файлов.

В версии 2.56 пакет перешёл со сборки MINGW64 на UCRT64. Приглашение Git Bash показывает имя среды, и после имени компьютера теперь стоит UCRT64, а на старых скриншотах в инструкциях видно MINGW64. Файла /mingw64/bin/git.exe в новой версии нет. Если он прописан в каком-то скрипте, замените путь на /cmd/git.exe: этот путь в следующих версиях останется прежним.

Установка Git for Windows: на каких шагах задержаться

Установщик на английском. На большинстве экранов можно оставить вариант по умолчанию. Экраны, где выбор важен для ежедневной работы:

Экран По умолчанию Что выбрать
Select Components «Open Git Bash here» и «Open Git GUI here» в группе «Windows Explorer integration» включены, «Add a Git Bash Profile to Windows Terminal» снят первые два оставить: они добавляют в контекстное меню папки команды открыть Git Bash или Git GUI; третий отметить, если пользуетесь Windows Terminal, там появится профиль Git Bash
Choosing the default editor used by Git Vim VS Code («Use Visual Studio Code as Git’s default editor»), а если графических редакторов на компьютере нет, nano
Adjusting the name of the initial branch in new repositories «Let Git decide», первая ветка называется master «Override the default branch name for new repositories», в поле уже вписано main
Adjusting your PATH environment «Git from the command line and also from 3rd-party software» оставить как есть
Configuring the line ending conversions «Checkout Windows-style, commit Unix-style line endings», это core.autocrlf=true оставить как есть
Configuring the terminal emulator to use with Git Bash «Use MinTTY (the default terminal of MSYS2)» MinTTY; «Use Windows’ default console window», если часто запускаете интерактивный Python или Node.js
Читайте также:  PowerShell скрипты: как написать, сохранить и запустить .ps1

Про редактор сам установщик в подсказке пишет, что Vim остаётся редактором по умолчанию только по историческим причинам, и советует выбрать современный графический редактор, а при их отсутствии рекомендует nano. Этому совету лучше последовать: в Vim без подготовки даже сообщение коммита не набрать, сначала нужно перейти в режим вставки.

Имя ветки main удобнее потому, что GitHub называет так основную ветку новых репозиториев. На старые репозитории эта настройка не действует.

С рекомендуемым вариантом PATH git будет работать в Git Bash, командной строке, PowerShell и в сторонних программах, которые ищут его в PATH. Вариант «Use Git from Git Bash only» не трогает PATH, и git запустится только в Git Bash. Третий вариант добавляет в PATH все утилиты Unix и, как предупреждает установщик, подменяет команды операционной системы find и sort, поэтому третий вариант лучше не выбирать.

Настройка окончаний строк значит, что при извлечении файлов git ставит окончания CRLF, а при коммите приводит их к LF. Из-за неё при git add появляется предупреждение LF will be replaced by CRLF the next time Git touches it, ниже на первом коммите оно видно в выводе.

Остальные экраны (поведение git pull, помощник для паролей, дополнительные опции) можно пройти как есть. На экране «Choose a credential helper» выбран Git Credential Manager, если на компьютере есть .NET Framework 4.7.2 или новее; без него этот пункт недоступен.

Окно мастера установки программы на экране ноутбука, строки текста размыты

Первоначальная настройка: git config

Git Bash открывается из меню «Пуск» или правой кнопкой мыши по папке в проводнике, пунктом «Open Git Bash here». Ярлык из «Пуска» откроет окно в домашней папке, пункт в проводнике сразу в выбранной.

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

git --version
git config --global user.name "Ivan Petrov"
git config --global user.email "ivan@example.com"
git config --global init.defaultBranch main
git config --global --list
git version 2.56.0.windows.2
user.name=Ivan Petrov
user.email=ivan@example.com
init.defaultbranch=main

Параметр --global пишет настройки в файл ~/.gitconfig, то есть в C:\Users\<имя>\.gitconfig, и они действуют на все репозитории пользователя. Строка с init.defaultBranch нужна, если в установщике осталось «Let Git decide»: тогда он записал master в системные настройки, и без неё git init создаст ветку master. Откуда взялось каждое значение, покажет git config --list --show-origin: рядом с настройкой будет путь к файлу.

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

## Пути в Git Bash: /c/ вместо C:\

Диск C: в Git Bash выглядит как каталог /c/, а разделитель в пути прямой слэш: C:\Users\user\projects превращается в /c/Users/user/projects. Домашняя директория ~ указывает на C:\Users\<имя>. Создадим папку проекта и посмотрим, что бывает с путём в привычном виде Windows:

cd ~
pwd
mkdir -p projects/hello-git
cd projects/hello-git
pwd
cygpath -w "$PWD"
cd C:\Windows\System32
cd "/c/Program Files"
pwd
cd -
/c/Users/user
/c/Users/user/projects/hello-git
C:\Users\user\projects\hello-git
bash: cd: C:WindowsSystem32: No such file or directory
/c/Program Files
/c/Users/user/projects/hello-git

Утилита cygpath -w переводит путь в формат Windows: такой путь можно вставить в проводник. Для bash обратная косая черта экранирует следующий знак, поэтому из C:\Windows\System32 он сделал C:WindowsSystem32 и не нашёл такую директорию. В одинарных кавычках cd 'C:\Windows\System32' сработает, но обратные слэши в путях лучше вообще не использовать и сразу писать /c/Windows/System32.

Путь с пробелом берите в кавычки. Команда cd /c/Program Files без них падает с ошибкой cd: too many arguments: bash видит два отдельных аргумента. С помощью cd - можно вернуться в предыдущий каталог, команда печатает его путь.

Базовые команды для работы с файлами:

Команда Что делает
pwd напечатать текущий каталог
ls, ls -la список файлов; с -la подробно и со скрытыми
cd имя, cd .., cd ~ перейти в папку, на уровень выше, домой
mkdir -p a/b создать папку вместе с вложенными
touch файл.txt создать пустой файл
cat файл.txt вывести содержимое файла
cp, mv скопировать, переместить или переименовать
rm файл, rm -r имя удалить файл, удалить папку с содержимым
clear очистить окно
Читайте также:  VS Code для Python: установка и настройка пошагово

Окно проводника Windows и окно терминала рядом на одном мониторе, содержимое размыто

Первый репозиторий: git init, add, commit

Мы в каталоге hello-git. Создадим файл, инициализируем репозиторий и сделаем первый коммит. Сохранение изменений в git идёт в два шага: git add, затем git commit.

echo "# Hello Git" > README.md
git init
git status --short
git add README.md
git commit -m "Первый коммит: README"
git log --oneline
Initialized empty Git repository in C:/Users/user/projects/hello-git/.git/
?? README.md
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it
[main (root-commit) 91a15ba] Первый коммит: README
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
91a15ba Первый коммит: README

git init создал папку .git, в Windows она скрытая. Она содержит всю историю изменений кода проекта. git status --short пометил README.md знаками ??: git видит файл, но пока его не отслеживает. git add добавляет файл в индекс, то есть в список того, что войдёт в следующий коммит, а git commit -m записывает коммит с сообщением. Хеш 91a15ba у вас будет другим.

Предупреждение про LF и CRLF не ошибка. Команда echo в bash пишет окончания строк LF, а при core.autocrlf=true, которое ставит установщик, git предупреждает, что при следующем извлечении файла превратит их в виндовые CRLF. В репозиторий файл попадает с LF. Для проектов, с которыми работают на разных системах, установщик называет этот режим рекомендуемым для Windows, менять ничего не нужно.

Если запустить git commit без -m, git откроет редактор для сообщения коммита, при настройках по умолчанию Vim. Сообщение там набирают так: i, текст, Esc, затем :wq и Enter. Подробнее про режимы и выход в шпаргалке команды vim.

Рука на клавиатуре ноутбука, на экране терминал с короткими размытыми строками вывода

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

Каждую задачу удобно вести в отдельной ветке: изменения копятся там, а main остаётся рабочей. Создадим ветку, сделаем в ней коммит и вольём его обратно:

git switch -c feature/greeting
echo "Привет из ветки" >> README.md
git commit -am "Добавил приветствие"
git switch main
git merge feature/greeting
git branch
Switched to a new branch 'feature/greeting'
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it
[feature/greeting bbfb2a4] Добавил приветствие
 1 file changed, 1 insertion(+)
Switched to branch 'main'
Updating 91a15ba..bbfb2a4
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
  feature/greeting
* main

git switch -c позволяет создать ветку и сразу переключиться на неё. В старых инструкциях для этого пишут git checkout -b feature/greeting, эта команда тоже работает. Флаг -a у git commit сам добавляет изменённые файлы, которые git уже отслеживает; новый файл так не попадёт, для него нужен git add. Слияние прошло как Fast-forward: в main после ответвления коммитов не было, новый коммит оказался её прямым потомком, и git просто переместил указатель ветки вперёд. Звёздочка в списке git branch отмечает текущую ветку.

Разработчик рисует маркером на белой доске схему из линий и кружков без надписей

Удалённый репозиторий: push, clone, pull и SSH-ключ

Для работы с удалённым хранилищем без аккаунта сделаем «сервер» прямо на диске: пустой bare-репозиторий без рабочих файлов. С GitHub команды те же, только вместо ../server.git стоит адрес репозитория:

git init --bare ../server.git
git remote add origin ../server.git
git push -u origin main
git clone ../server.git ../hello-copy
Initialized empty Git repository in C:/Users/user/projects/server.git/
To ../server.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.
Cloning into '../hello-copy'...
done.

git remote add origin запоминает адрес под именем origin. git push -u origin main отправляет ветку и связывает её с удалённой, поэтому дальше хватает короткого git push и git pull. git clone скачивает полную копию репозитория в новую папку. В окне Git Bash перед строкой To ../server.git будут ещё строки прогресса: Enumerating objects, Counting objects, Writing objects. Если потом сделать новый push из исходного проекта, git pull в hello-copy заберёт свежий коммит, в выводе будет Fast-forward.

Для GitHub по SSH нужен ключ. Его создают в том же Git Bash командой ssh-keygen -t ed25519 -C "ivan@example.com". Программа спросит, куда сохранить ключ (по умолчанию ~/.ssh/id_ed25519), и попросит парольную фразу. Забытую фразу восстановить нельзя. Публичную половину, файл id_ed25519.pub, выводят командой cat ~/.ssh/id_ed25519.pub и вставляют в настройки SSH-ключей аккаунта. Закрытый файл без .pub никому не передают. Если вы работаете по HTTPS, ключ не нужен: учётные данные хранит Git Credential Manager.

Читайте также:  Vim команды: режимы, перемещение, правка и выход

Ноутбук рядом с небольшим домашним сервером, они соединены сетевым кабелем, на экране размытый терминал

Git Bash, PowerShell и cmd: в чём разница

После рекомендуемого варианта PATH сам git одинаково работает во всех трёх. Различаются оболочки вокруг него: в Git Bash это bash с командами Unix, в PowerShell командлеты, которые передают друг другу объекты, в cmd командный язык Windows. Мы прогнали одни и те же команды в Git Bash, Windows PowerShell 5.1 и cmd:

Команда Git Bash PowerShell 5.1 cmd
git --version работает работает работает
ls утилита ls псевдоним Get-ChildItem «»ls» не является внутренней или внешней командой…»
rm -rf old удаляет папку «Не удается найти параметр, соответствующий имени параметра «rf»» «»rm» не является внутренней или внешней командой…»
git --version && echo ok работает «Лексема «&&» не является допустимым разделителем операторов в этой версии» работает
домашняя папка echo $HOME → /c/Users/user $HOME → C:\Users\user echo %USERPROFILE% → C:\Users\user

В PowerShell 7 операторы && и || уже есть, ошибка из таблицы относится к Windows PowerShell 5.1, который стоит в Windows 10. Псевдонимы ls, rm, pwd, cat в PowerShell 5.1 ведут на командлеты, поэтому без ключей команда срабатывает, а с Unix-ключами вроде -rf уже нет.

Подсказки, которые git печатает в ответ на команды, рассчитаны на POSIX-оболочку, и в PowerShell их не всегда можно выполнить как есть. Поэтому для git и для инструкций, написанных под Linux, мы бы держали открытым Git Bash. Скрипты для задач самой Windows пишут на PowerShell, как это делается, разобрано в статье про скрипты PowerShell.

Git Bash можно открыть и внутри VS Code: редактор сам находит установленный Git Bash, а сделать его терминалом по умолчанию можно командой «Terminal: Select Default Profile». Как в нём активировать виртуальное окружение Python, показано в статье VS Code для Python.

Широкий монитор с тремя открытыми окнами терминалов разного цвета, текст размыт

Частые вопросы о Git Bash

Почему интерактивный Python в Git Bash не запускается или зависает?

Окно MinTTY не представляется консольным программам Windows как обычная консоль. Интерактивные и полноэкранные программы, собранные не под MSYS2, в нём не работают без обходного пути, а вывод не латинскими буквами может искажаться. Такие программы запускают через утилиту winpty, например winpty python. Второй способ: переустановить Git и на шаге выбора терминала отметить «Use Windows’ default console window».

Как обновить Git Bash?

Git Bash обновляется вместе с Git for Windows. Команда git update-git-for-windows проверяет новую версию и спрашивает, ставить ли её, а с ключом -y ставит без вопроса. Можно и просто запустить свежий установщик поверх старой версии: он предложит прежние настройки.

Нужен ли Git Bash, если git работает в PowerShell?

Для самого git нет. Git Bash нужен, когда инструкция написана для Linux (rm -rf, && в Windows PowerShell 5.1, source, пути вида /c/...), и для ssh-keygen и других утилит из пакета.

Как открыть Git Bash сразу в папке проекта?

Щёлкните правой кнопкой мыши по папке в проводнике и выберите «Open Git Bash here». В версиях до 2.41 у пункта было другое название, «Git Bash Here». Пункт появляется, если при установке не сняли флажок этого компонента. Из уже открытого окна в папку переходят командой cd /c/путь/к/папке.

Оцените статью
bestprogrammer.ru
Добавить комментарий