Как исправить ветку Git master после случайного слияния с неверной веткой? - PullRequest
0 голосов
/ 22 января 2019

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

Поскольку я сделал это по ошибке, я решил отменить изменения в Master, чтобы ни одно из моих изменений там не было. Этот процесс создал Revert Commit, который удалил мои изменения из Master.

Все было хорошо, я думал ...

Прошла неделя, и я почти готов слить свою ветвь обратно в Учителя. Поскольку есть другие разработчики, работающие над другими ветками, я решил обновить свою ветку разработки, объединив любые новые изменения от Master обратно в мою.

Этот процесс, кажется, удаляет всю мою работу.

Рассматривая историю того, что только что пришло от Мастера, он содержит случайный коммит и возвратный коммит. Это означает, что всякий раз, когда я обновляю свою ветку из Master, возвратный коммит удаляет большую часть моей работы.

Как я могу объединить изменения в master обратно в мою ветку, но без включения коммита возврата?

Единственные 2 возможности, о которых я могу подумать:

  • Пройдите через каждый элемент в Merge и попытайтесь вручную удалить возвращенные элементы (это, я думаю, было бы невозможно сделать правильно, и полный кошмар, чтобы получить права).
  • Скопируйте все файлы, в которые я внес изменения, локально, объедините их с Master, а затем попытайтесь скопировать / вставить все изменения обратно в мою ветку (это, вероятно, также станет кошмаром для получения права).

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

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Итак, ваша ситуация такова (время течет слева направо):

--o--o--o---M--R--o   <- master
   \       /
    A--B--C--D--E     <- devel

Вы слили коммиты A, B и C в master, а затем отменили изменения в R, что является обратным к A + B + C.

Когда вы объединяете две ветви (не имеет значения, в какую из них вы объединяетесь), вы получите все с обеих сторон со времени последнего общего предка .

В этом случае общим предком является C, поэтому вы получаете R, D и E. С точки зрения devel, это выглядит так, как будто A, B и C были обращены, но с точки зрения мастера это как будто случились только D и E.

Решение 1: отменить возврат

Вы можете вернуть R на мастер или вспомогательную ветку, которую вы производите от мастера. Затем вы объединяете их:

--o--o--o---M--R--o   <- master
   \       /    \
    A--B--C      R'   <- aux (git revert R)
           \      \
            D--E---M' <- devel

Теперь вы можете слить devel в master.

Решение 2. Перебазируйте свою ветку

Вы перестраиваете свою ветку devel с новыми коммитами, используя git rebase --force-rebase:

--o--o--o---M--R--o   <- master
  |\       /
  | A--B--C--D--E     <- (abandoned)
   \        
    A'-B'-C'-D'-E'    <- devel

Теперь вы можете слить devel в master.

Решение 3: Скрыть нежелательного общего предка (только для экспертов)

Вы строите эту историю временно:

--o--o--o---M--R--o   <- master
   \        
    A--B--C--D--E     <- devel

Сделайте это, установив трансплантат:

git replace --graft M M^

Это говорит Git, что коммит M имеет только одного родителя, M^. Теперь вы можете слить devel в master.

Наконец, вы восстанавливаете реальную историю:

git replace --delete M

[ПРАВКА: используйте git replace вместо устаревшего файла трансплантатов.]

0 голосов
/ 22 января 2019

Не могли бы вы попытаться git reset --soft сохранить все локальные изменения и затем передать их мастеру?

...