'git reset --hard' Несколько перебазированных веток - PullRequest
0 голосов
/ 06 января 2012

У меня есть локальная ссылка, которая содержит несколько веток, которые я недавно выполнил git rebase на:

A---B---C---D master
     \
      E---F---G topic1
               \
                H---I---J topic2

, которые превратили его в:

A---B---C---D master
             \
              E'---F'---G' topic1
                         \
                          H'---I'---J' topic2

с помощью следующего набораиз команд:

git checkout topic1
git rebase master
git checkout topic2
git rebase topic1

Проблема?

Я случайно забыл сделать git rebase --no-ff, чтобы отследить все мои ранее объединенные ветви.Теперь у меня нет возможности легко определить (используя gitk --all), где произошли мои слияния.Я знаю, что они произошли где-то между HEAD@{E} и HEAD@{J}, но без прохождения каждого коммита в отдельности я теряюсь.

Что я решил сделать:

Итак, яподумал, что я буду использовать git reflog, как предложено здесь , вместе с git reset --hard HEAD@{#}, чтобы вернуться к исходному состоянию до того, как произошли две перезагрузки, а затем попытаться git rebase branchname --no-ff, как я предложил.

Мой окончательный вопрос (с несколькими дополнительными):

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 06 января 2012

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

0 голосов
/ 06 января 2012

Пожалуйста, посмотрите на git reflog. Имеет предыдущие ссылки. Вы можете сбросить коммит из reflog, выполнив git reset --hard HEAD@{2}, чтобы получить 2-й последний коммит, на который указывает HEAD То же самое относится и к филиалам.

Вы можете даже сделать это, не проверяя их так:

git push . +topic1@{1}:topic1
git push . +topic2@{1}:topic2
...