Пошаговое руководство для желающих внести свои изменения в открытый проект и правильно оформить запрос на слияние (Pull Request
).
- Скачать и установить git под вашу ОС
-
Установить Имя автора, от которого будут совершаться изменения
git config --global user.name "Ivan Ivanov"
-
Установить email, от которого будут совершаться изменения
git config --global user.name [email protected]
-
Установить имя интеграционной ветки по умолчанию
git config --global init.defaultBranch main
-
Установить настройку корректного отображения кириллицы в путях
git config --global core.quotePath false
-
При необходимости изменить редактор по умолчанию вместо стандартного редактора
vim
, на тот который вам по душе (редактор используется для ввода сообщений коммитов)git config --global core.editor code
-
Посмотреть текущие настройки
git
git config --list --show-origin
- Найти интересущий вас проект на GitHub
- Изучить документацию проекта и правила по его доработке (если таковые есть)
Каждая новая функция или исправление бага должны быть привязаны к
issue
(задаче, тикету). Это помогает организовать работу в одном месте: там можно найти всю историю запросов на слияние (Pull Request
), комментарии участников и принять участие в обсуждении задачи.
- В оригинальном проекте автора на
GitHub
зайти в разделissue
- Убедиться, что под задачу, над которой вы собираетесь работать есть
issue
- Если
issue
существует - убедиться, что никто не взял его в работу - Если
issue
не существует - создать, перед этим ознакомится с кратким руководством GitHub issues - Оставить комментарий, чтобы другие участники знали, что вы работаете над этой задачей
Fork
- это не командаGit
, это функция хостингов репозитория (напримерGitHub
).Fork
делает копию проекта из профиля автора в ваш профиль. При этом адрес репозитория, в который вы будете вносить доработки физически меняется - он теперь в вашем профиле. Эта технология позволяет легко производить доработки проекта, отправляя их затем в ваши форк-репозитория, так как вам не потребуется запрашивать права, чтобы внести изменения в оригинальный репозиторий автора.
- В оригинальном репозитории автора в правом верхнем углу страницы нажать на меню
Fork
и выбратьCreate a new fork
Если форк репозитория уже был создан ранее перейдите к следующему шагу.
Синхронизировать ваш fork-репозиторий необходимо чтобы поддерживать его в актуальном состоянии относительно оригинального репозитория автора. Синхронизируя fork-репозиторий мы догоняем по изменениям оригинальный репозиторий проекта.
- Из своего профиля на
GitHub
перейдите кfork-репозиторию
, который вы создали на прошлом шаге - Над списком файлов нажмите на меню
Sync fork
затемUpdate branch
- Если синхронизация выполнена успешно или
fork-репозиторий
содержит последние изменения из оригинальногое репозитория, то при последующем нажатии наSync fork
вы увидите надписьThis branch is not behind the upstream
Клонировании на локальную машину необходимо для непосредственного внесения доработок по вашей задаче (
issue
)
-
В вашем
fork-репозитрии
наGitHub
нажмите на кнопкуCode
(находится над кнопкойSync fork
) и скопируйте ссылку на закладкеHTTPS
, обычно она имеет видhttps://github.com/ваш-профиль/форк-репозиторий.git
-
Откройте консоль на вашей локальной машине
-
Перейдите в папку где хранятся (или планируете хранить)
git
проекты -
Склонируйте
fork-репозиторий
с помощью командыgit clone https://github.com/ваш-профиль/fork-репозиторий.git
-
При успешном клонировании вы увидите созданную директорию с названием проекта
Если клон репозитория уже был создан ранее перейти к следующему шагу.
Ветки позволяют разработчику сохранять разные изменения полностью независимо друг от друга. Вы можете работать над разными вещами одновременно, не смешивая изменения между собой. Ветка отражает историю коммитов. Ветки - это разные истории коммитов. Ветка - это просто ссылка на коммит по его ID, эта ссылка каждый раз обновляется когда вы делаете новый коммит. В любой момент времени можно создать новую ветку, переключиться между ветками, отказаться от ветки (т.е. отказаться от всей работы, которую вы в неё вложили), объединить ветки.
-
Перейти в рабочий каталог (локальный репозиторий)
cd projects/название-склонированного-репозитрия
-
Переключиться на ветку
main
git checkout main
-
Догнать в локальном репозитории изменения
fork-репозитория
git pull
-
Создать локальную ветку под задачу
git checkout -b feat/37/issue-name
feat
- тип коммита (соглашение о коммитах)37
- номер задачиissue
в основном репозитории проекта наGitHub
, позволяет при использовании командыgit status
сразу держать его перед глазами не тратя времени на поиски задачиissue-name
- наименование задачи, обычно просто берется название задачи (issue
) наGitHub
переводится в нижний регистр, пробелы заменяются на дефисы и осталвяют только значимые слова. Помните давая четкое, но краткое описание задачи, вы облегчаете себе понимание о чем это задача, или на каком моменте вы остановились, переключаясь между ветками
- Напишите код, который решает вашу задачу
- Проверьте, что ваш код работает и ничего не ломает (проведите unit-тестирование)
- При необходимости дополните документацию проекта описывающую ваши изменения
Команда
git add
создаёт копию файла, помещает его в индекс (специальную область для временного хранения данных) и начинает отслеживать все последующие изменения. Файлу присваивается статус "подготовленный" (staged
), что означает его готовность к фиксации в коммите. Индекс можно сравнить с черновиком, где вы можете вносить правки до момента, пока не решите зафиксировать изменения. Каждый зафиксированный коммит сохраняет состояние файлов таким, каким оно было на момент добавления в индекс.
-
После изменений проверьте состояние вашего репозитория, и убедитесь что изменения коснулись только файлов над которыми вы работали
git status
-
При необходимости посмотрите детали по вашим изменениям (разницу между текущим состоянием репозитория и последним коммитом)
git diff
-
Добавьте изменения в индекс
git add file-1 file-2
- Можно добавить все измененные файлы в индекс в текущей директории без ручного перечисления командой
git add .
- Можно добавить все измененные файлы в индекс в текущей директории без ручного перечисления командой
Команда
git commit
фиксирует все изменения в файлах, предварительно добавленных в индекс (git add
), сохраняя их в объектной базеGit
и помечая как неизменяемые. Каждый коммит представляет собой фиксацию состояния файлов на определённый момент времени. По сути, коммит — это снимок всех изменений, которые были включены в индекс. Он сохраняет состояние индекса в тот момент, когда вы решили зафиксировать изменения. Важно сопровождать коммит пояснительным сообщением, описывающим внесённые изменения. В процессе создания коммита формируется объект, который содержит метаданные, такие как ссылка на зафиксированные файлы, имя и электронная почта автора, временная метка коммита и текстовое сообщение.
-
Проверьте состояния репозитория после добавления измененных файлов в индекс, текст вывода должен содержать сообщение
Changes to be commited
под которым будет список файлов, которые были добавлены в индексgit status
-
Зафиксируйте (
commit
) измененияgit commit
-
После ввода команды откроется встроенный редактор для редактирования сообщения коммита
-
Введите сообщение коммита
feat: добавить обработчик редактирования текста (#37)
feat
- тип коммита (соглашение о коммитах)37
- номер задачиissue
в основном репозитории, необходимо чтобы привязать коммит кissue
наGitHub
- Всегда пишите осмысленные сообщения коммитов, это позволит вам легко понять цель внесённых изменений, если в будущем потребуется вернуться к этому коммиту в истории проекта
- Рекомендуется использовать повелительное наклонение в сообщениях коммитов. Вместо фраз вроде "обновлена документация проекта" или "исправлена ошибка авторизации", формулируйте сообщения так, будто вы даёте команду компьютеру. Например, напишите "обновить документацию проекта" или "исправить ошибку авторизации".
- Используйте команду
git commit
без флага-m
и каких либо флагов вообще - это вызовет открытие вашего редактора для сообщения коммита по умолчанию, где вы можете написать осмысленное хорошее сообщение коммита. Плюс данного подхода так же в том, что в редакторе можно вводить спец символы, которые достаточно сложно бывает экранировать при вводе сообщение коммита прямо в командной строке- Пишите сообщение коммита так же, как вы пишите электронное письмо - с заголовком и, необязательно, с телом
- Заголовок коммита от тела отделяется пустой строкой
- В заголовке коммита постарайтесь кратко описать о чем этот коммит
- Если вам нужно уточнить почему было сделано это изменение опишите это в теле коммита
- Сообщение коммита должно фокусироваться на "причинах" изменения, а не на том "как" или "что" сделано. Конечно это не всегда возможно, но об этом стоит помнить
- Тип коммита обычное следует из типа задачи, которую вам поставили, лучше заранее посоветоваться с командой и закументировать список типов, чтобы использовать их единообразно
- Помните что опечатку в тексте коммита, можно исправить применением флага
--amend
-
Отправьте изменения в ваш удаленный
fork-репозиторий
наGitHub
git push -u origin feat/37/issue-name
- Перейдите в свой
fork-репозиторий
наGitHub
и нажмитеPull Request
- Выберите свою ветку
- В комментарии напишите
Close #37
- это позволит связать запрос на слияние (Pull Request
) и задачу (issue
) по ее номеру, и если ваши дороботки будут слиты с интеграционной веткой - задача будет автоматически закрыта благодаря такому связыванию
- В идеальном случае ваши доработки будут одобрены и слиты в интеграционную ветку оригинального проекта
- Автор так же в праве сделать вам предложения доработать ваши изменения, если он посчитает что изменения в них нуждаются