PS-Studio.info

Веб и веб-технологии

ABC 21.01.2020 в 15:35

Git - первое знакомство: работаем с проектом стороннего репозитория

В качестве стороннего репозитория (репозитория организации) я возьму свой тестовый репозиторий, созданный мною ранее (об этом вы можете прочитать в предыдущей статье цикла о знакомстве с Git).

Я зарегистрировал еще один аккаунт на GitHub (это будет аккаунт отдельного сотрудника организации). Теперь мы можем начинать работу.

Репозиторий организации - это общий репозиторий, рабочая версия проекта (или, по-другому, мастер-репозиторий).
Чтобы иметь возможность работать с содержимым мастер-репозитория, необходимо сделать его копию(форк) и работать уже с ней, вносить исправления, дополнения итд.
Всё, что вы делаете в копии проекта, напрямую не отражается на состоянии мастер-репозитория.

Шаг 1.

Заходим в мастер-репозиторий организации, для этого нужно знать либо адрес мастер-репозитория, либо адрес профиля организации.
Допустим, у меня есть адрес мастер-репозитория https://github.com/AVStepanoff/test, захожу на страницу мастер-репозитория проекта test и вижу значок вилки с надписью Fork:



нажимаем на этот значок, готово, форк (копия) мастер-репозитория создана и находится в вашем профиле на GitHub!



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

forked from AVStepanoff/test

эта подпись говорит, что это копия репозитория test с аккаунта AVStepanoff.

Теперь, чтобы мы могли работать с копией мастер-репозитория, размещённой в нашем профиле на GitHub, её нужно скопировать себе на компьютер.
Для этого, в форке на GitHub жмём на зелёную кнопку с надписью Clone or download



далее выбираем Use SSH и копируем ссылку из поля:



я нажму на рабочем столе своего компьютера правой кнопкой мыши и выберу в выпадающем меню Git Bash Here, чтобы запустить консоль Git Bash

теперь в консоли Git Bash прописываем команду git clone + скопированная ссылка

git clone git@github.com:AVStepa/test.git

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



Теперь у нас на компьютере есть копия мастер-репозитория, с которой мы можем работать. В этой копии всего одна ветка, и это главная ветка называется master. От этой ветки нам нужно сделать ответвление - другую ветку, в которой мы и будем работать, чтобы не поломать код в основной ветке.

В консоли Git Bash выполним команду, чтобы посмотреть список имеющихся веток:

git branch



мы видим лишь одну ветку master, создадим новую ветку:

git checkout -b имя-новой-ветки

я назову новую ветку task1, тогда команда примет вид:

git checkout -b task1



если теперь мы снова выполним команду, чтобы просмотреть список веток, то увидим, что теперь их две: master и task1, причём мы находимся в данный момент в ветке task1, она отмечена звёздочкой как активная



между ветками можно переключаться с помощью команды

git checkout имя_ветки

Разберём на примере рабочий процесс.

В копии проекта, у себя на компьютере, я взял файл index.html, открыл его в текстовом редакторе и добавил какой-то код. Файл изменился? Конечно же да, и если набрать в консоли запрос статуса файлов, то Git покажет, что есть такой-то файл, который был изменён. Проверим.

Открываем консоль Git Bash, я делаю это, нажимая правой кнопкой мыши на папке с проектом и выбирая в выпадающем меню Git Bash Here.
Я сразу попадаю в папку проекта, в ветку task1. Набираю команду проверки статуса файлов:

git status

как и предполагалось, Git вывел уведомление, что обнаружены изменения в файле index.html:



Нам нужно зафиксировать это изменение, для это добавим файл index.html в индекс:

git add index.html

Создаём коммит (фиксируем сохранённые изменения и даём название):

git commit -m "Краткое сообщение о сути изменений"

я напишу так:

git commit -m "Добавлен заголовок h1"



Ок, мы сохранили все изменения. Но лишь в локальном виде! Если сейчас открыть наш форк в браузере, то мы увидим, что там всё по-старому: ветка одна, коммитов новых нет:



чтож, исправляемся, отправляем все изменения на GitHub командой git push:

git push origin task1



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



веток стало 2, master и task1, причём если мы находимся в ветке master, то видим, что число коммитов не изменилось, как было 3, так и есть, но если мы переключимся на ветку task1 (клик по кнопке Branch - выбрать нужную ветку), то видим, что коммитов стало 4, и видим наш коммит "Добавлен заголовок h1"



Теперь нам нужно наши изменения предложить master репозиторию проекта, с которого мы делали форк(копию), как бы говоря: я вот тут кое-что придумал, посмотрите пожалуйста)
Для этого, находясь в ветке task1 форка на GitHub, нажимаем кнопку New pull request, откроется окно добавления нового пулл реквеста, в котором мы видим, что изменения предлагаются из ветки task1 форка в master-репозиторий:



при желании, вы можете добавить какой-либо комментарий, после чего жмём кнопку Create pull request



готово, мы создали pull request, и теперь администратор проекта, с которого мы делали копию, должен просмотреть предлагаемые вами изменения и либо принять их, либо отклонить для правки.

Если ваш pull request успешно принят, то в master-репозитории будет обновлённая информация, а в вашем форке нет, поэтому нужно это исправить.
Для этого в локальном репозитории, находясь в ветке master, выполняем команду:

git remote add upstream https://github.com/AVStepanoff/test.git

при этом указываем ссылку на репозиторий, с которого делали форк (мастер-репозиторий), upstream - это будет теперь короткое название для мастер-репозитория.
Синхронизируемся с upstream и получаем из него все данные:

git fetch upstream

теперь, в консоли Git Bash выполняем команду:

git merge upstream/master

тем самым мы сливаем ветку master из upstream со своей веткой master, после чего нам только остаётся отправить все изменения в свой форк на GitHub

git push

Добавлять комментарии могут только зарегистрированные пользователи.