Я потерял свои изменения после перезагрузки?

Недавно я повредил ветку, над которой я работал. История дерева выглядела примерно так:

1 = 2 = 3 = 4
     \
      5 = 6 = 7
           \
            8

Я хотел бы переустановить мои изменения (номер 8 на диаграмме) на ведущую ветку (до фиксации 4 на диаграмме сейчас). Поэтому я сделал следующее:

git checkout my_branch
git rebase master

< много git mergetool/git rebase -skip для разрешения конфликтов >

Только теперь, когда я запускаю:

git checkout my_branch
git diff master

Я получаю нулевые различия. Я не потерял свою ветку (я все еще могу воссоздать свои изменения из патча, который я сохранил), но я не могу найти слияние /rebase, которое я сделал. Что я сделал не так? Является ли rebase все еще там где-то с моими изменениями, объединенными с мастером, или мне нужно сделать это снова?

Ответ 1

Если вы не видите никакой разницы, я подозреваю, что вы потеряли свои изменения. Вероятно, вы можете использовать git reflog, чтобы идентифицировать ветвь, существовавшую до перезагрузки, и используйте git reset --hard <my-branch-tip-before-rebase>, чтобы вернуть исходную ветку. И да, вам придется снова пройти процесс.: - (

Я не совсем уверен, как вы оказались с ними одинаково. Я бы ожидал увидеть следующее с помощью команды, которую вы дали:

1 = 2 = 3 = 4              (master)
     \       \
      \       5' = 6' = 8' (my_branch)
       \
        5 = 6 = 7

В этом случае вы, вероятно, должны были использовать rebase --onto:

git rebase --onto master <commit id for 6> my_branch

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

1 = 2 = 3 = 4              (master)
     \       \
      \       8'           (my_branch)
       \
        5 = 6 = 7

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

Одна вещь, которую нужно запомнить. Если вы не ожидаете кучу конфликтов слияния - потому что вы не чувствуете, что источники расходятся достаточно, видящий является предупреждающим флагом о том, что он делает что-то неправильно. Хорошо сделать резервную копию, выполнив git rebase --abort, исследуя ветки и проверяя снова, если вы ожидаете конфликта. Удостоверьтесь, что обратите внимание на то, где произошел конфликт (обычно "Применить..." перед перезагрузкой удаляет вас в командную строку). Это обычно отличное место для начала.

Иногда конфликты неизбежны, и они утомительны для работы. Но я подозреваю, что с практикой вы столкнетесь с этой проблемой меньше.

Для получения дополнительной информации о пересадке изменений между ветвями рассмотрите справочную страницу git rebase. Найдите "rebase -onto". Первый хит должен приземлить вас в разделе, где говорится о пересадке изменений в другую ветку.