Создание PR из определенного коммита - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу создать PR с одним коммитом, поэтому я извлекаю новую ветку с коммитом SHA,

git checkout -b new-branch 8517c80183607461ea

Как мне создать PR отсюда?

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Из-за того, как работают ветки Git, недостаточно создать ветку за один коммит.Вы можете перетащить больше коммитов.

Например, предположим, что ваш репозиторий выглядит следующим образом.

A - B - C [master]
         \
          D - E - F [feature]

master и feature - это просто метки, указывающие на коммит.master указывает на коммит C. feature указывает на коммит F.

Коммиты Git не живут изолированно.Они берут с собой всю свою историю.F не может существовать без E, D, C, B и A. Если вы нажмете feature, тогда F принесет E и D вместе с ним (при условии, что C уже нажата).

Допустим, вы хотитеотправьте PR только E. Так что вы делаете ветку в E.

$ git checkout -b new-branch E

A - B - C [master]
         \
          D - E [new-branch]
               \
                F [feature]

Все, что сделано, - это создать метку с именем new-branch, указывающую на коммит E. Структура коммитов остается прежней.Если вы затем нажмете new-branch, он будет перетаскивать D вместе с ним.Вот почему иногда, когда вы думаете, что вы нажимаете только несколько коммитов, PR содержит гораздо больше коммитов.


Чтобы действительно протолкнуть только один коммит, вам нужно отсоединить его от его истории.Вы можете сделать это с git cherry-pick.Это в основном берет коммит, превращает его в патч и исправляет его где-то еще.

Возвращаясь к вашему исходному хранилищу ...

A - B - C [master]
         \
          D - E - F [feature]

Вы сделали бы новую ветвьmaster.

$ git checkout -b new-branch master

          [new-branch]
A - B - C [master]
         \
          D - E - F [feature]

(Обратите внимание, что ничего не изменилось, за исключением того, что была сделана новая метка ветви, указывающая на C).

Затем выберите вишню E. Это скопирует E как новый коммит наtop of C. Могут быть конфликты, разрешите их как обычно.

$ git cherry-pick E

          E1 [new-branch]
         / 
A - B - C [master]
         \
          D - E - F [feature]

Теперь вы можете нажать new-branch, и в PR будет только E1.

0 голосов
/ 20 июля 2019

У меня возникли небольшие проблемы с использованием ответа Шверна , поскольку я совершал ошибку, будучи мастером разветвленного проекта при выполнении коммитов ( здесь Я звонюэто ошибка новичка).

Следуя графикам Шверна, скажем, я разветвил проект на C и приступил к мастеру с другими коммитами.Здесь я добавляю звездочку, чтобы указать, что на вилке происходят новые изменения:

A - B - C - D* - E* - F* [master]

Если вы хотите выбрать только некоторые из коммитов (скажем, D и E), то, что выне следует делать это:

git checkout -b new-branch upstream/master
git cherry-pick <hash of commit D>
git cherry-pick <hash of commit E>
git push -u origin new-branch

В этом случае вы пытаетесь разветвить мастера на F*, и выбор вишни предыдущих коммитов выдаст вам предупреждение

«Предыдущий вишневый пик теперь пуст, возможно, из-за разрешения конфликта.»

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

Что вам следуетdo вместо:

git checkout -b new-branch <hash of commit E>
git push -u origin new-branch

A - B - C - D* - E* - F* - G* [master]
                  \
              D* - E* [new-branch]               

После этого вы готовы сделать пул-запрос только с выбранными коммитами.

0 голосов
/ 28 декабря 2018

Вам нужно нажать new-branch на Github, а затем открыть запрос на получение.Это будет включать в себя все коммиты, доступные с 8517c80183607461ea, но еще не в истории master.

Если вы хотите включить only 8517c80183607461ea, то вам необходимо перебазировать new-branch на мастер, используя git rebase -i master, и удалите все строки, кроме одной, упоминающей 8517c80183607461ea.После перебазирования ваша ветвь new-branch будет содержать перебазированный 8517c80183607461ea с новым идентификатором фиксации непосредственно над мастером, и вы можете перенести ветку / выдать запрос на извлечение.

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