В этой статье разберем как клонировать с GitHub, вносить правки в проект и отправлять на согласование обратно. По сути полный рабочий цикл в рамках простых изменений. Данная статья является продолжением первой статьи "Знакомство с GitHub и локальным репозиторием". Все примера приведены в Linux Debia 10.
В статье ранее обсудили создание аккаунта и первого репозитория. Продолжим. У нас создан "newproject":
1. Клонируем наш проект на локальную машину. Для этого заходим в "newproject" в окно, на картинке выше. Есть два варианта "Clone or download" (зеленая кнопка в правой части):
Мы будем использовать вариант по SSH, так как он более безопасный и надежный. Перед тем как использовать этот вариант, необходимо создать ключи для SSH. Начнем:
# перешли в домашний каталог текущего пользователя, не root $ cd ~ # перешли в папку .ssh, где будут ключи, если нет папки, при создании ключа, появится $ cd .ssh # генерируем ключ, самый простой. На все вопросы отвечаем "Enter" $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/debuser/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/debuser/.ssh/id_rsa. Your public key has been saved in /home/debuser/.ssh/id_rsa.pub. The key fingerprint is: ... +----[SHA256]-----+ # проверяем наш ключ $ ls -la -rw------- 1 debuser debuser 1823 сен 26 11:12 id_rsa -rw-r--r-- 1 debuser debuser 395 сен 26 11:12 id_rsa.pub # просмотрим содержимое открытого ключа и скопируем $ cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDwlukrH+e79iPXbGmu5TovBeH7L2nogDitWEib8lR1XpYrNLRIzc6zT3z9B/Gi03SeNWgoS4WosNnIEQ+hFnxxHoEdcuygr0kZQbuuwogwSeH9vVKXQiwIoPutewUQ3SIWJ4K4qJDEyGGvsh/r3olpn40s0UEY0Kx1py6jLg84xPVLEiw/SEA1T8JzhvjPk544VJSaN7dE6TdJAKlembvd1GFcDyc/9nzKXAMJGyoddU+5P76C8oiy+o5QpKgUPTsGJiRC13WN2L+kTOaPrYMLhkBThFIGMwJgmFgpqUOjW9MYo1DGrsvbvQ9A9kdU53zB+jw2rvLe9smHEMn2FodJ debuser@debsv
Дальше идем в личный кабинет GitHub, правый верхний угол "основное меню - пиктограмма", раздел "Settings", подраздел "SSH and GPG keys" и нажимаем "New SSH key":
В поле "Title" пишем название, у нас "GitHubLocal", в поле "Key" вводим наш ключ "ssh-rsa AAAA...odJ debuser@debsv" и сохраняем, попросит пароль для подтверждения действия. Все, наш ключ будет использован при подключении с локального компьютера к GitHub при клонировании из под нашего пользователя.
Возвращаемся к нашему локальному Linux и для удобства создаем папку под проекты GitHub:
$ pwd /home/debuser/Документы $ mkdir githublocal $ cd githublocal/ $
Приступим к клонированию ветки с GitHub. Для этого заходим опять в личный кабинет GitHub, нажимаем на "Clone or download" и выбираем SSH, копируем ссылку. Дальше вводим следующую команду на нашем Linux (git clone):
$ git clone git@github.com:shell/newproject.git Клонирование в «newproject»… remote: Enumerating objects: 6, done. remote: Counting objects: 100% (6/6), done. remote: Compressing objects: 100% (2/2), done. remote: Total 6 (delta 0), reused 3 (delta 0), pack-reused 0 Получение объектов: 100% (6/6), готово.
Проверяем что произошло:
$ ls -la итого 12 drwxr-xr-x 3 debuser debuser 4096 сен 26 12:21 . drwxr-xr-x 6 debuser debuser 4096 сен 26 11:30 .. drwxr-xr-x 3 debuser debuser 4096 сен 26 12:21 newproject $ cd newproject/ $ ls -la итого 16 drwxr-xr-x 3 debuser debuser 4096 сен 26 12:21 . drwxr-xr-x 3 debuser debuser 4096 сен 26 12:21 .. drwxr-xr-x 8 debuser debuser 4096 сен 26 12:21 .git -rw-r--r-- 1 debuser debuser 12 сен 26 12:21 README.md $
Все получилось! Мы загрузили данные с GitHub, на свой локальный компьютер. И как видим, там только один файл README которой создал сам GitHub при создании нашего репозитория. В случае боевого клонирования, у вас будет куча файлов для разработки и редактирования.
Теперь внесем данные со своим файлом и отправим обратно на сервер GitHub. Если кто не знает или не читал, все комманды которые мы сейчас будем использовать, описанны в предыдущей статье, тут: Знакомство с GitHub
Создаем свой файл с кодом, и отправляем на GitHub:
# чтобы не создавать отдельный файл, просто перенаправим текст через echo, который и создаст файл с кодом: $ echo 'print("Hello GitHub")' > PythonGit.py # считаем содержимое файла и выведем для просмотра $ cat PythonGit.py print("Hello GitHub") # проверим от кого будет коммит $ git config -l user.email=user@localhost user.name=DebUser # Проверим статус файла $ git status На ветке master Ваша ветка обновлена в соответствии с «origin/master». Неотслеживаемые файлы: (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит) PythonGit.py ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их) # надо добавить файл, нам посказывает справка выше $ git add * # проверим еще раз статус $ git status На ветке master Ваша ветка обновлена в соответствии с «origin/master». Изменения, которые будут включены в коммит: (используйте «git reset HEAD <файл>…», чтобы убрать из индекса) новый файл: PythonGit.py # файл готов для коммита $ git commit -m "My one Git" [master 8d9399a] My one Git 1 file changed, 1 insertion(+) create mode 100644 PythonGit.py # отправляем наш локальный репозиторий в GitHub на сервер. # ВНИМАНИЕ!!! Тут сервер не спрашивает наш логин и пароль, так как выше мы настроили работу по SSH $ git push origin Перечисление объектов: 4, готово. Подсчет объектов: 100% (4/4), готово. При сжатии изменений используется до 2 потоков Сжатие объектов: 100% (2/2), готово. Запись объектов: 100% (3/3), 299 bytes | 299.00 KiB/s, готово. Всего 3 (изменения 0), повторно использовано 0 (изменения 0) To github.com:shell/newproject.git 697065a..8d9399a master -> master
Проверяем что получилось, для этого заходим в личный кабинет GitHub в нашу созданную ветку:
Как мы видим, наш файл благополучно загрузился. Вы может его редактировать и вносить правки на локальном Linux, а потом отправлять на сервер. Можете делиться ссылками для совместых разработок. Все примеры выше, в рамках ветки "Branch: master". Использовать эту ветку в реальных боевых условиях "работодателя или крупного своего проекта" не рекомендуем. Желательно создать отдельную ветку для разработки, а в случае удачного исполнения, сливать в основную мастер. Поэтому, сейчас рассмотрим вариант работы с веткой для разработки, не используя мастер.
Рассмотрим ситуацию: нам дали ссылку для клонирования нового проекта(на примере ниже, будем использовать наш же проект) и нам ненадо вносить изминения в мастер, необходимо создать свой branch. Для этого, делаем следующе:
# создаем новый каталог, под новый проект. Переходим в него, и делаем clone данной нам ссылки $ mkdir project2 $ cd project2/ $ git clone git@github.com:shell/newproject.git Клонирование в «newproject»… remote: Enumerating objects: 9, done. remote: Counting objects: 100% (9/9), done. remote: Compressing objects: 100% (4/4), done. remote: Total 9 (delta 0), reused 6 (delta 0), pack-reused 0 Получение объектов: 100% (9/9), готово. # проверяем что склонировали с сервера $ ls -la итого 12 drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 . drwxr-xr-x 4 debuser debuser 4096 сен 26 13:01 .. drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 newproject # переходим в мастера и смотрим содержимое $ cd /home/debuser/Документы/githublocal/project2/newproject/ $ ls -la итого 20 drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 . drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 .. drwxr-xr-x 8 debuser debuser 4096 сен 26 13:02 .git -rw-r--r-- 1 debuser debuser 22 сен 26 13:02 PythonGit.py -rw-r--r-- 1 debuser debuser 12 сен 26 13:02 README.md # Чтобы не портить мастера, создаем свою ветку для редактирования. Но сначала проверим, в какой ветке мы работаем $ git branch * master $ git checkout -b deb_project002 Переключено на новую ветку «deb_project002» # проверяем в какой ветке мы находимся $ git branch * deb_project002 master # начинаем создавать правки, код, файлы. Я все делаю условно, для примера, не более $ echo 'print("New cod blabla")' > Pyt2.py $ echo 'print("New cod blabla Cod #2")' >> PythonGit.py # Проверяем что получилось $ ls -la итого 24 drwxr-xr-x 3 debuser debuser 4096 сен 26 13:06 . drwxr-xr-x 3 debuser debuser 4096 сен 26 13:02 .. drwxr-xr-x 8 debuser debuser 4096 сен 26 13:04 .git -rw-r--r-- 1 debuser debuser 24 сен 26 13:06 Pyt2.py -rw-r--r-- 1 debuser debuser 53 сен 26 13:06 PythonGit.py -rw-r--r-- 1 debuser debuser 12 сен 26 13:02 README.md
В коде выше, мы скачали мастер бренч, перешли в свой бренч и отредактировали данные для сервера. По сути мы взяли проект, сделали его копию в рамках своей ветки, и провели редактирование. Дальше нам надо отправить проект на сервер и согласовать объединение нашей ветки с веткой мастера. При условии, что мы внесли верные изминения в проект и их можно выдавать в так называемый продакшинс.
Приступим к отправке наших правок на сервер GitHub и посмотрим куда они попадут:
# добавим наши правки и разработки. Проверим статус $ git add * $ git status На ветке deb_project002 Изменения, которые будут включены в коммит: (используйте «git reset HEAD <файл>…», чтобы убрать из индекса) новый файл: Pyt2.py изменено: PythonGit.py # делаем коммит, он будет локальный! $ git commit -m "Local copy new project 2" [deb_project002 133f661] Local copy new project 2 2 files changed, 2 insertions(+) create mode 100644 Pyt2.py # отправляем на сервер, но! мы выше создали свой бренч, и сервер ничего про него знать не знает $ git push origin fatal: Текущая ветка deb_project002 не имеет вышестоящей ветки. Чтобы отправить текущую ветку и установить внешнюю ветку как вышестоящую для этой ветки, используйте git push --set-upstream origin deb_project002 # git говорит, сделайте другую комманду, и я сосздам ваш бренч и отправлю файлы по ней $ git push --set-upstream origin deb_project002 Перечисление объектов: 6, готово. Подсчет объектов: 100% (6/6), готово. При сжатии изменений используется до 2 потоков Сжатие объектов: 100% (3/3), готово. Запись объектов: 100% (4/4), 390 bytes | 130.00 KiB/s, готово. Всего 4 (изменения 0), повторно использовано 0 (изменения 0) remote: remote: Create a pull request for 'deb_project002' on GitHub by visiting: remote: https://github.com/shell/newproject/pull/new/deb_project002 remote: To github.com:shell/newproject.git * [new branch] deb_project002 -> deb_project002 Ветка «deb_project002» отслеживает внешнюю ветку «deb_project002» из «origin». $
Напоминаю, на сервере есть только одна ветка мастер, проверяем, что произошло. Заходим на GitHub в личный кабинет:
Переключаемся в нашу ветку, и смотрим что там. Заметим, ветка основного мастера содержит те файлы которые были изначально, мы их никак не попортили:
В правом в верхнем углу выбираем "Compare & pull request". Дальше пишите пояснения, какие изменения были, что протестировали и т.д. Указываете какую ветку соединить с мастером и отправляете:
В итоге будет такое окно. У вас либо будет право на соединение (как у меня, так как я сам себе админ), либо нет. Тогда ждете подтверждения вышестоящего:
На этом все! Спасибо, что читали наши материалы.
Источник: http://linuxsql.ru