Как обновить пул-запрос из разветвленного репо?


592

Итак, я сначала раздвоил репо, а затем сделал коммит в этом раздвоенном репо. Затем я открыл запрос на удаление. Запрос на получение списка перечислил все изменения, которые я хотел.

После рассмотрения моего запроса на получение, владелец репо хотел, чтобы я сделал несколько изменений, прежде чем он его принял. Я внес эти изменения в свой форк, теперь как мне обновить запрос на получение изменений этими изменениями (или это не так, как я должен его обрабатывать)?



7
@PaulDraper Я не согласен с тем, что пользователь уже знает и представляет различные методы для обновления запроса на получение, и спрашиваю, какой из них лучше. Я, с другой стороны, не знал ни о каких методах и спрашивал об их существовании. Как показывает популярность этого вопроса, это касается многих других пользователей.
stevebot

6
Я думаю, что популярность объясняется тем, что (1) это действительно хороший, общий вопрос и (2) некоторые пользователи оказались здесь, а не там. Если бы он был первоначально идентифицирован как дубликат, они нашли бы другой вопрос таким же и ответили бы на свой вопрос.
Пол Дрейпер

Ответы:


586

Вы сделали это правильно. Пул-запрос будет автоматически обновлен. Процесс такой:

  1. Открытый запрос на извлечение
  2. Внесите изменения на основе обратной связи в вашем локальном репо
  3. Нажмите на соответствующую ветку вашей вилки

Пул-запрос автоматически добавит новые коммиты внизу обсуждения пул-запроса (т. Е. Он уже есть, прокрутите вниз! )


73
отлично! Я проверял везде, но фактический запрос на получение. его магия, черная магия, я не буду сомневаться в этом.
Stevebot

57
Это хороший повод для работы в филиалах. Если, например, вы всегда нажимали на master, вы можете непреднамеренно добавить к своему предыдущему запросу pull.
Брайан Пан

3
Похоже, это уже не так, хотя это было в прошлом. Вот пример запроса на получение, который я сделал ( github.com/toopay/bootstrap-markdown/pull/167 ) по сравнению с самой веткой ( github.com/mhuggins/bootstrap-markdown/commits/… ). Любопытно, как это сделать больше, поскольку процесс, кажется, изменился.
Мэтт Хаггинс

1
GitHub на самом деле говорит вам: «Добавьте больше коммитов, нажав на ветку SolveWorldHunger на ChangeTheWorldProject».
flow2k

1
То же самое и здесь - я не вижу изменений от разветвленного репо в основном репозитории. Похоже, ошибка GitHub
andrfas

78

Обновление pull-запроса в GitHub так же просто, как и фиксация требуемых изменений в существующей ветви (которая использовалась с pull-запросом), но часто также требуется объединить изменения в единый коммит:

git checkout yourbranch
git rebase -i origin/master

# Edit command names accordingly
  pick   1fc6c95 My pull request
  squash 6b2481b Hack hack - will be discarded
  squash dd1475d Also discarded

git push -f origin yourbranch

... и теперь запрос на получение содержит только один коммит.


Ссылки по теме о перебазировании:


2
Upvote для упоминания rebase. Это помогает вырезать шум в истории изменений.
stevebot

+11 (да, я хотел, чтобы ключ повторялся. Использование git rebase / pick / squash прекрасно работает.
Джавадба

11
Недостатком этого подхода является то, что вы удаляете свой предыдущий коммит. Это означает, что если в запросе на получение комментариев будут сделаны комментарии, они будут потеряны и исчезнут вместе с исходным коммитом.
blowekamp

В Bitbucket вы можете видеть комментарии к «предыдущим версиям» файла в запросе на извлечение. Хотя было бы неплохо увидеть что-то вроде Gerrit, где вы исправляете коммиты и можете видеть всю историю с комментариями. Это делает для аккуратной истории мерзости и прослеживаемости, когда вы можете вернуться и увидеть полное обсуждение любого коммита.
Любовь

36

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


14

Я сделал это, используя следующие шаги:

  1. git reset --hard <commit key of the pull request>
  2. Сделали ли мои изменения в коде, который я хотел сделать
  3. git add
  4. git commit --amend
  5. git push -f origin <name of the remote branch of pull request>

1
Очень хорошо, я предпочитаю такой подход! GitHub даже скрывает (но сохраняет) устаревшие разделы кода и связанные комментарии. Полезно помнить, что если запрос на удаление содержит несколько коммитов, а тот, который требует исправления, не находится в конце ветки, «git reset --hard» отменит все изменения, принятые после указанного идентификатора. У меня была резервная копия, которую я применил вручную. Не очень удобно, если есть более одного дополнительного коммита ...
Nagev

3

Если вы используете GitHub в Windows :

  1. Вносить изменения локально.
  2. Откройте GitHub, переключитесь на локальные репозитории, дважды щелкните репозиторий.
  3. Переключите ветвь (в верхней части окна) на ветвь, из которой вы создали запрос на извлечение (т. Е. Ветвь на стороне вилки сравнения)
  4. Должна появиться опция для ввода комментария о коммите справа и фиксации изменений в вашем локальном репо.
  5. Нажмите синхронизировать сверху, что, помимо прочего, подталкивает ваш коммит с локального на ваш удаленный форк на GitHub.
  6. Запрос на получение обновлений будет автоматически обновляться с дополнительными коммитами. Это потому, что запрос pull представляет собой разность с веткой вашей вилки. Если вы перейдете на страницу запроса на получение (ту, где вы и другие можете прокомментировать ваш запрос на получение), то на вкладке «Коммиты» должны быть указаны дополнительные коммиты.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.