Есть ли способ включить старые коммиты в Git pull request? - PullRequest
0 голосов
/ 02 июля 2018

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

Теперь я хочу, чтобы люди просмотрели мой код, но в PR он включает только изменения, которые я сделал после разделения двух веток, но не оригинальные изменения, которые я сделал. Я понимаю, что это немного сбивает с толку, поэтому я сделал картину:

Diagram of commits.

По сути, я хочу перетащить «d» в «c», но Git распознает только отличия от «d», хотя изменения, внесенные в «b», должны быть включены в «d» и не являются часть «с».

Знаете ли вы, как я мог бы заставить парня узнать, что есть другие различия?

Редактировать: просто чтобы уточнить, "отменить возврат" не будет работать, потому что я хочу, чтобы различия отображались в запросе на извлечение, а не просто слились успешно.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Самый простой (и самый неодобрительный) способ сделать это - переписать мастер, а не возвращать что-либо.

Удалите ваши коммиты с вашего локального мастера с помощью git reset --hard HEAD~N, где N - количество последних коммитов, которые вы хотите удалить. Затем git push -f origin HEAD:master перезаписать удаленную главную ветку. Это по существу вернет ветку в состояние до того, как вы «испортили».

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

0 голосов
/ 02 июля 2018

Проблема возникает из-за того, что касается git, b уже находится в master (наряду с более поздними изменениями, которые произошли, чтобы отменить b). Это мешает не только проверке, но и фактическому результату объединения.

Существует несколько методов, обычно используемых для решения этой проблемы. Иногда вы «возвращаете назад»; иногда вы копируете B, чтобы создать новый коммит B', который делает то же самое, что и B, но топологически не «уже в master».

В вашем случае вы хотите последнее. (Единственный чистый способ «отменить возврат» был бы на master, что снова пропустило бы проверку. Вместо этого вы хотите, чтобы изменения с B отразились на вашей ветви.)

Итак, у вас есть

... a -- b -- d <--(your_branch)
          \
           !b <--(master)

(я переименовал c с вашей фотографии в !b, чтобы лучше описать, что это такое - возврат b.)

Вам нужно выражение, которое разрешается до a.

  • Это может быть хеш коммита для a (или сокращенная форма хэша коммита); если у вас есть это в наличии, я бы просто использовал это.

  • Или, в этом примере, вы можете использовать your_branch~2, потому что your_branch имеет 2 коммита после a (это b и d).

  • Если вы не уверены, сколько коммитов на your_branch, вы можете использовать что-то вроде $(git merge-base your_branch master)^ (обратите внимание на ^ в конце). Это зависит от того факта, что b является общим предком вашей ветви и мастера, но потерпит неудачу, если между двумя ветвями произошли какие-либо более поздние слияния.

В любом случае, какое бы выражение вы ни придумали, я буду использовать a в качестве заполнителя в следующей команде. Таким образом, вы бы сделали «принудительный ребаз» из your_branch.

git rebase -f a your_branch

Это должно дать вам

       d
      /
a -- b -- !b <--(master)
 \
  b' -- d' <--(your_branch)

(Я все еще показываю исходный коммит d на этой диаграмме, но вывод git по умолчанию больше не будет показывать его, потому что он недоступен. Через некоторое время он будет удален сборщиком мусора. b' похож на b за исключением того, что master оно не доступно, а d' похоже на d, за исключением того, что его родитель b'.

Это перезапись истории your_branch, поэтому, если вы ранее push ed your_branch, вам теперь придется ее принудительно нажать (git push --force-with-lease). Если есть шанс, что у кого-то еще есть fetch ed your_branch - и особенно если они уже основали работу над этим - тогда вам нужно сообщить им о том, что вы делаете. (См. Документацию git rebase в разделе «Восстановление из исходной перезагрузки».) (Если это может быть проблемой, вы можете избежать этой проблемы, создав новую ветку, которая никогда не была push ed, и перебазировав ее вместо прямой перебазировка your_branch.)

Как только это будет сделано, вы сможете выполнить свой запрос на извлечение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...