Из-за того, как работают ветки 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.