Ответ 1
Мне кажется, что вы могли:
git checkout J
git rebase master
Edit:
Я попробовал то, что предложил, и он не работает. предложение knittl не работает (на моей коробке). Вот что для меня работало:
git rebase --onto master foo bar
Я пытаюсь помочь коллеге, который случайно создал одну ветвь функции из другой ветки функции, вместо того, чтобы создавать вторую из 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. Но мне любопытно, есть ли лучший способ справиться с этой ситуацией?
Мне кажется, что вы могли:
git checkout J
git rebase master
Edit:
Я попробовал то, что предложил, и он не работает. предложение knittl не работает (на моей коробке). Вот что для меня работало:
git rebase --onto master foo bar
Для более общего ответа, который поможет нам понять вещи немного лучше, чем просто "запустить эту команду", нам нужен больший пример. Итак, давайте притвориться, что вы на самом деле в этой ситуации:
---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
Обратите внимание, что порядок этих команд имеет значение, потому что нам нужно вытащить каждую ветвь конца "цепочки ветвей".
Вы можете переустановить ветвь Бар на мастер:
git rebase --onto C H M
Если некоторые конфликты конфликтуют, вы должны их разрешить вручную (но вы также должны сделать это при наборе вишни). Осторожно: не переустанавливайте, когда история уже опубликована.