Извлечь одиночный коммит из двух перебазов - PullRequest
1 голос
/ 14 июля 2020

У меня есть ветка от мастера, называемая A, из которой я хотел создать новую ветку, B. За исключением того, что я испортил и создал B на основе мастера.

Желательно:

master
   \
    A
     \
      B

Фактически:

master
 \  \
  A  B

B имеет только один коммит, который мне нужен, но поскольку он основан на master, а не на A, разница огромна. Что еще хуже, я попробовал git rebase -i A и раздавил все, кроме одного коммита, который я хотел увидеть, но он, похоже, снова просто перезапустил мастер. Итак, теперь у меня есть рефлог, который в основном выглядит так:

B@{0}: rebase: B onto master
B@{1}: commit
B@{2}: rebase: B onto master
B@{3}: branch B created

Мне нужно выяснить, как получить только один коммит и основывать его на A, чтобы я мог сделать запрос на перенос где разница невелика.

Edit: было бы неплохо отметить, что A не обновлен с помощью master, он по-прежнему много коммитов. Таким образом, ошибочно перенастроенный B теперь "опережает" A.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Вот как я решил свою проблему:

Я создал новую ветку от A, названную C.

git checkout A
git checkout -b C

Затем я сделал git cherry-pick SHA-B где SHA-B - это SHA из желаемого коммита, который, к счастью, был сохранен в журнале ссылок (B@{1} из исходного сообщения). Тогда все, что мне нужно было сделать, это разрешить конфликты и зафиксировать.

0 голосов
/ 14 июля 2020

но поскольку он основан на master, а не на A, разница огромна

Тем не менее, вы можете попробовать сгенерировать патч, используя правильную базу

git format-patch --base=$(git merge-base A master) -M -C B~..B

Затем вы можете использовать git am, чтобы применить его поверх A

Если эта B фиксация является результатом перебазирования, вы действительно можете найти его в reflog (по умолчанию 90 дней до очистки). Вы можете использовать дату , чтобы точно определить правильный старый B:

 git reflog --format='%C(auto)%h %<|(20)%gd %C(blue)%cr%C(reset) %gs (%s)' B

Затем вы можете использовать format-patch, заменив B~..B на старую ссылку на фиксацию B, найденную в рефлог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...