Измените ветку git, чтобы она разветвлялась от коммитов - PullRequest
0 голосов
/ 26 июня 2019

Я разветвил репозиторий git, разветвленный new_feature из master, разработал новую функцию и слил мою ветку обратно в master. Вот так:

^
|
*     <-- current commit
|\
| \
*  *
*  |
|  *  <-- new_feature branch
|  |
*  *
| /
|/
*
*
*
|
*     <-- release commit on master
|

Оглядываясь назад, я хотел бы получить ответвление от master на коммите release. Это потому, что мастер не совсем чист и не все тесты пройдены. Так что я хотел бы иметь:

^
|
*
*     <-- next commit on master after release commit
*
|
*
|\
| \
|  *
|  |
|  *  <-- new_feature branch
|  |
|  *
| /
|/
*     <-- release commit on master
|

Возможно ли это, и если да, то как? Я единственный пользователь, работающий в new_feature, и я никогда ранее не совершал master, если это помогает изолировать коммиты.

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Два других варианта, которые я могу придумать:

  1. Если между коммитом релиза и коммитом, из которого вы разветвлены, было не так много коммитов, Вы можете отменить каждый из этих коммитов.

  2. Если вас не волнует сохранение отдельных сделанных вами коммитов, вы можете выполнить программный сброс мастера в том месте, где вы от него отошли, сохранить эти изменения, выполнить полный сброс до фиксации релиза и применить тайник.

Два показывают вам пример двух вышеупомянутых вариантов, я добавил вымышленные идентификаторы фиксации к вашей диаграмме:

^
|
* current-commit    <-- current commit
|\
| \
*  *
*  |
|  *  <-- new_feature branch
|  |
*  *
| /
|/
* commit-branched-off-of
* intermediate-commit-1
* intermediate-commit-2
|
* release-commit    <-- release commit on master
|

Вариант 1 может быть таким простым (если у вас нет конфликтов):

git revert release-commit..commit-branched-off-of

Приведенная выше команда вернет все коммиты после release-commit до commit-branched-off-of.

включительно.

Если вы получаете какие-либо конфликты, просто следуйте инструкциям, чтобы исправить конфликты.

Вариант 2 может быть:

git reset --soft commit-branched-off-of
git stash
git reset --hard release-commit
git stash apply
git commit -m "New commit message for your feature"
1 голос
/ 26 июня 2019

Да, это возможно, но это DISTRUCTIVE изменение истории, и вы должны быть осторожны с ним.

давайте сначала дадим нужным коммитам несколько фиктивных SHA, чтобы можно было их идентифицировать в командах git:

Текущее состояние:

^
|
*  F679B1B <-- current commit on master
|
*  11937F5 <-- merge commit
|\
| \
*  |  D2FD393
|  |
|  *  <-- 45C9A66  new-feature branch
|  |
*  |  91C021C
| /
|/
*  15B6BDD
|
*  A132263  <-- release commit on master
|

и идея заключается в следующем:

  • сделать копию master:
git checkout master
git checkout -b second_master
  • сделать полный сброс до фиксации релиза на master:
git reset --hard A132263
  • ветка новой функциональной ветки:
git checkout -b new-feature
  • переместите ваши коммиты из старой ветви функций в новую ветку функций, одну за другой, и по порядку:
git cherry-pick 45C9A66
  • слияние или выдача запроса на слияние seond-master при коммите релиза:
git checkout second-master
git merge new-feature
  • получить другие коммиты из оригинала master:
git cherry-pick 15B6BDD
git cherry-pick 91C021C
git cherry-pick D2FD393
git cherry-pick F679B1B
  • проверить, если состояние second-master в порядке, а затем выполнить жесткий сброс исходного master на него
    ( ОСТОРОЖНО РАСПРЕДЕЛИТЕЛЬНАЯ КОМАНДА : после этого оригинал master теряется и заменяется на second-master):
git checkout master
git reset --hard second-master

После этих шагов у вас должно быть следующее состояние в вашем git-репо:

Состояние результата:

^
|
* 75C70DB <-- current commit on master
|
|
* BC63DDC
|
| 
* 03042CF
|
|
* 019D5F6
|
* E3FAABE <-- merge commit
|\
| \
|  |
|  |
|  * <-- 45C9A66  new-feature branch
|  |
|  |
| /
|/
* A132263  <-- release commit on master
|

надеюсь, это поможет вам создать впечатление, стоит ли этого делать или нет, и направит вас по этому пути.

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