Задача: форкнуть репозиторий в GitHub, создать ветку и работать с кодом.
Сразу появляется много вопросов — что такое GitHub, какие для этого нужны команды, зачем, а главное, как всем этим пользоваться? Давайте разберёмся.
Когда мы пишем код, мы постоянно туда что-то добавляем, удаляем, и иногда всё может ломаться. Поэтому перед любыми изменениями стоит сделать копию проекта. Если собирать проекты в папки с именами проект1
, проект1_финал
и проект2_доделка
, вы быстро запутаетесь и точно что-нибудь потеряете. Поэтому для работы с кодом используют системы контроля версий.
Система контроля версий — программа, которая хранит разные версии одного документа, позволяет переключаться между ними, вносить и отслеживать изменения. Таких систем много и все они работают по принципу компьютерной игры, где вы можете вернуться к месту сохранения, если что-то пошло не так.
Git — самая популярная система контроля версий. С Git можно работать через командную строку (или терминал). В каждой системе своя встроенная программа для работы с командной строкой. В Windows это PowerShell или cmd, а в Linux или macOS — Terminal.
Вместо встроенных программ можно использовать любую другую — например, Git Bash в Windows или iTerm2 для macOS.
Как работает терминал: мы вводим команду и получаем ответ компьютера — или всё получилось, или где-то ошибка, или нужно ввести что-то ещё — например, пароль. Поэтому большая часть этой инструкции состоит из команд для терминала. Сначала будет непривычно, но вам понравится.
Но давайте по порядку — установим Git на компьютер.
Устанавливаем и настраиваем Git
Windows. Скачайте Git для Windows, запустите exe-файл, следуйте инструкциям.
macOS. Скачайте Git для macOS и запустите dmg-файл. Если он не запускается, зайдите в Системные настройки — Безопасность и нажмите кнопку Open anyway (Всё равно открыть).
Linux. Установите Git через встроенный менеджер пакетов. Если у вас Ubuntu, используйте команду sudo apt-get install git
. Команды для других дистрибутивов можно посмотреть здесь.
Как проверить, что Git установился
Откройте терминал и введите команду
Если Git установлен, то вы увидите номер версии, например, 2.35.1
.
➜ ~ git --version
git version 2.35.1
➜ ~
Настраиваем Git
Теперь нужно ввести имя и адрес электронной почты, чтобы ваши действия в Git были подписаны, а ещё для привязки к GitHub.
Добавить имя (введите его внутри кавычек):
git config --global user.name "ваше имя"
Добавить электронную почту (замените email@example. com на вашу почту):
git config --global user.email email@example.com
Опция --global
значит, что имя и почта будут использоваться для всех ваших действий в Git. Если вы хотите менять эту информацию для разных проектов, то вводите эти же команды, только без опции --global
.
Регистрируемся на GitHub
GitHub (или Гитхаб) — веб-сервис на основе Git, который помогает совместно разрабатывать IT-проекты. На Гитхабе разработчики публикуют свой и редактируют чужой код, комментируют проекты и следят за новостями других пользователей.
Профиль на Гитхабе и все проекты в нём — ваше публичное портфолио разработчика, поэтому нужно завести профиль, если у вас его ещё нет.
- Зайдите на сайт https://github. com и нажмите кнопку Sign up.
- Введите имя пользователя (понадобится в дальнейшей работе), адрес электронной почты (такой же, как при настройке Git) и пароль.
- На почту придёт код активации — введите на сайте.
- Появится окно с выбором тарифного плана. Если вы пользуетесь Гитхабом для учёбы, то укажите, что профиль нужен только для вас и вы студент.
- Опросы и выбор интересов можно пропустить.
На этом всё — вы зарегистрировались и у вас есть собственный профиль.
Устанавливаем SSH-ключи
Чтобы получить доступ к проектам на GitHub со своего компьютера и выполнять команды без постоянного ввода пароля, нужно, чтобы сервер вас узнавал. Для этого используются SSH-ключи.
SSH — протокол для безопасного соединения между компьютерами.
SSH-ключ состоит из двух частей — открытого и закрытого ключа. Открытый ключ мы отправляем на сервер. Его можно не прятать от всех и не переживать, что кто-то его украдёт, потому что без закрытого ключа он бесполезен. А вот закрытый ключ — секретная часть, доступ к нему должен быть только у вас. Это важно.
Мы будем подключаться к GitHub по SSH. Это работает так:
- Вы отправляете какую-то информацию на GitHub, который знает ваш открытый ключ.
- GitHub по открытому ключу понимает, что вы это вы, и отправляет что-то в ответ.
- Только вы можете расшифровать этот ответ, потому что только у вас есть подходящий закрытый ключ.
А чтобы подключиться к GitHub с помощью SSH-ключа, сначала нужно его создать.
Проверяем SSH-ключи
Перед созданием нового SSH-ключа проверим, есть ли на компьютере другие ключи. Обычно они лежат в папке с названием .ssh
— поэтому посмотрим, есть ли в ней что-то, с помощью команды в терминале:
Если у вас уже есть SSH-ключ, то в списке будут файлы с именами вроде id_rsa.pub
, id_ecdsa.pub
или id_ed25519.pub
. А если терминал ругается, что директории ~/.ssh
не существует, значит, у вас нет SSH-ключей. Давайте это исправим.
Создаём новый SSH-ключ
Откройте терминал и скопируйте туда эту команду. Не забудьте подставить в кавычки почту, на которую вы регистрировались на Гитхабе.
ssh-keygen -t ed25519 -C "your_email@example.com"
ed25519
— это алгоритм для генерации ключей. Если ваша система не поддерживает алгоритм ed25519
(и вы увидели ошибку), используйте немного другую команду с алгоритмом rsa
:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Терминал спросит, куда сохранить ключ. Если не хотите менять имя файла, которое предлагает терминал, просто нажмите Enter.
> Generating public/private имя-ключа key pair.
> Enter a file in which to save the key (/c/Users/ваш-профиль/.ssh/id_имя-ключа):*[Press enter]*
Теперь нужно добавить пароль, которым будет зашифрован ваш ключ. Это стоит сделать, иначе в дальнейшем могут быть проблемы с настройкой, да и так просто безопаснее.
В результате создаётся новый SSH-ключ, привязанный к вашей электронной почте.
Создание ключа по шагам:
Добавляем SSH-ключ в ssh-agent
ssh-agent
— программа для хранения и управления SSH-ключами. Давайте запустим её и добавим туда наш SSH-ключ. Запускаем командой eval "$(ssh-agent -s)"
:
Если в ответ терминал покажет надпись «Agent pid» и число — значит, всё ок, агент запущен.
Теперь добавим наш ключ командой.
ssh-add ~/.ssh/id_ed25519
Если у вашего ключа другое имя, замените название id_ed25519
именем файла с ключом (это правило применяется и дальше в инструкции). Если вы устанавливали пароль на ключ, введите его два раза после ввода команды ssh-add
(терминал подскажет, когда это сделать).
Теперь, если всё хорошо, появится надпись Identity added — значит, можно переходить к добавлению ключа на GitHub.
Копируем SSH-ключ
Чтобы добавить ключ на GitHub, нужно сначала его скопировать из вашего файла командой clip
. Вы не увидите ключ на экране, но он появится в буфере обмена, и его можно будет вставить на Гитхаб.
clip < ~/.ssh/id_ed25519.pub
Команда clip
может не сработать на вашем компьютере, тогда есть два способа узнать ключ — простой и сложный.
Сложный способ. Найдите скрытую папку .ssh
, откройте файл id_ed25519.pub
в текстовом редакторе и скопируйте его содержимое.
Простой способ. Введите команду ниже и ключ появится прямо в терминале — его нужно вручную скопировать в буфер обмена. Ключ начинается с ssh-ed22519
или ssh-rsa
(или похожей строки) — поэтому копируйте строку прямо с самого начала.
~ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO63MT6VCFuZtCLhLj1J6I7dgEU2BsRdIsnvnr4ax+Fr shklyar@htmlacademy.ru
Не копируйте этот ключ из статьи — он уже не работает.
Добавляем SSH-ключ на GitHub
Это нужно сделать, чтобы GitHub вас узнавал.
Перейдите на страницу для работы с ключами в вашем профиле на GitHub и нажмите кнопку New SSH key.
В поле Title нужно добавить название нового ключа. Например, если вы используете Mac, вы можете назвать ключ MacBook Air, или, если ключ для курсов Академии, то Academy. А ключ, который вы скопировали на прошлом шаге, вставьте в поле Key.
Не копируйте ключ со скриншота — он уже не работает.
Теперь нажмите кнопку Add SSH key и, если потребуется, введите свой пароль от GitHub, чтобы подтвердить сохранение. Если всё сделано верно, новый ключ появится в списке на странице https://github. com/settings/keys.
Теперь мы можем поработать с проектом в репозитории.
Что такое репозиторий
Репозиторий — папка с файлами вашего проекта на сервере GitHub. Так вы можете работать с проектом откуда угодно, не переживая, что какие-то файлы потеряются — все данные останутся в репозитории.
Если над проектом работает несколько программистов, сначала создаётся мастер-репозиторий — это общий репозиторий с рабочей версией проекта. А каждый программист работает с форком — то есть полной копией мастер-репозитория. В форке вы можете безнаказанно менять код и не бояться что-то сломать в основной версии проекта.
Делаем форк мастер-репозитория
Заходим в нужный репозиторий и нажимаем на «вилку» с надписью fork.
Появится окно Create a new fork — проверьте, что он называется так, как вам нужно, и жмите кнопку Create fork. Через пару секунд всё готово.
Клонируем форк на компьютер — git clone
Клонировать форк — значит скачать его, чтобы работать с кодом на своём компьютере. Тут нам и пригодится SSH.
Открываем терминал и переходим в папку с будущим проектом — для этого используем команду cd your-project
. Если вы хотите, чтобы проект лежал в папке device
, введите
Если такой папки на компьютере нет, то сначала введите md your-project
, чтобы создать эту папку, а затем cd your-project
. Подробнее о командах.
Когда перейдёте в папку, введите команду git clone
для клонирования репозитория:
git clone git@github.com:your-nickname/your-project.git
Замените your-nickname
на ваше имя пользователя на GitHub, а your-project
— на название проекта. Проще всего их найти прямо наверху страницы репозитория.
Если вы правильно настроили SSH-ключи, Git скопирует репозиторий на ваш компьютер.
➜ device git clone git@github.com:academy-student/1173761-device-34.git
Клонирование в «1173761-device-34»…
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 15 (delta 0), reused 15 (delta 0), pack-reused 0
Получение объектов: 100% (15/15), 145.07 КиБ | 900.00 КиБ/с, готово.
Если вы видите ошибку Error: Permission denied (publickey)
, скорее всего, вы ошиблись в настройке SSH-ключа. Вернитесь в этот раздел инструкции и повторите процесс настройки.
Кстати, если вы хотите, чтобы название папки с проектом у вас на компьютере отличалось от имени репозитория, можете дополнить команду клонирования, добавив в конце другое название:
git clone git@github.com:_your-nickname_/_your-project_.git folder_name
Теперь на вашем компьютере в папке your_project
или в той, название которой вы указали, находится полная копия репозитория c GitHub.
В каждом репозитории есть как минимум одна основная ветка, которую создаёт сам Git — она называется master
. Обычно в ней хранят проверенную версию программы без ошибок.
А если вы хотите исправить ошибку в коде или добавить что-то в проект, но не хотите сломать код в основной ветке, нужно создать новую ветку из master
и работать из неё. Каждая ветка — что-то вроде второстепенной дороги, которая затем снова соединится с основной.
Создаём новую ветку — git branch
Откройте терминал и введите команду
Она показывает список веток, с которыми мы работаем в проекте, и выделяет текущую. Если мы находимся в master
, то создаём новую ветку командой
git checkout -b имя-новой-ветки.
➜ 1173761-device-34 git:(master) git checkout -b task1
Переключено на новую ветку «task1»
➜ 1173761-device-34 git:(task1)
Если текущая ветка не master
, переключитесь на неё с помощью команды checkout
. После git checkout
надо указать название нужной ветки.
Мы делаем это, чтобы новая ветка содержала свежую рабочую версию проекта. Если вы ошиблись в названии, например, допустили опечатку, вы можете изменить название ветки с помощью команды:
git branch -m старое-имя-ветки новое-имя-ветки.
Сохраняем изменения — git add
После того, как вы создали ветку и поработали в ней у себя на компьютере, нужно сохранить результат, чтобы появился в репозитории и не пропал.
Если вы хотите сохранить изменения не во всех файлах, для начала введите команду git status
. Она покажет текущее состояние в вашей ветке, а именно список с названиями изменённых файлов, если они есть, и укажет на те, которые ожидают записи и сохранения (обычно они выделены красным цветом).
Чтобы сохранить все изменения разом, используйте команду
Чтобы сохранить изменения только отдельных файлов, укажите их имена вручную. Например, если вы изменили файл index.html
, введите
Если название очень длинное, вы начните его писать, нажмите Tab и терминал сам предложит продолжение пути к файлу.
Делаем коммит — git commit
Сделать коммит — значит зафиксировать все сохранённые изменения и дать им название. Это делается с помощью команды commit
git commit -m "ваше сообщение"
Текст сообщения должен быть лаконичным и вместе с этим сообщать о том, что делает коммит (внесённые изменения). Например,
- Добавляет имя наставника в Readme
- Вводит функцию сортировки изображений
- Правит ошибку в поиске городов на карте
Отправляем изменения на GitHub — git push
Сохранённые изменения пока не видны коллегам, потому что находятся в нашем локальном репозитории. Нужно отправить коммиты на GitHub. Для этого введите команду
git push origin название-текущей-ветки
Где origin
означает репозиторий на компьютере, то есть ваш форк. Слово origin
— часть команды, не меняйте это название на своё.
Создаём пулреквест
Пулреквест (или PR) — это предложение изменить код в репозитории. PR должен проверить администратор мастер-репозитория — это может быть коллега-разработчик, техлид или наставник на курсе.
Если к коду нет вопросов, пулреквест принимается. Если нужно что-то исправить — отклоняется, и придётся исправить код и снова пройти цепочку git add
— git commit
— git push
. Если вы и дальше работаете в той же ветке, а пулреквест ещё не принят, все ваши изменения автоматически добавятся в пулреквест, созданный из этой ветки после команды git push origin название-текущей-ветки
.
Чтобы создать пулреквест, зайдите на страницу вашего форка на GitHub. Вверху появилась плашка Compare & pull request, а ещё можно зайти на вкладку Pull Requests.
Нажмите на неё и окажетесь на странице открытия пулреквеста. Проверьте описание и нажмите Create pull request.
Готово, теперь ждём остаётся ждать одобрения пулреквеста или комментариев к нему.
Синхронизируем репозитории
Предположим, вы исправили код, руководитель или наставник одобрил ваши правки и принял пулреквест.
Теперь код в мастер-репозитории обновился, а в вашем форке нет, вы ведь не обновляли свою версию репозитория с тех пор, как клонировали её себе на компьютер. Приведём форк в актуальное состояние.
В локальном репозитории переключаемся на ветку master
.
Забираем изменения из ветки master
мастер-репозитория
git pull git@github.com:academy-student/1173761-device-34.git master
Отправляем изменения уже из своей ветки master
в ваш форк на GitHub с помощью команды
Готово, теперь форк и оригинальный репозиторий находятся в актуальном состоянии.
Словарик
Система контроля версий — программа, которая хранит разные версии одного документа, позволяет переключаться между ними, вносить и отслеживать изменения.
Git — самая популярная система контроля версий. С Git можно работать через терминал.
Как работает терминал: мы вводим команду и получаем ответ компьютера — или всё получилось, или где-то ошибка, или нужно ввести что-то ещё.
GitHub (или Гитхаб) — веб-сервис, основанный на Git, который помогает совместно разрабатывать IT-проекты. На Гитхабе разработчики публикуют свой и редактируют чужой код, комментируют проекты и следят за новостями других пользователей.
SSH-ключ нужен, чтобы получить доступ к проектам на GitHub со своего компьютера и выполнять команды без постоянного ввода пароля, нужно, чтобы сервер нас узнавал.
ssh-agent — программа для хранения и управления SSH-ключами.
Репозиторий — папка с файлами вашего проекта на сервере GitHub или у вас на компьютере.
Мастер-репозиторий — это общий для всей команды репозиторий с рабочей версией проекта.
Форк — полная копия мастер-репозитория, в которой вы можете безопасно работать.
Клонировать форк — скачать его командой git clone
, чтобы работать с кодом на своём компьютере.
Пулреквест (или PR) — предложение изменить код в репозитории. PR должен проверить администратор мастер-репозитория — это может быть коллега-разработчик, техлид или наставник на курсе.
Другие материалы по Git
- Введение в системы контроля версий
- Шпаргалка по Git. Решение основных проблем
- Полезные команды для работы с Git
About cloning a repository
You can clone a repository from GitHub.com to your local computer to make it easier to fix merge conflicts, add or remove files, and push larger commits. When you clone a repository, you copy the repository from GitHub.com to your local machine.
Cloning a repository pulls down a full copy of all the repository data that GitHub.com has at that point in time, including all versions of every file and folder for the project. You can push your changes to the remote repository on GitHub.com, or pull other people’s changes from GitHub.com. For more information, see «Using Git».
You can clone your existing repository or clone another person’s existing repository to contribute to a project.
Cloning a repository
-
On GitHub.com, navigate to the main page of the repository.
-
Above the list of files, click Code.
-
Copy the URL for the repository.
- To clone the repository using HTTPS, under «HTTPS», click .
- To clone the repository using an SSH key, including a certificate issued by your organization’s SSH certificate authority, click SSH, then click .
- To clone a repository using GitHub CLI, click GitHub CLI, then click .
-
Open TerminalTerminalGit Bash.
-
Change the current working directory to the location where you want the cloned directory.
-
Type
git clone
, and then paste the URL you copied earlier.$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY
-
Press Enter to create your local clone.
$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY > Cloning into `Spoon-Knife`... > remote: Counting objects: 10, done. > remote: Compressing objects: 100% (8/8), done. > remove: Total 10 (delta 1), reused 10 (delta 1) > Unpacking objects: 100% (10/10), done.
To clone a repository locally, use the repo clone
subcommand. Replace the repository
parameter with the repository name. For example, octo-org/octo-repo
, monalisa/octo-repo
, or octo-repo
. If the OWNER/
portion of the OWNER/REPO
repository argument is omitted, it defaults to the name of the authenticating user.
gh repo clone REPOSITORY
You can also use the GitHub URL to clone a repository.
gh repo clone https://github.com/PATH-TO/REPOSITORY
- On GitHub.com, navigate to the main page of the repository.
- Above the list of files, click Code.
- Click Open with GitHub Desktop to clone and open the repository with GitHub Desktop.
- Follow the prompts in GitHub Desktop to complete the clone.
For more information, see «Cloning a repository from GitHub to GitHub Desktop.»
Cloning an empty repository
An empty repository contains no files. It’s often made if you don’t initialize the repository with a README when creating it.
-
On GitHub.com, navigate to the main page of the repository.
-
To clone your repository using the command line using HTTPS, under «Quick setup», click . To clone the repository using an SSH key, including a certificate issued by your organization’s SSH certificate authority, click SSH, then click .
Alternatively, to clone your repository in Desktop, click Set up in Desktop and follow the prompts to complete the clone.
-
Open TerminalTerminalGit Bash.
-
Change the current working directory to the location where you want the cloned directory.
-
Type
git clone
, and then paste the URL you copied earlier.$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY
-
Press Enter to create your local clone.
$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY > Cloning into `Spoon-Knife`... > remote: Counting objects: 10, done. > remote: Compressing objects: 100% (8/8), done. > remove: Total 10 (delta 1), reused 10 (delta 1) > Unpacking objects: 100% (10/10), done.
Troubleshooting cloning errors
When cloning a repository it’s possible that you might encounter some errors.
If you’re unable to clone a repository, check that:
- You can connect using HTTPS. For more information, see «HTTPS cloning errors.»
- You have permission to access the repository you want to clone. For more information, see «Error: Repository not found.»
- The default branch you want to clone still exists. For more information, see «Error: Remote HEAD refers to nonexistent ref, unable to checkout.»
Further reading
- «Troubleshooting connectivity problems»
4 Steps to clone GitHub over SSH
To perform a GitHub clone with SSH keys in Git, simply follow these steps:
- Create an SSH keypair on your Windows or Linux OS
- Copy the value of the public SSH key to your GitHub account
- Obtain the GitHub SSH URL for the repository to be cloned
- Using Git, clone from GitHub with the SSH URL
These steps may sound a little daunting at first, but the whole process can be completed in less than five minutes, as you can see from the video above.
Create SSH keys for GitHub
On Windows, you can create GitHub SSH keys with the open source tool PuttyGen. On Ubuntu, or even on Windows if you have the Windows Subsystem for Linux (WSL) service installed, GitHub SSH key creation is even easier. You just invoke the ssh-keygen command in Windows PowerShell or the Ubuntu Terminal window.
[email protected]:~/.ssh$ ssh-keygen -o -t rsa -C “[email protected]”
This command creates a public and private key. These files, especially the private key, must be stored in the user’s .ssh directory for the GitHub SSH clone operation to find them at runtime. Store them anywhere other than the user’s .ssh directory, and your GitHub SSH clone attempt will fail.
GitHub and SSH everywhere! |
---|
CodeDeploy? BitBucket? GitHub? GitLab? These SSH examples will get you started on every platform:
|
The following directory listing operation shows the public and private SSH keys in the user’s .ssh directory on Linux:
[email protected]:~/.ssh$ ls id_rsa id_rsa.pub
Copy the public SSH key
To configure SSH with GitHub, you must store a copy of your public SSH key on GitHub.
When you perform a clone of a GitHub repository over SSH, the public key held by the remote server is compared against the private key stored locally in the operating system’s .ssh folder. If there’s a match, the GitHub clone over SSH proceeds. If not, the connection fails. So, for any of this to work, GitHub needs a copy of your public SSH key.
Open your public key, likely named id_rsa.pub, with a text editor and copy the contents. On Ubuntu, you could simply issue a cat command and copy the output from the Terminal window:
[email protected]:~/.ssh$ cat id_rsa.pub ssh-rsa DSSEXaasdf2EEEEAsdaEBgQCwsawea sd9YNasdfaXxkasdfHZgyW7/3WXghBbKasdfKb ewf17c4asdfHQrasdfasPXai6pMsdfsfXQH00L
GitHub SSH config
With the public key copied, log into GitHub and go to your account settings. A link exists for SSH and GPG keys. Click on this link, add a GitHub SSH key, paste the value of the public key into the appropriate field, and give your key a creative name. After this step is performed, you will be able to perform a GitHub clone with SSH keys in Git.
GitHub SSH key configuration requires the value of your public SSH key to be saved persistently on the GitHub server.
GitHub repo SSH URL
Each GitHub repo has a green Code button you can click to get either an HTTP, CLI or SSH URL that allows the repo to be cloned.
Copy your repository’s SSH URL and you’re ready to perform the GitHub SSH clone operation. The SSH URL for my spock-lizard-docker repository is as follows:
[email protected]:cameronmcnz/spock-lizard-docker.git
GitHub SSH clone
To clone GitHub with SSH keys, just open Windows PowerShell or an Ubuntu terminal and issue the Git clone command and specify the SSH URL copied from GitHub. Git will ensure that the GitHub clone operation uses an SSH connection.
[email protected]:~/.ssh$ ~$ git clone [email protected]:cameronmcnz/spock-lizard-docker.git Cloning into ‘spock-lizard-docker’… Authenticity of host ‘github.com (140.82.114.3)’ can’t be established. Are you sure you want to continue connecting (y/n/[fingerprint])? y Resolving deltas: 100% (201/201), done. GitHub SSH clone successful.
You’ll encounter a warning about Git’s inability to validate the SSH key against a third party authentication service pauses the clone operation. This is expected. Simply type ‘yes‘ and the GitHub SSH clone operation proceeds.
Once the clone operation is complete, all subsequent interactions with GitHub take place over a secure SSH connection.
And that’s all you have to do to perform a GitHub clone with SSH keys in Git.
Each of us is aware of the importance of security in the IT world. On the other hand, it turns out that not everyone uses appropriate security measures, or sometimes we just don’t know how to do it. And this is what you will learn from this article – what is SSH and how to use it in our Git repositories. I also encourage you to read this article: How to clone a repository. It explains the principles of clone operation and further reading will be easier if you first understand the basics and the idea of cloning.
What is SSH?
First, we need to know what SSH is to understand why we can clone repositories with it. Secure SHell SSH is a communication protocol that enables a remote terminal connection, e.g. with a server or another computer. Importantly, such connections are encrypted. To establish such a connection, we need a pair of keys: private (saved on our computer’s hard drive) and public, shared with the service we want to connect to. We can quite easily establish such a connection for GitHub, GitLab, and Bitbucket. Also, the principle of operation is very similar on each of these portals, so I will focus only on GitHub today as after that article you will be able to handle this process for other services on your own.
Before we try to do this, we first need to generate the aforementioned pair of keys. Unix systems have a built-in SSH module, while Windows, unfortunately, does not. In this case, we need to install some external tool that will enable us to work with this protocol. I will show you how to do it using this project: gitforwindows.org. It allows you to use the terminal on Windows systems in the same way as in the Unix system family.
How secure are your repos and metadata? Don’t push luck – secure your code with the first professional GitHub, Bitbucket, and GitLab backup.
Generating a pair of keys
With a bash terminal, all you need to do now is type this command:ssh-keygen. Of course, we can provide parameters here, including the type of encryption algorithm, the name of the resulting file, etc., but we will not focus on this today. Let’s use the default options.
Leave both file name and passphrase blank. The default behavior should show something like the above, and in the given location we will find two files with our keys. The default names are id_rsa and id_rsa.pub.
Informing the service about our public key
Since we already have the generated keys, we should now deliver one of them to the service we want to talk to using SSH. Let’s see how it looks on the example of GitHub. We need to enter our account settings and find the following option there:
Then find the SSH keys section and click the New SSH key button. Of course, our account can have multiple keys assigned to them, so it’s worth giving them meaningful names so that we know which device the key applies to. Remember to add a public key, not a private one! In my case, after adding the previously created key, this section looks like below:
After adding a new key, it’s worth to test your connection. In the bash terminal, just type the command: ssh -T git@github.com
An alert is possible here asking if you really want to connect to this host. It is worth verifying GitHub’s public key fingerprints at this point. In our case, everything is correct, so we approve. It is important that our GitHub login is included in the confirmation message. If it is not there, or we have the error “permission denied”, we should check that we did everything right. We can also delete these keys (locally and in GitHub), generate a new pair, and add again. Below is an example of the terminal view after all steps have been correctly completed:
Now everything is ready and we can safely perform a git clone with ssh key. How to do it? There is no magic here anymore, the clone function requires the address from which we want to download the project. We just provide the appropriate address using SSH, not HTTPS. In both GitHub, GitLab, and Bitbucket, the clone with ssh process looks pretty much the same. For example, on GitHub, our repo address format is:
git@github.com:USER/REPO_NAME.git
git clone with ssh key – conclusion
As you can see, using SSH to clone repositories is not difficult. It is important to generate a pair of keys and keep the private key securely. For security reasons, SSH is a very good solution. In the case of private repositories, it allows us to limit the risk of data interception by unauthorized persons.
Another benefit is that SSH keys are unlikely to be changed often, and certainly not as often as passwords. For example, the company, for security reasons, forces the GitHub password to be changed once a month. If our local backups are connected via SSH, then we are not very interested in this password change and the connection to the remote repo will still be established as long as we have the correct key pair.
Despite the fact that setting up an SSH connection requires a bit more work from us than the usual clone via HTTPS, it is still worth doing whenever we care about the security and protection of data in our repository. Every admin, team leader, CTO, or anyone responsible for these matters in the company should make sure that each local copy of the Git repository is only cloned with SSH key.
Adding a new SSH Key to GitHub
- Generate keys:
start with generating the aforementioned pair of keys. To do so, open the bash terminal and type the ssh-keygen command. - Copy the aforementioned pair of keys:
check for two files with your keys: id_rsa and id_rsa.pub and copy them. - Login into GitHub account:
go to your GitHub account settings > SSH keys section and then click the New SSH key button. - Test your connection:
type in the bash terminal ssh -T git@github.com command. - Now you can safely perform a git clone with SSH key:
to do that provide the appropriate address using SSH, instead of HTTPS. - Congratulation,
the task was finished with success.
SSH-ключ — это учетные данные для доступа по сетевому протоколу Secure Shell (SSH). С помощью этого аутентифицированного и зашифрованного безопасного сетевого протокола обеспечивается удаленная связь между машинами, находящимися в незащищенной открытой сети. Протокол SSH используется для удаленной передачи файлов, управления сетью и удаленного доступа к операционной системе. Кроме того, аббревиатурой SSH описывают набор инструментов, используемых для взаимодействия по протоколу SSH.
SSH использует пару ключей, чтобы инициировать безопасное квитирование установления связи между удаленными сторонами. Пара состоит из открытого и закрытого ключей. Эти названия могут сбить с толку, поскольку оба элемента называются ключами. Лучше рассматривать открытый ключ как «замок», а закрытый ключ — как «ключ». Вы выдаете удаленным сторонам «замок» для шифрования или «запирания» данных. Затем эти данные открываются с помощью закрытого ключа, который вы храните в надежном месте.
Создание SSH-ключа
SSH-ключи генерируются с помощью криптографических алгоритмов с открытым ключом (чаще всего имеют в виду RSA и DSA). Если говорить в общих чертах, SSH-ключи генерируются с помощью математической формулы, которая содержит два простых числа и случайную начальную переменную для вывода открытого и закрытого ключей. С помощью этой односторонней формулы можно получить открытый ключ из закрытого, но не наоборот.
Создать SSH-ключи можно с помощью инструмента генерации ключей. В набор инструментов командной строки SSH входит утилита keygen. Кроме того, большинство хостинг-провайдеров git предлагают руководства по созданию SSH-ключа.
Создание SSH-ключа на Mac и Linux
В операционных системах OS X и Linux доступны комплексные современные приложения-терминалы, которые поставляются с предустановленным набором инструментов SSH. Создание SSH-ключа проходит одинаково в обеих операционных системах.
1. Чтобы начать создание ключа, выполните следующую команду.
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Эта команда создаст новый SSH-ключ, используя адрес электронной почты в качестве метки.
2. Затем вам будет предложено указать файл, где будет сохранен ключ.
Укажите расположение файла или нажмите клавишу «Ввод», чтобы принять расположение по умолчанию.
> Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
3. Далее вас попросят ввести секретную фразу.
Она добавит еще один уровень безопасности к SSH и будет требоваться при каждом использовании ключа SSH. Если злоумышленник получит доступ к компьютеру, на котором хранятся закрытые ключи, он также сможет получить доступ к любым системам, использующим эти ключи. Секретная фраза защитит от этого сценария.
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
На этом этапе новый SSH-ключ будет создан в файле, местоположение которого было указано ранее.
4. Добавьте новый SSH-ключ в ssh-agent.
ssh-agent — это еще одна программа, входящая в набор инструментов SSH. В ней хранятся закрытые ключи, поэтому ее можно рассматривать как брелок. Кроме того, она обрабатывает запросы на подпись SSH-запросов с помощью закрытых ключей, чтобы такие ключи всегда передавались безопасно.
Перед добавлением нового SSH-ключа в ssh-agent убедитесь, что программа запущена выполнив следующую команду:
$ eval "$(ssh-agent -s)"
> Agent pid 59566
После запуска ssh-agent добавьте новый SSH-ключ в локальный агент SSH с помощью следующей команды.
ssh-add -K /Users/you/.ssh/id_rsa
Теперь новый SSH-ключ зарегистрирован и готов к использованию.
Создание SSH-ключа в Windows
В средах Windows нет стандартной unix-оболочки, поэтому для полноценной работы с инструментом keygen вам потребуется установить сторонние программы оболочки. Самый простой вариант для этих целей — решение Git Bash. После его установки вы сможете выполнять в оболочке Git Bash те же действия, что в Linux и Mac.
Подсистема Linux для Windows
Современные среды Windows предлагают подсистему Linux для Windows с полноценной оболочкой. Если вам доступна эта подсистема, вы можете выполнить в ней те же шаги, которые были описаны выше для Linux и Mac.
Резюме
SSH-ключи позволяют аутентифицировать безопасные соединения. Следуя этому руководству, вы сможете создать SSH-ключ и начать им пользоваться. В системе Git можно применять SSH-ключи вместо традиционной аутентификации по паролю при отправке или передаче данных в удаленные репозитории. Современные решения для размещения Git, такие как Bitbucket, поддерживают аутентификацию по SSH-ключу.
Welcome to my first official guide on Dev.to. Today I want to explain how you can setup SSH and Git on your Windows 10 computer.
Note: This is not about 100% securing your keys but about how to generate keys for use with GitHub.
Thanks to garethdd for his constructive feedback.
What is SSH?
SSH stands for Secure Shell and is an awesome way to authenticate yourself on remote servers (for example the Github server) without typing in a password everytime.
SSH works via two keys, the Private Key and the Public Key. While the private key should always stay private and safe, the public key can be shared around the internet without any problems.
The private key allows you to get access to servers that have your public key registered, so your access can only be stolen if the attacker somehow gets your Secret Key so keep it safe!
SSH should be preinstalled on new Windows 10 machines.
What is Git?
Git is a free version management tool that helps you to versionize your code and potentially save it on a remote server (for example Github, Gitlab or Bitbucket).
You can install Git from here:
https://git-scm.com/download/win
You can also install Git via chocolatey:
Create a SSH Key
The first step is to generate a new SSH key. Use cmd or Powershell and run the following command:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
You can but don’t need to give it a passphrase since you should never share your secret key around but using one will secure your keys. Keep in mind that everybody can have as many private keys as they want.
This generates a new private SSH key with rsa encryption and 4096 bits. It also generates a public key from the secret key which you can share around.
There will be a new folder and files in your Windows user folder.
In general you can create as many keys as you want. The id_rsa key is the default key generated by ssh and will be automatically be used by your ssh-agent if you don’t tell it to use another key.
What is an ssh-agent?
An ssh-agent is the agent process used to actually authenticate yourself with ssh. There are a few out there (PuTTY with Pageant for example) but for this example we’ll use the ssh-agent provided by the native and default Windows 10 ssh-agent.
If you want to you can use PuTTY and Pageant to make your keys even more secure. Read this post on Digital Ocean for more information.
If you want to change the key used by your ssh-agent, you must first start the service. The service will be disabled on Windows 10 by default. Search for Services and open the Services settings and look for the «OpenSSH Authentication Agent» and Activate it:
Now you will be able to access the ssh-agent from your console via ssh-agent
.
For this example we’re going to try to load another key called example
into our agent and use it instead of the id_rsa
key. To do this you can run the following command:
Now you will have both keys available for this session.
Register your SSH Key on Github
The next step is to register your generated SSH key on Github. For that, run the following command:
type C:Usersyour_user_name.sshid_rsa.pub
and copy the output string into your clipboard. Now go to your Github keys settings and add a new SSH key with your public key and save it.
Congratulations! You now are able to get and push code to Github without any password!
Note: There should also be a C:Usersyour_user_name.sshid_rsa
file. This is your private key, don’t share this around!
Setup Github in your Shell
Now it’s time to setup Git on your machine. After installing it from the link above, open a new cmd or Powershell window. Now we need to set your public Git name and Git email address. This will always be public when pushing code.
Luckily Github gives you a privatized email address for use. Go to https://github.com/settings/emails and you will find a @users.noreply.github.com
email address for your account. Copy this email address.
Next register your name and email in Git:
git config --global user.name "Your Name"
git config --global user.email your_email@users.noreply.github.com
Congratulations! Now all your Commits will be registered as being commited from your Github user.
Signing your GitHub commits (Optional Step)
To sign your commits you first must install the GPG command line tools. After you installed the GPG toolkit, you can run the following command to generate a new gpg key:
This will ask you what kind of key you want. Go for RSA and RSA.
Now you need to enter a bit length. The recommendation is 4096 bits.
After that you can specify a expiration length or if the key should never expire. Pick as you want. Expiring keys are more secure in general because you have to renew them every now and then.
Now enter your personal informations to verifying your identity with your gpg key.
When you’re done you will be asked for a passphrase. Give it a secure passphrase and you will be done with your gpg-key generation.
After that you will be able to find your key in your users .gnupg
folder as specified in the success message.
If you want to list your gpg keys, simply run
// short version
gpg --list-secret-keys
// long version
gpg --list-secret-keys --keyid-format LONG
Your GPG key you can share with Github is the key coming after sec rsa4096/
so for example in
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid Hubot
ssb 4096R/42B317FD4BA89E7A 2016-03-10
the gpg key would be 3AA5C34371567BD2
To get your public key block, simply run
gpg --armor --export YOUR_GPG_KEY
which will output your public GPG Key Block. Copy it and paste it to your GitHub Account here.
From now on your commits will be signed when commited.
Use Git
Now you’re ready to actually use Git. From now you can clone repositories via git clone
or push new code to Github. Here is a quick reference:
# Clone a repository to the current directory
git clone [REPOSITORY_CLONE_URL]
# Create a new commit with a message
git commit -m "Your commit message"
# Add files to the commit
git add .
git add ./filename.ext
# Push your commits to Github
git push origin master
git push origin [YOUR_BRANCH_NAME]
# Reset your repo to the last version
git reset --hard
# Create a new branch
git checkout -b [YOUR_BRANCH_NAME]
# Switch branches
git checkout [YOUR_BRANCH_NAME]
git checkout master
# Reset a single file
git checkout ./filename.ext
Conclusion
Thanks for reading this post. I hope it helped you with the setup. If you need help or have questions let me know!