You are here

GitHub клонирование, редактирование, отправка. SSH, Branch, Master.

Linux: 

GitHub: клонирование и работа с репозиториями

В этой статье разберем как клонировать с GitHub, вносить правки в проект и отправлять на согласование обратно. По сути полный рабочий цикл в рамках простых изменений. Данная статья является продолжением первой статьи "Знакомство с GitHub и локальным репозиторием". Все примера приведены в Linux Debia 10.

В статье ранее обсудили создание аккаунта и первого репозитория. Продолжим. У нас создан "newproject":

GitHub: клонирование и работа с репозиториями по SSH

1. Клонируем наш проект на локальную машину. Для этого заходим в "newproject" в окно, на картинке выше. Есть два варианта "Clone or download" (зеленая кнопка в правой части):

  • Clone with SSH: Use a password protected SSH key.
  • Clone with HTTPS: Use Git or checkout with SVN using the web URL.

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

  1. # перешли в домашний каталог текущего пользователя, не root
  2. $ cd ~
  3. # перешли в папку .ssh, где будут ключи, если нет папки, при создании ключа, появится
  4. $ cd .ssh
  5. # генерируем ключ, самый простой. На все вопросы отвечаем "Enter"
  6. $ ssh-keygen
  7. Generating public/private rsa key pair.
  8. Enter file in which to save the key (/home/debuser/.ssh/id_rsa):
  9. Enter passphrase (empty for no passphrase):
  10. Enter same passphrase again:
  11. Your identification has been saved in /home/debuser/.ssh/id_rsa.
  12. Your public key has been saved in /home/debuser/.ssh/id_rsa.pub.
  13. The key fingerprint is:
  14. ...
  15. +----[SHA256]-----+
  16. # проверяем наш ключ
  17. $ ls -la
  18. -rw------- 1 debuser debuser 1823 сен 26 11:12 id_rsa
  19. -rw-r--r-- 1 debuser debuser 395 сен 26 11:12 id_rsa.pub
  20. # просмотрим содержимое открытого ключа и скопируем
  21. $ cat id_rsa.pub
  22. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDwlukrH+e79iPXbGmu5TovBeH7L2nogDitWEib8lR1XpYrNLRIzc6zT3z9B/Gi03SeNWgoS4WosNnIEQ+hFnxxHoEdcuygr0kZQbuuwogwSeH9vVKXQiwIoPutewUQ3SIWJ4K4qJDEyGGvsh/r3olpn40s0UEY0Kx1py6jLg84xPVLEiw/SEA1T8JzhvjPk544VJSaN7dE6TdJAKlembvd1GFcDyc/9nzKXAMJGyoddU+5P76C8oiy+o5QpKgUPTsGJiRC13WN2L+kTOaPrYMLhkBThFIGMwJgmFgpqUOjW9MYo1DGrsvbvQ9A9kdU53zB+jw2rvLe9smHEMn2FodJ debuser@debsv

Дальше идем в личный кабинет GitHub, правый верхний угол "основное меню - пиктограмма", раздел "Settings", подраздел "SSH and GPG keys" и нажимаем "New SSH key":

GitHub: клонирование и работа с репозиториями по SSH

В поле "Title" пишем название, у нас "GitHubLocal", в поле "Key" вводим наш ключ "ssh-rsa AAAA...odJ debuser@debsv" и сохраняем, попросит пароль для подтверждения действия. Все, наш ключ будет использован при подключении с локального компьютера к GitHub при клонировании из под нашего пользователя.

Возвращаемся к нашему локальному Linux и для удобства создаем папку под проекты GitHub:

  1. $ pwd
  2. /home/debuser/Документы
  3. $ mkdir githublocal
  4. $ cd githublocal/
  5. $

Приступим к клонированию ветки с GitHub. Для этого заходим опять в личный кабинет GitHub, нажимаем на "Clone or download" и выбираем SSH, копируем ссылку. Дальше вводим следующую команду на нашем Linux (git clone):

  1. $ git clone git@github.com:shell/newproject.git
  2. Клонирование в «newproject»…
  3. remote: Enumerating objects: 6, done.
  4. remote: Counting objects: 100% (6/6), done.
  5. remote: Compressing objects: 100% (2/2), done.
  6. remote: Total 6 (delta 0), reused 3 (delta 0), pack-reused 0
  7. Получение объектов: 100% (6/6), готово.

Проверяем что произошло:

  1. $ ls -la
  2. итого 12
  3. drwxr-xr-x 3 debuser debuser 4096 сен 26 12:21 .
  4. drwxr-xr-x 6 debuser debuser 4096 сен 26 11:30 ..
  5. drwxr-xr-x 3 debuser debuser 4096 сен 26 12:21 newproject
  6. $ cd newproject/
  7. $ ls -la
  8. итого 16
  9. drwxr-xr-x 3 debuser debuser 4096 сен 26 12:21 .
  10. drwxr-xr-x 3 debuser debuser 4096 сен 26 12:21 ..
  11. drwxr-xr-x 8 debuser debuser 4096 сен 26 12:21 .git
  12. -rw-r--r-- 1 debuser debuser 12 сен 26 12:21 README.md
  13. $

Все получилось! Мы загрузили данные с GitHub, на свой локальный компьютер. И как видим, там только один файл README которой создал сам GitHub при создании нашего репозитория. В случае боевого клонирования, у вас будет куча файлов для разработки и редактирования.

Теперь внесем данные со своим файлом и отправим обратно на сервер GitHub. Если кто не знает или не читал, все комманды которые мы сейчас будем использовать, описанны в предыдущей статье, тут: Знакомство с GitHub

Создаем свой файл с кодом, и отправляем на GitHub:

  1. # чтобы не создавать отдельный файл, просто перенаправим текст через echo, который и создаст файл с кодом:
  2. $ echo 'print("Hello GitHub")' > PythonGit.py
  3. # считаем содержимое файла и выведем для просмотра
  4. $ cat PythonGit.py
  5. print("Hello GitHub")
  6. # проверим от кого будет коммит
  7. $ git config -l
  8. user.email=user@localhost
  9. user.name=DebUser
  10. # Проверим статус файла
  11. $ git status
  12. На ветке master
  13. Ваша ветка обновлена в соответствии с «origin/master».
  14.  
  15. Неотслеживаемые файлы:
  16. (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
  17.  
  18. PythonGit.py
  19.  
  20. ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)
  21. # надо добавить файл, нам посказывает справка выше
  22. $ git add *
  23. # проверим еще раз статус
  24. $ git status
  25. На ветке master
  26. Ваша ветка обновлена в соответствии с «origin/master».
  27.  
  28. Изменения, которые будут включены в коммит:
  29. (используйте «git reset HEAD <файл>…», чтобы убрать из индекса)
  30.  
  31. новый файл: PythonGit.py
  32.  
  33. # файл готов для коммита
  34. $ git commit -m "My one Git"
  35. [master 8d9399a] My one Git
  36. 1 file changed, 1 insertion(+)
  37. create mode 100644 PythonGit.py
  38. # отправляем наш локальный репозиторий в GitHub на сервер.
  39. # ВНИМАНИЕ!!! Тут сервер не спрашивает наш логин и пароль, так как выше мы настроили работу по SSH
  40. $ git push origin
  41. Перечисление объектов: 4, готово.
  42. Подсчет объектов: 100% (4/4), готово.
  43. При сжатии изменений используется до 2 потоков
  44. Сжатие объектов: 100% (2/2), готово.
  45. Запись объектов: 100% (3/3), 299 bytes | 299.00 KiB/s, готово.
  46. Всего 3 (изменения 0), повторно использовано 0 (изменения 0)
  47. To github.com:shell/newproject.git
  48. 697065a..8d9399a master -> master

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

клонирование и работа с репозиториями по SSH

Как мы видим, наш файл благополучно загрузился. Вы может его редактировать и вносить правки на локальном Linux, а потом отправлять на сервер. Можете делиться ссылками для совместых разработок. Все примеры выше, в рамках ветки "Branch: master". Использовать эту ветку в реальных боевых условиях "работодателя или крупного своего проекта" не рекомендуем. Желательно создать отдельную ветку для разработки, а в случае удачного исполнения, сливать в основную мастер. Поэтому, сейчас рассмотрим вариант работы с веткой для разработки, не используя мастер.

Рассмотрим ситуацию: нам дали ссылку для клонирования нового проекта(на примере ниже, будем использовать наш же проект) и нам ненадо вносить изминения в мастер, необходимо создать свой branch. Для этого, делаем следующе:

  1. # создаем новый каталог, под новый проект. Переходим в него, и делаем clone данной нам ссылки
  2. $ mkdir project2
  3. $ cd project2/
  4. $ git clone git@github.com:shell/newproject.git
  5. Клонирование в «newproject»…
  6. remote: Enumerating objects: 9, done.
  7. remote: Counting objects: 100% (9/9), done.
  8. remote: Compressing objects: 100% (4/4), done.
  9. remote: Total 9 (delta 0), reused 6 (delta 0), pack-reused 0
  10. Получение объектов: 100% (9/9), готово.
  11. # проверяем что склонировали с сервера
  12. $ ls -la
  13. итого 12
  14. drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 .
  15. drwxr-xr-x 4 debuser debuser 4096 сен 26 13:01 ..
  16. drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 newproject
  17. # переходим в мастера и смотрим содержимое
  18. $ cd /home/debuser/Документы/githublocal/project2/newproject/
  19. $ ls -la
  20. итого 20
  21. drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 .
  22. drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 ..
  23. drwxr-xr-x 8 debuser debuser 4096 сен 26 13:02 .git
  24. -rw-r--r-- 1 debuser debuser 22 сен 26 13:02 PythonGit.py
  25. -rw-r--r-- 1 debuser debuser 12 сен 26 13:02 README.md
  26. # Чтобы не портить мастера, создаем свою ветку для редактирования. Но сначала проверим, в какой ветке мы работаем
  27. $ git branch
  28. * master
  29. $ git checkout -b deb_project002
  30. Переключено на новую ветку «deb_project002»
  31. # проверяем в какой ветке мы находимся
  32. $ git branch
  33. * deb_project002
  34. master
  35. # начинаем создавать правки, код, файлы. Я все делаю условно, для примера, не более
  36. $ echo 'print("New cod blabla")' > Pyt2.py
  37. $ echo 'print("New cod blabla Cod #2")' >> PythonGit.py
  38. # Проверяем что получилось
  39. $ ls -la
  40. итого 24
  41. drwxr-xr-x 3 debuser debuser 4096 сен 26 13:06 .
  42. drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 ..
  43. drwxr-xr-x 8 debuser debuser 4096 сен 26 13:04 .git
  44. -rw-r--r-- 1 debuser debuser 24 сен 26 13:06 Pyt2.py
  45. -rw-r--r-- 1 debuser debuser 53 сен 26 13:06 PythonGit.py
  46. -rw-r--r-- 1 debuser debuser 12 сен 26 13:02 README.md

В коде выше, мы скачали мастер бренч, перешли в свой бренч и отредактировали данные для сервера. По сути мы взяли проект, сделали его копию в рамках своей ветки, и провели редактирование. Дальше нам надо отправить проект на сервер и согласовать объединение нашей ветки с веткой мастера. При условии, что мы внесли верные изминения в проект и их можно выдавать в так называемый продакшинс.

Приступим к отправке наших правок на сервер GitHub и посмотрим куда они попадут:

  1. # добавим наши правки и разработки. Проверим статус
  2. $ git add *
  3. $ git status
  4. На ветке deb_project002
  5. Изменения, которые будут включены в коммит:
  6. (используйте «git reset HEAD <файл>…», чтобы убрать из индекса)
  7.  
  8. новый файл: Pyt2.py
  9. изменено: PythonGit.py
  10.  
  11. # делаем коммит, он будет локальный!
  12. $ git commit -m "Local copy new project 2"
  13. [deb_project002 133f661] Local copy new project 2
  14. 2 files changed, 2 insertions(+)
  15. create mode 100644 Pyt2.py
  16. # отправляем на сервер, но! мы выше создали свой бренч, и сервер ничего про него знать не знает
  17. $ git push origin
  18. fatal: Текущая ветка deb_project002 не имеет вышестоящей ветки.
  19. Чтобы отправить текущую ветку и установить внешнюю ветку как вышестоящую для этой ветки, используйте
  20.  
  21. git push --set-upstream origin deb_project002
  22.  
  23. # git говорит, сделайте другую комманду, и я сосздам ваш бренч и отправлю файлы по ней
  24. $ git push --set-upstream origin deb_project002
  25. Перечисление объектов: 6, готово.
  26. Подсчет объектов: 100% (6/6), готово.
  27. При сжатии изменений используется до 2 потоков
  28. Сжатие объектов: 100% (3/3), готово.
  29. Запись объектов: 100% (4/4), 390 bytes | 130.00 KiB/s, готово.
  30. Всего 4 (изменения 0), повторно использовано 0 (изменения 0)
  31. remote:
  32. remote: Create a pull request for 'deb_project002' on GitHub by visiting:
  33. remote: https://github.com/shell/newproject/pull/new/deb_project002
  34. remote:
  35. To github.com:shell/newproject.git
  36. * [new branch] deb_project002 -> deb_project002
  37. Ветка «deb_project002» отслеживает внешнюю ветку «deb_project002» из «origin».
  38. $

Напоминаю, на сервере есть только одна ветка мастер, проверяем, что произошло. Заходим на GitHub в личный кабинет:

GitHub: клонирование и работа с репозиториями по SSH

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

GitHub: клонирование и работа с репозиториями по SSH

В правом в верхнем углу выбираем "Compare & pull request". Дальше пишите пояснения, какие изменения были, что протестировали и т.д. Указываете какую ветку соединить с мастером и отправляете:

GitHub: клонирование и работа с репозиториями по SSH

В итоге будет такое окно. У вас либо будет право на соединение (как у меня, так как я сам себе админ), либо нет. Тогда ждете подтверждения вышестоящего:

GitHub: клонирование и работа с репозиториями по SSH

На этом все! Спасибо, что читали наши материалы.

Источник: http://linuxsql.ru