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


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

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

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

git checkout my_branch
git rebase master

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

git checkout my_branch
git diff master

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

1   51   2012-10-31 13:14:49

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

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

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

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

для получения дополнительной информации о пересадке изменений между ветвями, посмотрите на git rebase man page. Поиск "rebase -- on". Первый удар должен посадить вас в раздел, говорящий о пересадке изменений в другой отделение.