Подтвердить что ты не робот

Удалите коммиты из одной ветки в Git

У меня есть две ветки, мастер и feature1. Я работал над feature1, когда понял, что мне нужно работать над чем-то другим, не связанным. К сожалению, я забыл разветкиться у мастера и вместо этого создал свою ветку feature2 из feature1. Теперь я хочу объединить feature2 в master, но не могу, потому что в этой ветке есть части feature1.

Как удалить функцию 1, связанную с ветвью feature2? Включает ли это перезарядку?

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

EDIT:

Спасибо за ответы! Я попытался переустановить в соответствии с решением @Mark, но понял, что история сложнее, чем я изначально думал. функция 2 была объединена с другими ветвями функций, а мастер был объединен в feature2 в одной точке. Есть также дополнительные коммиты на мастере, которые не связаны с feature2. Все по-прежнему локально.

Действительно, моя история больше похожа на это:

A - B - C - D - - - - - - - - - - - - - L - M  master  
            |                          
            |               - I - J - K  feature2                  
            \              /           \
             - E - F - G - H - - - - - -N - O - P  feature1

И я хочу это:

A - B - C - D - - - - - - - - - -  L - M  master
            |\                          
            |  - - - - - I - J - K  feature2                  
            \                     \
              - E - F - G - H - - - N - O - P  feature1

Я также пробовал:

git rebase --onto 1524b824cfce5856a49e feature1 feature2
// 1524b824cfce5856a49e == D

Но это просто устанавливает функцию имени ветки 2, указывающую на 1524, и оставляет коммит I, J, K со своими оригинальными родителями.

4b9b3361

Ответ 1

Если только вы работаете в своей ветке feature2, и вы не поделились ею с другими людьми, прекрасно сменить эту ветвь перед слиянием. Вы можете сделать следующее, например:

git checkout feature2
git rebase --onto master feature1 feature2

..., который перепишет вашу ветвь feature2, оставив ее так, чтобы она состояла из всех коммитов в feature2, так как она была разветвлена ​​с feature1, но была повторно применена на master. Я предлагаю вам использовать gitk --all или аналогичный git просмотрщик истории впоследствии, чтобы проверить, что результат этой операции является тем, что вы хотите.

Кстати, это как раз сценарий, используемый для объяснения --onto в git rebase документации - см. начало абзаца:

Вот как вы пересадили ветвь темы на основе одной ветки на другую, чтобы притворяться, что вы разветкили ветвь темы из последней ветки, используя rebase -onto. [...]


Обновлено в ответ на большее количество материала в вопросе:

Начиная с вашей истории, которая выглядит так:

A - B - C - D - - - - - - - - - - - - - L - M  master  
            |                          
            |               - I - J - K  feature2                  
            \              /           \
             - E - F - G - H - - - - - -N - O - P  feature1

Вы можете получить то, что хотите, выполнив следующие действия:

git checkout feature2
git rebase --onto D H feature2

Это оставит вас с историей, которая выглядит так:

A - B - C - D - - - - - - - - - - - - - - - - - - - L - M  master  
            |\
            | \ - I' J' K' feature2       I - J - K                    
            \                           /           \
             - - - - - - - E - F - G - H - - - - - -N - O - P  feature1

Перед созданием слияния, которое вы хотите в feature1, вы должны указать SHA1sum O и P. (Я предполагаю, что N - это просто нормальное слияние, а не "слияние зла".)

Затем сделайте жесткий reset, чтобы переместить функцию1 обратно в H:

git checkout feature1
git rest --hard H

Затем вы должны иметь историю:

A - B - C - D - - - - - - - - - - - - - - - - - - - L - M  master  
            |\
            | \ - I' J' K' feature2
            \
             - - - - - - - E - F - G - H feature1

Теперь вы, очевидно, хотите объединить K' в feature1:

git merge K'

A - B - C - D - - - - - - - - - - - - - - - - - - - L - M  master  
            |\
            | \ - I' - J' - - - - - - - K' feature2
            \                             \
             - - - - - - - E - F - G - H - Z feature1

И, наконец, вы можете вишнево выбрать старые O и P на feature1 с помощью:

git cherry-pick O
git cherry-pick P

... оставить:

A - B - C - D - - - - - - - - - - - - - - - - - - - L - M  master  
            |\
            | \ - I' - J' - - - - - - - K' feature2
            \                            \
             - - - - - - - E - F - G - H - Z - - O' - P' feature1

Ответ 2

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

  • Rebase I-J-K на D, посмотрите название раздела" более интересные перестановки
  • Rebase O-P на H. так же, как это сделано на шаге 1
  • Наконец, объедините функцию2 в feature1 с помощью git merge feature2, пока вы не отметили функцию.

Если вы хотите, чтобы K слился с определенным коммитом, перезагрузка становится немного сложнее.