github: добавление коммитов в существующий запрос на перенос

88

Я открыл запрос на перенос для репозитория rails на github с помощью кнопки Fork & Edit this file file.

Теперь, после получения отзывов о моем PR, я хотел добавить еще несколько коммитов. Итак, вот чем я закончил

$ git clone git@github.com:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

Это сработало нормально, но кажется довольно сложным рабочим процессом. Может я что-то не так тут не так?

у меня вопрос: правильно ли я это делаю? если нет, то как правильно это сделать?

CuriousMind
источник
4
Некоторым, кто приезжает сюда, может показаться, что это лучше соответствует их сценарию: stackoverflow.com/questions/9790448/…
AaronLS
4
Я также нашел эту версию вопроса / ответа более ясной: stackoverflow.com/questions/7947322/…
Бен Уиллер

Ответы:

63

Поскольку вы используете инструменты GitHub и просто изменяете один файл, вы также можете перейти к файлу на GitHub, выбрать нужную ветку в верхнем левом углу под раскрывающимся списком «tree:» ( patch-3в вашем случае) и теперь выбрать «Изменить» этот файл". Теперь ваши изменения будут зафиксированы в этой ветке и будут отображаться в вашем запросе на перенос.

Эйб Фолькер
источник
10

Я недавно писал на эту тему в блоге :

Как мы будем обновлять эту функциональную ветку? Слияние новейших коммитов восходящего потока легко, но вы хотите избежать создания коммитов слияния, так как это не будет оценено при передаче в восходящий поток: тогда вы эффективно повторно фиксируете изменения восходящего потока, и эти коммиты восходящего потока получат новый хэш ( когда у них появляется новый родитель). Это особенно важно, поскольку эти объединенные коммиты будут отражены в вашем запросе на перенос на GitHub, когда вы отправите эти обновления в свою личную ветку функций GitHub (даже если вы сделаете это после того, как отправили запрос на перенос).

Вот почему нам нужно перебазировать вместо слияния:

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

И опция rebase, и команда rebase в git сохранят ваше дерево в чистоте и позволят избежать коммитов слияния. Но имейте в виду, что это ваши первые коммиты (с которыми вы выпустили свой первый запрос на перенос), которые перебазируются, и у которых теперь есть новый хэш фиксации, который отличается от исходных хэшей, которые все еще находятся в вашей удаленной ветке репозитория github. .

Теперь отправка этих обновлений в вашу личную функциональную ветку GitHub не удастся, поскольку обе ветви различаются: локальное дерево ветки и дерево удаленной ветки «не синхронизированы» из-за этих разных хэшей фиксации. Git скажет вам сначала git pull --rebase, а затем нажмите еще раз, но это не будет простой перемоткой вперед, поскольку ваша история была переписана. Не делай этого!

Проблема здесь в том, что вы снова получите свои первые измененные коммиты в том виде, в каком они были изначально, и они будут объединены поверх вашей локальной ветки. Из-за состояния рассинхронизации это извлечение не применяется чисто. Вы получите неработающую историю, в которой ваши коммиты появляются два раза. Когда вы отправляете все это в свою ветку функций GitHub, эти изменения будут отражены в исходном запросе на перенос, который станет очень и очень некрасивым.

AFAIK, на самом деле нет абсолютно чистого решения для этого. Лучшее решение, которое я нашел, - заставить вашу локальную ветку переместиться в ветку GitHub (на самом деле принудительное обновление без быстрой перемотки вперед):

Согласно git-push (1):

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

Так что не тяните, просто нажимайте с силой, вот так:

git push svg +user-non-unique

или:

git push svg user-non-unique --force

Это фактически просто перезапишет вашу удаленную ветку всем, что находится в вашей локальной ветке. Коммиты, которые находятся в удаленном потоке (и вызвали сбой), останутся там, но будут зависшими коммитами, которые в конечном итоге будут удалены с помощью git-gc (1). Ничего страшного.

Как я уже сказал, это самое чистое решение AFAICS. Обратной стороной этого является то, что ваш PR будет обновляться с учетом этих новейших коммитов, которые будут иметь более позднюю дату и могут отображаться не синхронизированно в истории комментариев PR. Нет большой проблемы, но это может сбивать с толку.

Серж ван Гиндерахтер
источник
5

Вы также можете создать новый запрос на перенос, который привязан к masterконкретной abc1234версии.

Таким образом, любая новая фиксация / отправка в ваш репозиторий будет добавлена ​​в запрос на перенос.

cfedermann
источник
3

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

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD
Форрест
источник
это самый простой и самый простой способ, не знаю, почему это не лучший ответ
Банджо Обайоми