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

Разделить ветвь git на две ветки?

Я пытаюсь помочь коллеге, который случайно создал одну ветвь функции из другой ветки функции, вместо того, чтобы создавать вторую из master. Вот по существу то, что у нас есть сейчас...

Master ---A---B---C
                   \
              Foo   E---F---F---H
                                 \
                            Bar   J---K---L---M

И вот что мы хотели бы иметь...

Master ---A---B---C
                  |\
             Foo  | E---F---F---H
                  |
             Bar  J---K---L---M

Один из способов, по которым я думал, - создать ветки FooV2 и BarV2, а вишня - выбрать отдельную запись в соответствующие ветки V2. Но мне любопытно, есть ли лучший способ справиться с этой ситуацией?

4b9b3361

Ответ 1

Мне кажется, что вы могли:

git checkout J
git rebase master

Edit:

Я попробовал то, что предложил, и он не работает. предложение knittl не работает (на моей коробке). Вот что для меня работало:

git rebase --onto master foo bar

Ответ 2

Для более общего ответа, который поможет нам понять вещи немного лучше, чем просто "запустить эту команду", нам нужен больший пример. Итак, давайте притвориться, что вы на самом деле в этой ситуации:

---A---B---C <= Master
            \
             E---F---F---H <= Foo
                          \
                           J---K---L---M <= Bar
                                        \
                                         N---O---P---Q <= Baz

И вот что мы хотели бы иметь...

---A---B---C <= Master
           |\
           | E---F---F---H <= Foo
           |\
           | J---K---L---M <= Bar
            \
             N---O---P---Q <= Baz

К счастью, Git имеет решение для нас в параметрах команды rebase!

git rebase --onto [newParent] [oldParent] [branchToMove]

Что это значит, можно разбить на части:

  • rebase - Измените родителей чего-то.
  • --onto - это флаг, который сообщает Git использовать этот альтернативный синтаксис перезаписи
  • newParent - Это ветка, в которой ветка, которую вы переустанавливаете, будет иметь как родительский
  • oldParent - это ветка, в которой ветка, которую вы пересобираете, в настоящее время имеет в качестве родителя
  • branchToMove - Это ветвь, которую вы перемещаете (переустанавливаете)

Немного о "старой родительской ветке" может быть немного запутанной, но то, что она действительно делает, это "игнорировать изменения моего старого родителя при выполнении rebase". oldParent заключается в том, как вы определяете, где начинается ветка, которую вы двигаете (т.е. branchToMove).

Итак, каковы команды для выполнения в нашей ситуации?

git rebase --onto Master Bar Baz
git rebase --onto Master Foo Bar

Обратите внимание, что порядок этих команд имеет значение, потому что нам нужно вытащить каждую ветвь конца "цепочки ветвей".

Ответ 3

Вы можете переустановить ветвь Бар на мастер:

git rebase --onto C H M

Если некоторые конфликты конфликтуют, вы должны их разрешить вручную (но вы также должны сделать это при наборе вишни). Осторожно: не переустанавливайте, когда история уже опубликована.