I’ve opened a pull request to a project. The maintainer has decided to accept it, but told me to modify some contents.
How can I do it? Whether I should keep the commit hash unchanged, how can I do it?
asked May 25, 2013 at 9:18
0
Just push more commits on to the branch the request is for. The pull request will pick this up then.
Example:
If you want to have b merged into master
- You push c1,c2,c3 to b
- then you make a new request for b
- it gets reviewed and you need more commits
- You push c11,c21,c31 to b
- The pull request now shows all 6 six commits
Ivan Aracki
4,61311 gold badges58 silver badges68 bronze badges
answered May 25, 2013 at 9:34
Daij-DjanDaij-Djan
49.1k17 gold badges111 silver badges135 bronze badges
5
I just had one commit in a pull request, and I used git commit --amend
to update it. I then did a force push with git push -f
so my amended commit replaced the original one. The pull request automatically picked up the new commit. (It actually showed both commits, but when I reloaded the page the old commit had gone.)
So while a forced push is generally not recommended, it can be useful for pull requests. It’s not recommended because if someone bases a commit on top of yours then they will have to do a rebase after your change. But since nobody should be basing their work on an under-review pull request, it should be pretty safe in this situation.
answered Sep 28, 2015 at 8:28
MalvineousMalvineous
24.1k16 gold badges116 silver badges147 bronze badges
If you continue to make changes and keep pushing to the same branch, the refined commits will be added to the same pull request (unless your pull request has been merged). This could make the history very cluttered.
An alternate solution and a technique that I use is as follows:
-
Create a new branch (fixes) from the repository(upstream) and branch (develop) to which you intend to send the pull request by doing:
git branch fixes upstream/develop
-
Add your refined commits directly to this newly created branch.
git commit -m «your message»
-
Push this branch to your own forked remote (could be named origin).
- Compare and send in a new pull request with clean commit history.
- Also, it is a good idea to delete your branch after the pull request has been merged.
- And you can comment and close your earlier pull requests.
answered Apr 29, 2014 at 18:08
user_19user_19
5811 gold badge7 silver badges13 bronze badges
You also can use github api.
example with curl
curl --user "your_github_username"
--request PATCH
--data '{"title":"newtitle","body":"newbody",...}'
https://api.github.com/repos/:owner/:repo/pulls/:number
you can find the detailled list of data in github developer doc
example : change name of my pull request
curl --user "jeremyclement"
--request PATCH
--data '{"title":"allows the control of files and folders permissions."}'
https://api.github.com/repos/Gregwar/Cache/pulls/9
answered Mar 27, 2014 at 11:04
hexaJerhexaJer
7956 silver badges12 bronze badges
1
Apply your changes over top of your existing branch where the PR is created. For example if you branch name is newFeature
and you have create PR to merge newFeature
into develop
branch. Apply the suggested changes on the newFeature branch with as many commits you want. Once you are completed with fixing suggested review changes. Allow the reviewer to re-review it. Once approved you should be able to merge your PR.
You can use SourceTree or some GUI tool if you need help in general with git.
answered Apr 9, 2021 at 11:45
MaxMax
5,0796 gold badges40 silver badges65 bronze badges
26th Oct 2018
When you submit a pull request, a collaborator will have the right to review your pull request. They’ll decide whether to accept your pull request. If they accept your pull request, your code will be merged into the branch you requested for.
You’re going to learn how a review process will look like from both points of view:
- The person who’s reviewing the process
- The person who’s submitting the review
Merging the pull request
For this lesson, I’ll use the following accounts:
zellwk
as the reviewerzellwk2
as the person who submitted the pull request
As the reviewer, if you scroll down to the bottom of the page, you’ll see a green button that says merge pull request. You see this because you have write access to the repository.
If you want to merge the pull request, you can click on the green button and you’re done.
If you don’t have write access to the repository, you won’t see a button that says merge pull request.
Reviewing the pull request
As a reviewer, you’ll want to click on the files changed tab. This tells you what files have changed.
You’ll come to a page with two sets of code:
- The left set is the current code
- The right set is the proposed code
You can see what code is added or removed in this view. Green lines signify code that’s added. Red lines signify code that’s removed.
The reviewer can comment, approve, or request for changes as they see fit. To do so, they can click on the review changes button on the top-right-hand corner.
If you click on the review changes button, you’ll see three options:
- Comment
- Approve
- Request changes
A better way to review
A better way to review the code is to provide feedback on the line of code that requires feedback.
You can do this by hovering over the line you want to provide feedback for. When you do so, you’ll see a blue +
button.
When you click on the blue +
button, you’ll see an editor. You can comment on the line of code here.
There are two options:
- Add a single comment
- Start a review
If you click on add single comment, the comment will be made immediately.
If you click on start a review, you’ll have the chance to write more comments before sending them at once. To end the review, you need to click on the review changes button and select submit review.
The pull request will be updated with your changes after you submit your review:
Working on the pull request
The person who is submitting the pull request can also see the comments.
If you’re working on the pull request, you have to make the necessary changes. To do so, you go back to your forked repository and update the same branch you used to submit the pull request.
In this case, this will be the development branch. I went ahead and added the closing <ul>
tag in the index.html
file. I also set the commit message to closing <ul> appropriately
.
Github will update the pull request with the new changes once the submitter pushes into the forked repository.
The reviewer can now merge the request by clicking on the merge pull request button.
After the merge
You can delete the forked repository (or the branch you used for the pull request) after the code is merged into the main repository. They’re no longer needed.
Wrapping up
You learned how to review and edit a pull request in this lesson.
To edit a pull request, you push new changes into the same branch that was used for the pull request. Github will update everything else automatically.
If you enjoyed this article, please support me by sharing this article Twitter or buying me a coffee 😉. If you spot a typo, I’d appreciate if you can correct it on GitHub. Thank you!
Перевод статьи «How to make your first pull request on GitHub».
Что такое форк?
Когда нам нравится чей-то репозиторий и мы хотели бы иметь его в собственном аккаунте на GitHub, мы делаем форк («вилку») этого репозитория, чтобы иметь возможность работать с ним отдельно.
Когда мы делаем форк репозитория, мы
получаем экземпляр всего репозитория,
со всей его историей. После форка мы
можем делать с ним все, что угодно:
оригинальная версия при этом не будет
задета.
Что такое пул-реквест?
Пул-реквесты нужны. Когда мы хотим
принять участие в групповой разработке
проектов с открытым исходным кодом.
Например, пользователь Павел делает
форк репозитория ThanoshanMV (автора статьи,
— прим. перев.) и вносит изменения в свой
экземпляр. После этого Павел отсылает
пул-реквест ThanoshanMV, который может либо
принять его, либо отклонить. По сути это
что-то вроде письма «Не будете ли вы так
любезны, уважаемый ThanoshanMV, внести мои
изменения в свой оригинальный репозиторий?»
Как можно стать контрибьютором
проекта?
Участие в проекте с открытым исходным
кодом не обязательно предполагает
работу именно с кодом. Контрибьютором
(участником) можно стать и другими
способами, некоторые из них описаны
ниже.
- Дизайн. Можно создать макеты
проекта, чтобы повысить удобство его
использования, усовершенствовать
навигацию или меню, создать рисунки
для лого или футболок, написать
руководство по стилю проекта. - Писательство. Можно написать
документацию проекта или улучшить уже
существующую, перевести документацию
на свой язык, создать новостную рассылку
для проекта, написать руководства для
пользователей или заняться формированием
папки с примерами использования. - Организаторские задачи. Можно
связывать дублирующиеся issues, предлагать
новые метки для issues, предлагать закрытие
старых, но еще открытых issues, задавать
вопросы в новых — чтобы подстегивать
развитие дискуссии. - Помощь другим людям. Можно
отвечать на вопросы в открытых issues,
проверять код других разработчиков,
предлагать помощь в качестве наставника. - Написание кода. Можно помогать
в решении возникших проблем, предлагать
создание новых фич, а также улучшать
инструментарий и тестирование.
Давайте создадим наш первый
пул-реквест!
1. Форк репозитория
Чтобы сделать форк репозитория, нужно
нажать кнопку «Fork» в верху страницы.
Таким образом вы создадите экземпляр
всего этого репозитория в своем аккаунте.
2. Клонирование репозитория
Когда репозиторий уже есть в вашем
аккаунте, вы можете клонировать его на
свою машину и в дальнейшем работать с
ним локально.
Чтобы клонировать репозиторий, нажмите
кнопку «clone» и скопируйте ссылку.
Откройте терминал и запустите следующую
команду. С ее помощью репозиторий будет
клонирован на вашу машину.
$ git clone [HTTPS ADDRESS]
Теперь у вас есть копия ветки master
основного онлайн-репозитория проекта.
Переходим в клонированную директорию:
$ cd [NAME OF REPOSITORY]
3. Создание ветки
При работе с репозиторием хорошей
практикой считается создание отдельной
ветки для внесения изменений, причем
это не зависит от размеров проекта.
Имя ветки должно быть коротким и
отражать те изменения, которые вы
вносите.
Создадим ветку при помощи команды git
checkout:
$ git checkout -b [Branch Name]
4. Внесение изменений и коммит
Внесите необходимы изменения в проект
и сохраните их. Затем запустите команду
git status: вы увидите внесенные изменения.
Добавьте эти изменения в только что
созданную ветку при помощи команды git
add:
$ git add .
Теперь вы можете сделать коммит этих
изменений при помощи команды git commit:
$ git commit -m "Adding an article to week 02 of articles of the week"
5. Отправка изменений на
GitHub
Чтобы отправить изменения на GitHub
(сделать push), нужно определить имя
удаленного репозитория.
$ git remote
Имя данного удаленного репозитория
— «origin».
После определения имени можно безопасно
отправить изменения на GitHub.
git push origin [Branch Name]
6. Создание пул-реквеста
Перейдите в свой репозиторий на GitHub.
Там есть кнопка «Compare & pull request» —
кликните ее.
Введите необходимые детали относительно того, что именно вы сделали (чтобы поставить ссылку на issues, возмользуйтесь знаком «решетки»). После этого можно нажать кнопку подтверждения внизу.
Поздравляю! Вы создали свой первый пул-реквест. Если его примут, вы получите уведомление по электронной почте.
7. Синхронизация вашего форка
с основной веткой
Прежде чем создавать пул-реквест в
оригинальный репозиторий, нужно
синхронизировать свой экземпляр этого
репозитория с оригинальным.
Даже если вы не собираетесь отправлять
пул-реквест в оригинальный репозиторий,
все равно лучше синхронизироваться с
ним. Со времени создания форка в
оригинальном репозитории могли добавиться
новые фичи, а также могли быть исправлены
какие-то баги.
Проделайте следующие действия, чтобы
обновить свой репозиторий и внести
соответствующие изменения в свою ветку
master:
1. Для начала, проверьте, в какой ветке
вы находитесь.
$ git branch
Вы получите список всех веток, причем
активная будет подсвечена зеленым.
2. Переключитесь в ветку master.
$ git checkout master
3. Добавьте оригинальный репозиторий
в качестве upstream-репозитория.
Чтобы вытащить изменения из оригинального репозитория и перенести их в свою версию, нужно добавить оригинальный git-репозиторий в качестве upstream-репозитория.
$ git remote add upstream [HTTPS]
Здесь [HTTPS] это url, который нужно
скопировать из основного репозитория.
4. Fetch репозитория
Заберите (fetch) все изменения из
оригинального репозитория. Коммиты,
сделанные в оригинальном репозитории,
будут сохранены в локальной ветке под
названием upstream/master.
$ git fetch upstream
5. Слейте изменения
Слейте (merge) изменения из upstream/master с
вашей локальной веткой master. Таким образом
главная ветка вашего форка репозитория
синхронизируется с upstream-репозиторием
без потери ваших локальных изменений.
$ git merge upstream/master
6. Отправьте изменения на GitHub
На этом этапе ваша локальная ветка
синхронизирована с веткой master оригинального
репозитория. Если вы хотите обновить
свой GitHub-репозиторий, нужно отправить
в него изменения.
$ git push origin master
Примечание. После синхронизации ветки master вашего форка вы можете при желании удалить remote. Но в будущем вам еще придется обновлять/синхронизировать ваш репозиторий, поэтому лучше его сохранить.
$ git remote rm [Remote Name]
8. Удаление ненужной ветки
Ветки создаются с какими-то конкретными
целями. Когда цель достигнута, необходимость
в ветке отпадает, поэтому ее можно
удалить.
$ git branch -d [Branch Name]
Вы можете удалить и версию этой ветки
на GitHub.
git push origin --delete [Branch Name]
Итоги
GitHub это мощный инструмент для контроля
истории версий. Каждый может стать
контрибьютором проекта с открытым
исходным кодом. Делается это путем
отправки пул-реквестов.
Чтобы стать контрибьютором, не
обязательно писать код: есть и другие
способы принять участие в проекте.
Наконец, я хотел бы также сказать, что не стоит переживать, если ваши пул-реквесты отклонят. Мейнтейнеры тратят много времени на улучшение своих проектов и они, безусловно, лучше знают эти проекты, чем вы. Поэтому не стоит переживать, если они решат не вливать в свой проект ваши изменения.
Внесение собственного вклада в проекты
Теперь наша учётная запись создана и настроена, давайте же пройдёмся по деталям, которые будут полезны при внесении вклада в уже существующие проекты.
Создание ответвлений (fork)
Если вы хотите вносить свой вклад в уже существующие проекты, в которых у нас нет прав на внесения изменений путём отправки (push) изменений, вы можете создать своё собственное ответвление (fork) проекта.
Это означает, что GitHub создаст вашу собственную копию проекта, данная копия будет находиться в вашем пространстве имён и вы сможете легко делать изменения путём отправки (push) изменений.
Примечание |
Исторически так сложилось, что англоязычный термин «fork» (создание ветвления проекта) имел негативный контекстный смысл, данный термин означал, что кто-то повёл или ведёт проект с открытым исходным кодом в другом, отличном от оригинала, направлении, иногда данный термин так же означал создание конкурирующего проекта с раздельными авторами. |
Таким образом, проекты не обеспокоены тем, чтобы пользователи, которые хотели бы выступать в роли соавторов, имели право на внесение изменений путём их отправки (push).
Люди просто могут создавать свои собственные ветвления (fork), вносить туда изменения, а затем отправлять свои внесённые изменения в оригинальный репозиторий проекта путём создания запроса на принятие изменений (Pull Request), сами же запросы на принятие изменений (Pull Request) будут описаны далее.
Запрос на принятие изменений (Pull Request) откроет новую ветвь с обсуждением отправляемого кода, и автор оригинального проекта, а так же другие его участники, могут принимать участие в обсуждении предлагаемых изменений до тех пор, пока автор проекта не будет ими доволен, после чего автор проекта может добавить предлагаемые изменения в проект.
Для того, чтобы создать ответвление проекта, зайдите на страницу проекта и нажмите кнопку «Создать ответвление» («Fork»), которая расположена в правом верхнем углу.
Рисунок 88. Кнопка «Создать ответвление» («Fork»)
Через несколько секунд вы будете перенаправлены на собственную новую проектную страницу, содержащую вашу копию, в которой у вас есть права на запись.
Рабочий процесс с использованием GitHub
GitHub разработан с прицелом на определённый рабочий процесс с использованием запросов на слияния.
Этот рабочий процесс хорошо подходит всем: и маленьким, сплочённым вокруг одного репозитория, командам; и крупным распределённым компаниям, и группам незнакомцев, сотрудничающих над проектом с сотней копий.
Рабочий процесс GitHub основан на тематических ветках, о которых мы говорили в главе Ветвление в Git.
Вот как это обычно работает:
-
Создайте форк проекта.
-
Создайте тематическую ветку на основании ветки
master
. -
Создайте один или несколько коммитов с изменениями, улучшающих проект.
-
Отправьте эту ветку в ваш проект на GitHub.
-
Откройте запрос на слияние на GitHub.
-
Обсуждайте его, вносите изменения, если нужно.
-
Владелец проекта принимает решение о принятии изменений, либо об их отклонении.
-
Получите обновлённую ветку
master
и отправьте её в свой форк.
Очень напоминает подход, описанный в разделе Диспетчер интеграции главы 5, но вместо использования электронной почты, команда сотрудничает через веб-интерфейс.
Давайте посмотрим, как можно предложить изменения в проект, размещённый на GitHub.
Подсказка |
В большинстве случаев можно использовать официальный инструмент GitHub CLI вместо веб-интерфейса GitHub. |
Создание запроса на слияние
Рисунок 89. Проект, над которым мы хотим поработать
Единственная проблема в том, что светодиод моргает слишком быстро; нам кажется, лучше установить задержку в три секунды, не одну.
Так давайте исправим это и предложим изменения автору.
Для начала, нажмите кнопку «Fork», как было сказано выше, чтобы заполучить собственную копию проекта.
Мы зарегистрированы на GitHub под именем «tonychacon», так что наша копия окажется по адресу https://github.com/tonychacon/blink
, где мы сможем редактировать её.
Мы клонируем его, создадим тематическую ветку, внесём необходимые изменения и, наконец, отправим их на GitHub.
$ git clone https://github.com/tonychacon/blink (1)
Cloning into 'blink'...
$ cd blink
$ git checkout -b slow-blink (2)
Switched to a new branch 'slow-blink'
$ sed -i '' 's/1000/3000/' blink.ino (macOS) (3)
# If you're on a Linux system, do this instead:
# $ sed -i 's/1000/3000/' blink.ino (3)
$ git diff --word-diff (4)
diff --git a/blink.ino b/blink.ino
index 15b9911..a6cc5a5 100644
--- a/blink.ino
+++ b/blink.ino
@@ -18,7 +18,7 @@ void setup() {
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
[-delay(1000);-]{+delay(3000);+} // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
[-delay(1000);-]{+delay(3000);+} // wait for a second
}
$ git commit -a -m 'Change delay to 3 seconds' (5)
[slow-blink 5ca509d] Change delay to 3 seconds
1 file changed, 2 insertions(+), 2 deletions(-)
$ git push origin slow-blink (6)
Username for 'https://github.com': tonychacon
Password for 'https://tonychacon@github.com':
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 340 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/tonychacon/blink
* [new branch] slow-blink -> slow-blink
-
Клонируем нашу копию
-
Создаём тематическую ветку
-
Вносим свои изменения
-
Проверяем изменения
-
Фиксируем изменения в тематической ветку
-
Отправляем новую ветку в нашу копию на GitHub
Теперь, если мы зайдём на страничку нашей копии на GitHub, мы увидим, что GitHub заметил наши изменения и предлагает открыть запрос на слияние с помощью большой зелёной кнопки.
Также можно зайти на страницу «Branches», по адресу https://github.com/<user>/<project>/branches
, найти интересующую ветку и открыть запрос оттуда.
Рисунок 90. Кнопка открытия запроса на слияние
Если нажать на эту кнопку, появится экран ввода заголовка и описания предлагаемых изменений на рассмотрение владельцу проекта.
Рекомендуется серьёзно подойти к составлению описания и сделать его максимально информативным, чтобы владелец проекта понимал, зачем эти изменения и какую пользу они принесут.
Также мы видим список коммитов в нашей тематической ветке, «опередивших» ветку master
(в данном случае всего один коммит) и предпросмотр всех изменений, вносимых этими коммитами.
Рисунок 91. Страница создания запроса на слияние
После создания запроса на слияние (путём нажатия кнопки «Create pull request» на этой странице) владелец форкнутого проекта получит уведомление о предложенных изменениях со ссылкой на страницу с информацией о запросе.
Примечание |
Запросы на слияние широко используются для публичных проектов типа описанного выше, когда участник уже подготовил все изменения для слияния с основным репозиторием. |
Обработка запроса на слияние
На этом этапе, владелец проекта может просмотреть предложенные изменения, принять, отклонить или прокомментировать их.
Предположим, ему импонирует идея, но он предпочёл бы большую задержку перед включением или выключением света.
В то время как в главе Распределенный Git обсуждение изменений может производится через электронную почту, на GitHub всё происходит онлайн.
Владелец проекта может просмотреть суммарные изменения, вносимые запросом, и прокомментировать любую отдельно взятую строку.
Рисунок 92. Комментирование определённой строки в запросе на слияние
Как только владелец прокомментирует изменения, автор запроса на слияние (а также все подписавшиеся на этот репозиторий) получат уведомления.
Далее мы рассмотрим как настроить уведомления, но сейчас, если Тони включил уведомления через электронную почту, он получит следующее письмо:
Рисунок 93. Комментарии, отправленные по электронной почте
Кто угодно может оставлять комментарии к запросу на слияние.
На Страница обсуждения запроса на слияние можно увидеть пример, где владелец проекта оставил комментарии как к строке кода, так и в основной секции обсуждения.
Как вы могли заметить, комментарии к коду так же приведены в виде обсуждения.
Рисунок 94. Страница обсуждения запроса на слияние
Теперь участник может видеть что ему необходимо сделать для того, чтобы его изменения были приняты.
К счастью, это тоже легко сделать.
Используя почту, вам потребуется заново отправить свои изменения в список рассылки, а при использовании GitHub вы просто делаете коммит в тематическую ветку и повторяете push, что автоматически обновляет запрос на слияние.
На рисунке Финальная стадия запроса на слияние также видно, что в обновленном запросе на слияние старый комментарий к коду был свёрнут, так как он относится к строке, которая с тех пор изменилась.
Когда участник сделает это, владелец проекта снова получит уведомление, а на странице запроса будет отмечено, что проблема решена.
Фактически, как только строка кода имеющая комментарий будет изменена, GitHub заметит это и удалит устаревшее отличие.
Рисунок 95. Финальная стадия запроса на слияние
Примечательно, что если вы перейдёте на вкладку «Files Changed» в этом запросе на слияние, то увидите «унифицированную» разницу — это суммарные изменения, которые будут включены в основную ветку при слиянии тематической ветки.
В терминологии git diff
это эквивалентно команде git diff master…<branch>
для ветки, на которой основан этот запрос на слияние.
В Определение применяемых изменений детальнее описан данный тип отличий.
GitHub так же проверяет может ли запрос на слияние быть применён без конфликтов и предоставляет кнопку для осуществления слияния на сервере.
Эта кнопка отображается только если у вас есть права на запись в репозиторий и возможно простейшее слияние.
По нажатию на неё GitHub произведёт «non-fast-forward» слияние, что значит даже если слияние может быть осуществлено перемоткой вперед, всё равно будет создан коммит слияния.
При желании, можно стянуть ветку и произвести слияние локально.
Если эта ветка будет слита в master
ветку и отправлена на сервер, то GitHub автоматически закроет запрос на слияние.
Это основной рабочий процесс, который используется большинством проектов на GitHub.
Создаются тематические ветки, открываются запросы на слияние, производится обсуждение, при необходимости производятся доработки в ветке и, наконец, запрос либо закрывается, либо сливается.
Примечание |
Не только ответвления Важно отметить, что можно открывать запросы на слияние между двумя ветками в одном репозитории. |
Продвинутые запросы на слияние
На текущий момент мы рассмотрели основы участия в проекте на GitHub, давайте рассмотрим некоторые интересные секреты и уловки касательно запросов слияния, чтобы вы могли более эффективно их использовать.
Запросы слияния как Патчи
Важно понимать, что многие проекты не воспринимают запросы слияния как очередь идеальных патчей, которые должны применяться аккуратно и по порядку, как и большинство проектов, участие в которых основывается на отправке набора патчей через списки почтовых рассылок.
Большинство проектов на GitHub понимают ветки запросов на слияние как беседу относительно предлагаемого изменения, завершающуюся слиянием унифицированных изменений.
Это важное различие, так как изменение предлагается до того, как код станет считаться идеальным, что гораздо реже происходит с распространяемыми наборами патчей через списки рассылок.
Обсуждение происходит на более раннем этапе и выработка правильного решения происходит за счёт усилий сообщества.
Когда код предлагается через запрос на слияние и сопровождающий проекта или сообщество предлагает изменения, то не применяется набор патчей, а отправляются результирующие изменения как новый коммит в ветку, двигая обсуждение вперёд и сохраняя уже проделанную работу нетронутой.
Например, если вы вернётесь и посмотрите на Финальная стадия запроса на слияние, то увидите, что участник не делал перебазирование своего коммита и не отправлял новый запрос на слияние.
Вместо этого были сделаны новые коммиты и отправлены в существующую ветку.
Таким образом, если вы в будущем вернётесь к этому запросу слияния, то легко найдёте весь контекст принятого решения.
По нажатию кнопки «Merge» целенаправленно создаётся коммит слияния, который указывает на запрос слияния, оставляя возможность возврата к цепочке обсуждения.
Следование за исходным репозиторием
Если ваш запрос на слияние устарел или не может быть слит без конфликтов, то вам нужно изменить его, чтобы сопровождающий мог просто его слить.
GitHub проверит это за вас и под каждым из запросов на слияние отобразит уведомление, можно ли его слить без конфликтов или нет.
Рисунок 96. Запрос имеет конфликты слияния
Если вы видите что-то вроде Запрос имеет конфликты слияния, то вам следует изменить свою ветку так, чтобы исключить конфликты и сопровождающий не делал лишнюю работу.
Существует два основных варианта это сделать.
Вы можете либо перебазировать свою ветку относительно целевой ветки (обычно, относительно master
ветки исходного репозитория), либо слить целевую ветку в свою.
Большинство разработчиков на GitHub выбирают последний вариант по тем же причинам, что и мы в предыдущем разделе.
Важна история и окончательное слияние, а перебазирование не принесёт вам ничего, кроме немного более чистой истории, при этом оно гораздо сложнее и может стать источником ошибок.
Если вы хотите сделать запрос на слияние применяемым, то следует добавить исходный репозиторий как новый удалённый, слить изменения из его основной ветки в вашу тематическую, если имеются исправить все проблемы и, наконец, отправить все изменения в ту ветку, на основании которой был открыт запрос на слияние.
Предположим, что в примере «tonychacon», который мы использовали ранее, основной автор сделал изменения, которые конфликтуют с запросом на слияние.
Рассмотрим это пошагово.
$ git remote add upstream https://github.com/schacon/blink (1)
$ git fetch upstream (2)
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From https://github.com/schacon/blink
* [new branch] master -> upstream/master
$ git merge upstream/master (3)
Auto-merging blink.ino
CONFLICT (content): Merge conflict in blink.ino
Automatic merge failed; fix conflicts and then commit the result.
$ vim blink.ino (4)
$ git add blink.ino
$ git commit
[slow-blink 3c8d735] Merge remote-tracking branch 'upstream/master'
into slower-blink
$ git push origin slow-blink (5)
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 682 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To https://github.com/tonychacon/blink
ef4725c..3c8d735 slower-blink -> slow-blink
-
Добавляем исходный репозиторий как удалённый с именем
upstream
. -
Получаем последние изменения из него.
-
Сливаем основную ветку в нашу тематическую.
-
Исправляем указанный конфликт.
-
Отправляем изменения в ту же тематическую ветку.
Как только это будет сделано, запрос на слияние будет автоматически обновлён и перепроверен на возможность слияния.
Рисунок 97. Запрос слияния без конфликтов
Одна из замечательных особенностей Git — это то, что вы можете делать это постоянно.
Если у вас очень длительный проект, вы можете легко сливать изменения из целевой ветки снова и снова и иметь дело только с конфликтами, возникшими с момента вашего последнего слияния, что делает процесс очень управляемым.
Если вы очень хотите перебазировать ветку, чтобы её почистить, то, конечно, вы можете это сделать, но настоятельно не рекомендуется переписывать ветку, к которой уже открыт запрос на слияние.
Если другие люди уже стянули её и проделали много работы, то вы столкнётесь со всеми проблемами, описанными в разделе Опасности перемещения главы 3.
Вместо этого, отправьте перебазированную ветку в новую на GitHub и откройте новый запрос на слияние, который указывает на предыдущий, затем закройте исходный.
Ссылки
Возможно, ваш следующий вопрос будет: «Как мне сослаться на предыдущий запрос слияния?»
Оказывается, существует много способов ссылаться на другие вещи практически везде, где у вас есть права записи на GitHub.
Давайте начнём с перекрёстных ссылок для запросов слияния или проблем.
Всем запросам слияния и проблемам присваиваются уникальные номера в пределах проекта.
Например, у вас не может быть запроса на слияние с номером #3 и проблемы с номером #3.
Если вы хотите сослаться на любой запрос слияния или проблему из другого места, просто добавьте #<num>
в комментарий или описание.
Так же можно указывать более конкретно, если проблема или запрос слияния находятся где-то ещё; пишите username#<num>
если ссылаетесь на проблему или запрос слияния, находящиеся в ответвлённом репозитории, или username/repo#<num>
если ссылаетесь на другой репозиторий.
Рассмотрим это на примере.
Предположим, что мы перебазировали ветку в предыдущем примере, создали новый запрос слияния для неё и сейчас хотим сослаться на предыдущий запрос слияния из нового.
Так же мы хотим сослаться на проблему, находящуюся в ответвлённом репозитории, и на проблему из совершенно другого проекта.
Мы можем составить описание как указано на Перекрёстные ссылки в запросе слияния.
Рисунок 98. Перекрёстные ссылки в запросе слияния
Рисунок 99. Отображение перекрёстных ссылок в запросе слияния
Заметьте, что указанная полная ссылка на GitHub была сокращена до необходимого минимума.
Если Тони сейчас вернётся назад и закроет оригинальный запрос слияния, то мы это увидим, так как он упомянут в новом, а GitHub автоматически создаст отслеживающее событие в хронике запроса слияния.
Это значит, что все, кто просматривает закрытый запрос слияния, могут легко перейти к запросу слияния, который его заменил.
Ссылка будет выглядеть как указано на Отображение перекрёстных ссылок в закрытом запросе слияния.
Рисунок 100. Отображение перекрёстных ссылок в закрытом запросе слияния
Кроме идентификационных номеров, можно ссылаться на конкретный коммит используя SHA-1.
Следует указывать полный 40 символьный хеш SHA-1, но если GitHub увидит его в комментарии, то автоматически подставит ссылку на коммит.
Как было сказано выше, вы можете ссылаться на коммиты как в других, так и в ответвлённых репозиториях точно так же, как делали это с Проблемами.
GitHub-версия разметки Markdown
Ссылки на другие Проблемы — это лишь часть интереснейших вещей, которые вы можете делать в текстовых полях на GitHub.
Для «проблемы» или «запроса слияния» в полях описания, комментария, комментария кода и других вы можете использовать так называемую «GitHub-версию разметки Markdown».
Разметка похожа на обычный текст, который основательно преобразуется.
Рисунок 101. Пример написания и отображения текста с разметкой
GitHub расширил возможности обычной разметки.
Эти возможности могут быть очень полезными при создании запросов слияния или комментариев и описаний к проблемам.
Списки задач
Список задач — это первая действительно важная возможность специфической разметки GitHub, особенно для запросов слияния.
Список задач представляет собой список флажков для задач, которые вы хотите выполнить.
Размещение его в описании Проблемы или запроса на слияние обычно указывает на то, что должно быть сделано до того, как проблема будет считаться решённой.
Список задач можно добавить следующим образом:
- [X] Write the code
- [ ] Write all the tests
- [ ] Document the code
Рисунок 102. Отображение списка задач в комментарии
Он часто используется в запросах на слияние для отображения списка того, что вы хотите сделать до того, как запрос будет готов к слиянию.
Вы можете просто кликнуть по флажку, чтобы обновить комментарий — не нужно редактировать комментарий вручную, чтобы пометить задачу как выполненную.
Так же GitHub ищет списки задач в запросах на слияние и проблемах и отображает их как метаданные на страницах, где они упоминаются.
Например, если в вашем запросе на слияние есть задачи и вы просматриваете список всех запросов, то можно увидеть на сколько готов каждый из них.
Это позволяет разбивать запрос на слияние на несколько подзадач и помогает другим людям отслеживать прогресс ветки.
Пример приведён на Статистика задач в списке запросов слияния.
Рисунок 103. Статистика задач в списке запросов слияния
Такая возможность невероятно полезна когда вы открываете запрос на слияние на раннем этапе реализации и отслеживаете прогресс с помощью него.
Отрывки кода
В комментарии так же можно вставлять отрывки кода.
Это особенно полезно когда вы хотите показать что-нибудь, что вы собираетесь попробовать сделать, до того, как включить это в вашу ветку.
Так же часто применяется для добавления примеров кода, который не работает или мог быть добавлен в запрос на слияние.
Для добавления отрывка кода следует обрамить его обратными кавычками.
```java
for(int i=0 ; i < 5 ; i++)
{
System.out.println("i is : " + i);
}
```
Если вы укажете название языка, как показано на примере, GitHub попробует применить к нему подсветку синтаксиса.
Для приведённого примера код будет выглядеть как на Отображение обрамленного кода.
Рисунок 104. Отображение обрамленного кода
Цитирование
Если вы отвечаете только на часть большого комментария, то можно цитировать только выбранную часть, предваряя её символом >
.
Это настолько часто используется, что даже существует комбинация клавиш для этого.
Если в комментарии выделить текст, на который вы собираетесь ответить, и нажать клавишу r
, то выделенный текст будет включён как цитата в ваш комментарий.
Цитаты выглядят примерно так:
> Whether 'tis Nobler in the mind to suffer
> The Slings and Arrows of outrageous Fortune,
How big are these slings and in particular, these arrows?
Рисунок 105. Пример отображения цитаты
Смайлики
Наконец, вы можете использовать смайлики.
На GitHub вы можете часто встретить их в комментариях или запросах на слияние.
Для них есть даже помощник.
Например, если при наборе комментария ввести символ двоеточия :
, то будут предложены варианты автодополнения.
Рисунок 106. Автодополнение для смайлов в действии
Смайлы имеют вид :<name>:
и могут располагаться в любом месте комментария.
Например, вы можете написать что-нибудь вроде этого:
I :eyes: that :bug: and I :cold_sweat:.
:trophy: for :microscope: it.
:+1: and :sparkles: on this :ship:, it's :fire::poop:!
:clap::tada::panda_face:
Рисунок 107. Перегруженный смайликами комментарий
Не то чтобы это невероятно полезно, но добавляет немного веселья и эмоций там, где трудно выразить какие-то эмоции.
Примечание |
На текущий момент существует много интернет сервисов, где используются смайлики. |
Картинки
Технически, картинки не относятся к разметке GitHub, но их использование очень полезно.
В дополнение к ссылкам на картинки в комментариях, GitHub позволяет встраивать картинки в комментарии.
Рисунок 108. Перетаскивание картинки для загрузки и встраивания
Если вернуться немного назад к Перекрёстные ссылки в запросе слияния, то над областью редактирования вы увидите небольшую подсказку «Parsed as Markdown».
Нажав не неё, вы получите полную подсказку по использованию GitHub разметки.
Поддержание GitHub репозитория в актуальном состоянии
После создания форка, ваш репозиторий будет существовать независимо от оригинального репозитория.
В частности, при появлении в оригинальном репозитории новых коммитов GitHub информирует вас следующим сообщением:
This branch is 5 commits behind progit:master.
При этом GitHub никогда не обновляет ваш репозиторий — это вы должны делать сами.
К счастью, это очень просто сделать.
Первый способ не требует конфигурации.
Например, если вы сделали форк репозитория https://github.com/progit/progit2.git
, то актуализировать ветку master
можно следующим образом:
$ git checkout master (1)
$ git pull https://github.com/progit/progit2.git (2)
$ git push origin master (3)
-
Если вы находитесь на другой ветке — перейти на ветку
master
. -
Получить изменения из репозитория
https://github.com/progit/progit2.git
и слить их с веткойmaster
. -
Отправить локальную ветку
master
в ваш форкorigin
.
Каждый раз писать URL репозитория для получения изменений достаточно утомительно.
Этот процесс можно автоматизировать слегка изменив настройки:
$ git remote add progit https://github.com/progit/progit2.git (1)
$ git fetch progit (2)
$ git branch --set-upstream-to=progit/master master (3)
$ git config --local remote.pushDefault origin (4)
-
Добавить исходный репозиторий как удалённый и назвать его
progit
. -
Получить ветки репозитория
progit
, в частности веткуmaster
. -
Настроить локальную ветку
master
на получение изменений из репозиторияprogit
. -
Установить
origin
как репозиторий по умолчанию для отправки.
После этого, процесс обновления становится гораздо проще:
$ git checkout master (1)
$ git pull (2)
$ git push (3)
-
Если вы находитесь на другой ветке — перейти на ветку
master
. -
Получить изменения из репозитория
progit
и слить их с веткойmaster
. -
Отправить локальную ветку
master
в ваш форкorigin
.
Данный подход не лишён недостатков.
Git будет молча выполнять указанные действия и не предупредит вас в случае, когда вы добавили коммит в master
, получили изменения из progit
и отправили всё вместе в origin
— все эти операции абсолютно корректны.
Поэтому вам стоит исключить прямое добавление коммитов в ветку master
, поскольку эта ветка фактически принадлежит другому репозиторию.
Edit me
На предыдущем занятии Используем клиент GitHub для десктопа, мы использовали Github Desktop для управления рабочим процессом коммитов, ветвления и слияния. На этом занятии мы будем выполнять аналогичные действия, но с использованием браузерного интерфейса, который предоставляет Github, вместо использования терминала или Github Desktop.
Понимание процесса Pull request является важным для анализа изменений в опен-сорс проекте с несколькими участниками. Использование интерфейса GitHub также удобно, если рецензенты не знакомы с терминалом или Github Desktop.
Создание изменение в отдельной ветке
По умолчанию в новом репозитории есть одна ветка с именем «Master». Обычно, когда при внесении изменений или просмотра / редактировании, создается новая ветка и вносятся все изменения в ветку. Затем, по окончании, владелец репо объединяет изменения из новой ветки в «Master» через «pull request».
Для создания изменений в отдельной ветке:
- Со стороны рецензента переходим к тому же репозиторию GitHub, который был создан на предыдущем занятии (можно создать новый репо). Создаем новую ветку, выбрав раскрывающееся меню ветки и введя имя новой ветки, например «sme-review». Затем нажмите клавишу Enter.
При создании новой ветки, содержимое из главной (или любой другой ветки, которая сейчас просматривается) копируется в новую ветку. Процесс похож на «Сохранить как» с существующим документом.
- Кликаем в область ввода текста, а затем кликаем по иконке карандаша («Edit this file»), чтобы отредактировать файл.
- Вносим изменения в контент и прокручиваем вниз экрана до области Commit changes. Поясняем причину изменений и подтверждаем изменения в своей ветке sme-review, нажав кнопку
Commit changes
.
Рецензенты могут продолжать вносить изменения таким образом, пока не закончат просмотр всей документации. Все изменения делаются в этой новой ветке, а не в мастере.
Создание Pull request
Теперь представим, что процесс проверки завершен, и пришло время объединить ветку с мастером. Ветка объединяется с “Master” через Pull request
. Любой «соавтор» в команде с правами на запись может инициировать и завершить Pull request (добавлять соавторов можете в «Настройки»> «Соавторы)
Для создания Pull request:
- Находим на экране вкладку “Pull request”.
- Кликаем по кнопке
New pull request
- Выбираем ветку (sme-review), которую хотим сравнить с веткой “Master”
Когда мы сравниваем ветку с мастером, мы увидим список всех изменений. Мы можем просмотреть изменения в двух режимах просмотра: Unified или Split (это вкладки, показанные справа от содержимого). Unified показывает правки вместе в одной области содержимого, тогда как split показывает два файла рядом.
- Кликаем на кнопку
Create pull request
. - Поясняем pull request и снова кликаем кнопку
Create pull request
.
Владелец репозитория увидит pull request и сможет принять меры для его объединения.
Процесс Pull request
Теперь посмотрим на процесс со стороны владельцем проекта, который получил новый Pull request. Владельцу нужно обработать Pull request и объединить ветку sme-review с “Master”.
- Переходим на вкладку “Pull requests”, чтобы увидеть ожидающие запросы на извлечение.
- Кликаем по запросу и смотрим изменения, выбрав вкладку Files changed.
Также стоит обратить внимание, что если запрос на извлечение выполняется для более старой версии мастера, где исходное содержимое мастера больше не существует или перемещено в другое место, процесс слияния будет более трудным для выполнения.
- Переходим на вкладку “Conversation” и кликаем кнопку
Merge pull request
. - кликаем
Confirm merge
.
Ветка sme-review объединяется с мастером. Теперь “Master” и ветка sme-review совпадают (ветки “смержены”).
- Кликаем кнопку
Delete branch
для удаления ветки sme-review.
Не обязательно удалять ветку сразу. Старые ветки всегда можете удалить , щелкнув ссылку на ветки при просмотре репозитория Github, а затем нажмите кнопку Delete
(корзина) рядом с веткой.
Если посмотреть на список веток, то после удаления ветка sme-review больше не отображается.
Добавление участников в проект
Иногда необходимо добавлять соавторов в проект Github, чтобы они могли вносить изменения в ветку. Если другие участники проекта, не являясь соавторами, захотят внести изменения, они получат сообщение об ошибке. (Inviting collaborators to a personal repository)
Человек без прав на запись, может “форкнуть” (скопировать) репо, а не вносить изменения в ветку в том же проекте. Однако копирование проекта клонирует весь репозиторий, а не создает ветку в том же репозитории. Форк (копия) будет существовать в учетной записи пользователя GitHub. Можно объединить форкнутый репозиторий (это типичная модель для опен-сорс проектов со многими внешними участниками), но этот сценарий, вероятно, менее распространен для технических писателей, работающих с разработчиками в тех же проектах.
Для добавления соавторов в проект:
- В репозитории проекта переходи на вкладку “Settings”.
- Нажимаем на кнопку
Collaborators
в левой части. - Вводим имена пользователей Github тех, кому хотим дать доступ в области Collaborator.
- Нажимаем на кнопку
Add collaborator
.
🔙
Go next ➡
Я открыл запрос на перенос проекта. Сопровождающий решил принять его, но посоветовал мне изменить некоторое содержимое.
Как мне это сделать? Должен ли я оставить хеш фиксации неизменным, как я могу это сделать?
5 ответов
Лучший ответ
Просто отправьте больше коммитов в ветку, для которой предназначен запрос. Запрос на вытягивание примет это тогда.
Примере:
Если вы хотите, чтобы b слился с мастером
- Вы нажимаете c1, c2, c3 на b
- затем вы делаете новый запрос на b
- он проверяется, и вам нужно больше коммитов
- Вы нажимаете c11, c21, c31 на b
- Запрос на вытягивание теперь показывает все 6 шести коммитов.
202
Ivan Aracki
25 Сен 2020 в 12:18
Примените свои изменения поверх существующей ветки, в которой создается PR. Например, если имя вашей ветви — newFeature
и у вас есть PR для объединения newFeature
с веткой develop
. Примените предложенные изменения в ветке newFeature с любым количеством коммитов. Как только вы закончите с исправлением предлагаемых изменений обзора. Разрешите рецензенту пересмотреть его. После утверждения вы сможете объединить свой PR.
Вы можете использовать SourceTree или какой-нибудь инструмент с графическим интерфейсом, если вам нужна общая помощь с git.
Вы также можете использовать github api.
Пример с curl
curl --user "your_github_username"
--request PATCH
--data '{"title":"newtitle","body":"newbody",...}'
https://api.github.com/repos/:owner/:repo/pulls/:number
Вы можете найти подробный список данных в документации для разработчиков github
Пример: изменить имя моего запроса на вытягивание
curl --user "jeremyclement"
--request PATCH
--data '{"title":"allows the control of files and folders permissions."}'
https://api.github.com/repos/Gregwar/Cache/pulls/9
1
Community
20 Июн 2020 в 09:12
Если вы продолжите вносить изменения и продолжаете нажимать на ту же ветку, уточненные коммиты будут добавлены в тот же запрос на вытягивание (если ваш запрос на вытягивание не был объединен). Это могло сильно загромождать историю.
Альтернативное решение и техника, которые я использую, следующие:
-
Создайте новую ветку (исправления) из репозитория (восходящий поток) и ветку (разработка), в которую вы собираетесь отправить запрос на перенос, выполнив:
исправления ветки git upstream / development
-
Добавьте свои усовершенствованные коммиты прямо в эту недавно созданную ветку.
git commit -m «ваше сообщение»
-
Отправьте эту ветку на свой собственный разветвленный пульт (можно назвать origin).
- Сравните и отправьте новый запрос на перенос с чистой историей фиксации.
- Кроме того, рекомендуется удалить ветку после слияния запроса на перенос.
- И вы можете прокомментировать и закрыть свои предыдущие запросы на включение.
9
user_19
29 Апр 2014 в 18:08
У меня была только одна фиксация в запросе на перенос, и я использовал git commit --amend
для ее обновления. Затем я сделал принудительное нажатие с помощью git push -f
, чтобы моя измененная фиксация заменила исходную. Запрос на вытягивание автоматически принял новую фиксацию. (На самом деле он показал обе фиксации, но когда я перезагрузил страницу, старая фиксация исчезла.)
Таким образом, хотя принудительная отправка обычно не рекомендуется, она может быть полезна для запросов на вытягивание. Это не рекомендуется, потому что, если кто-то основывает коммит поверх вашего, ему придется выполнить перебазирование после вашего изменения. Но поскольку никто не должен основывать свою работу на проверяемом пул-реквесте, в этой ситуации это должно быть довольно безопасно.
37
Malvineous
28 Сен 2015 в 08:28
Расскажу, как быстро и просто открыть пулл-реквест, на что обратить внимание, и сделать так, чтобы ваш ревьюер не расстраивался. В конце статьи есть чеклист, чтобы быстро проверять по нему.
Предполагаю, что вы уже форкнули проект, склонировали себе форк, что-то там накоммитили и готовы открыть пулл-реквест. Лучше всего читать эту статью параллельно с открыванием пулл-реквеста.
Найдите кнопку «Pull Request»
Не суетитесь и не бегайте по репозиториям, переключая ветки. Сразу, как вы запушили, на главной страничке вашего репозитория появится жёлтая плашка с названием ветки и кнопкой «Compare & pull request».
Кнопка «Compare & pull request»
Эта кнопка — самый короткий путь к открытию пулл-реквеста. Жмите её.
Проверьте ветки
После нажатия кнопки у вас откроется подробная страничка о том, откуда и куда вы открываете пулл-реквест. Посмотрите, куда вольётся ваш код. Он должен попадать в главную ветку основного репозитория. Скорее всего это ветка master. И он должен быть из вашего форка и ветки, в которой вы делали работу.
Куда и откуда попадёт код
Скорее всего так и есть, если вы правильную кнопку нажали.
Проверьте конфликты
Прямо под ветками написано, есть конфликты или нет:
Вот тут нет конфликтов
Бывает, что конфликты есть:
А вот тут есть конфликты, влить пулл-реквест по кнопке Merge не получится
Хорошим тоном считается открывать пулл-реквесты без конфликтов. Поэтому если у вас конфликт, решите его до того, как откроете пулл-реквест. Можно отребейзить вашу ветку от мастера главного репозитория, или можно влить мастер главного репозитория в вашу ветку.
Если вы работаете в команде и не умеете решать конфликты, попросите старшего товарища вам помочь. А если вы студент, попросите наставника Вы так же можете сначала открыть пулл-реквест, пусть и с конфликтами, а потом эти конфликты решить.
Напишите заголовок и описание
В форме открытия пулл-реквеста напишите заголовок: коротко что вы сделали. И описание: что конкретно и зачем, а что ещё не доделано.
Проверьте изменённые файлы
Ниже формы с описанием пулл-реквеста есть дифф — это то, что изменилось: новые файлы, удалённые файлы, изменённые строки в файлах.
Изменённые файлы (дифф)
Почитайте сами свой дифф и проверьте, не попалось ли там чего лишнего. Мог закрасться лишний файл, или вы закомментировали кусок кода, а потом забыли раскомментировать.
На скриншоте выше файл npm-debug.log.1955635711
очевидно лишний. Значит нужно его удалить и закоммитить это, и снова запушить в эту ветку. Если вы нашли ошибку, то просто исправьте её, закоммитьте и запушьте. Потом обновите страничку с диффом и убедитесь, что всё в порядке.
Теперь жмите «Create pull request»! Ура!
Как открыть пулл-реквест:
- После пуша зайдите в свой репозиторий и нажмите кнопку «Compare & pull request» на жёлтой плашке.
- Проверьте, что открываете пулл-реквест из своей ветки в мастер главного репозитория.
- Проверьте, нет ли конфликтов. Если есть, исправьте их.
- Напишите заголовок и описание.
- Проверьте, что в диффе нет ничего лишнего. Если что-то лишнее попало, уберите это.
- Откройте пулл-реквест