Как я могу отбросить ветку из слияния нескольких веток в git? - PullRequest
4 голосов
/ 01 февраля 2012

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

--- A --- A1 --- A2 --- A3 --
    |                         \
    + --- B1 --- B2 --- B3 --- B4-
    |                              \
    + --- C1 --- C2 --- C3 ---------C4

Однако мне только что сказали, что ветка B не готова к прайм-тайму, поэтому мне нужно отменить эти коммиты. Как я могу откатить свои изменения, чтобы моя новая голова C5 была бы слиянием коммитов C3 и A3? Когда я закончу, я хочу, чтобы хранилище выглядело следующим образом:

    + --- B1 --- B2 --- B3 --- B4 --- B5
    |                         /
--- A --- A1 --- A2 --- A3 --
    |                         \
    + --- C1 --- C2 --- C3 --- C4 --- C5

Ответы [ 4 ]

3 голосов
/ 02 февраля 2012

Я из лагеря, который предпочитает повторять неудачи , пока он не выдвинут , чтобы оставить менее многословную историю, и я обычно делаю так:

# go back to commit C3
git checkout C3

# redo the merge with only A
git merge branch_A

# make sure you've gotten the desired alteration
# git diff --stat branch_C
# git diff branch

# switch your C branch over to your redone version
git checkout -B branch_C

# otherwise if you change your mind, just go back to C4
# git checkout branch_C

Редактировать: Комментарий № 4 был полностью верным в том, что предыдущая версия ничего не дала.Это изменение изменяет строку git merge, которая ранее объединяла B4.Опция --detach из первоначального извлечения также была удалена, так как она лишняя, если аргумент C3 не является именем ветви.

2 голосов
/ 02 февраля 2012

Верните C4 (и передайте это обращение), затем объедините A3 с C5, который вы только что создали.

--- A --- A1 --- A2 --- A3 -----------------------------
    |                         \                          \
    + --- B1 --- B2 --- B3 --- B4-                        \
    |                              \                       \
    + --- C1 --- C2 --- C3 ---------C4--- C5(reverts C4) -- C6

В итоге вы получите B4 с B3 + A3 и C6 с C3 + A3.

Я полагаю, что вы могли бы сделать все это, сделав ребазинг, но я предпочитаю оставлять свои следы, когда я сделал что-то грязное, чтобы я мог видеть и свою ошибку, и то, что я сделал, чтобы исправить это. Rebase отменяет историю, что заставляет меня дергаться.

1 голос
/ 08 февраля 2012
# checkout before merge
git checkout C3
# make merge we want
git merge A3
# rebase any work on top of the new merge
git rebase --onto HEAD C4 branch_C
# use fixed version as branch_C
git branch -f branch_C HEAD
# aha! now you on the fixed branch_C
git checkout branch_C

Чем сделать то же самое с B. Полагаю, вы не разветвляли C & B после «плохого» слияния.

0 голосов
/ 08 февраля 2012

Если вы еще не поделились этим хранилищем с кем-либо еще, вы можете попробовать git rebase --onto.

git rebase --onto <to> <from> <what>

Я предполагаю, что ваши ветви названы A (на A3), B (на B4) и C (на C4):

git rebase --onto B3 A3 C

Где B3 и A3 - это сами SHA коммитов.

Я Настоятельно рекомендуем выполнить резервное копирование своего хранилища перед выполнением этой команды, чтобы воспроизвести его на всякий случай.

...