история git испорчена

Я пытался сделать rebase, чтобы объединить коммиты в один коммит, но в итоге я написал больше коммитов, и теперь все это испортилось.

Вот дерево: при запуске git status я получаю

On branch master
Your branch is up to date with 'origin/master'.

Last commands done (5 commands done):
   pick 49147e5 squash
   pick 2c48387 Commit 
  (see more in file .git/rebase-merge/done)
Next commands to do (13 remaining commands):
   pick fddd4c7 commit 
   pick 5f01f80 commit 
  (use "git rebase --edit-todo" to view and edit)
You are currently editing a commit while rebasing branch 'master' on '1550461'.
  (use "git commit --amend" to amend the current commit)
  (use "git rebase --continue" once you are satisfied with your changes)

nothing to commit, working tree clean

При запуске git log --oneline я получаю:

Merge branch 'master' of .....
49147e5 squash
0310431 commit 4 which was PR
d4be53f commit 6
ea24a2d commit 5
1550461 commit 3
fc8115a commit 2
212138a commit 1
72d8fff Merge pull request #64 from branch 1
c5ad199 commit 14
2a6ceaf commit 13
6660dbf commit 12
b6c863e commit 11
88788e6 commit 10
5bbe8a7 commit 9
9731810 commit 8
1e4ac6b commit 7
ce3817c Merge branch 'master' of .... into branch 1
ec4c3e9 commit 6
5b8900b commit 5
d10eec9 commit 4 which was PR
5f01f80 commit 3
fddd4c7 commit 2
02ebbc8 Merge branch 'master' of ....into branch 1
3995cf2 pr changes v2
2c48387 commit 1

Как я облажался: Из 72d8fff сделал git rebase -i HEAD~7 or 8, git pull, потом git push. Я хотел squash всех коммитов после d10eec9 в один коммит, но думаю, что в итоге написал поверх HEAD.

Я думал сделать git reset --hard 72d8fff, а затем git push origin HEAD --force, что, по крайней мере, вернет меня туда, откуда я начал.
Пожалуйста, сохраните.


person harry123    schedule 09.10.2020    source источник


Ответы (1)


верни меня туда, откуда я начал.

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

Там вы найдете то, на что ссылался HEAD до вашей перебазировки.
Если вы reset --hard сделаете эту фиксацию, вы вернетесь к ней до перебазирования.
Вы также можете сравнить эту фиксацию с (если вы еще не выполняли перебазирование) ORIG_HEAD и перезагрузите эту фиксацию.

Идея остается: сначала восстановить локально вашу историю, а затем снова сжать ваши последние коммиты (на этот раз без перебазирования, но с использованием git reset --soft ) и принудительно нажмите, как только состояние вашего локального репозитория станет удовлетворительным.

person VonC    schedule 10.10.2020
comment
Я попробовал rebase на разных ветках для пробы, и поэтому раздражает видеть git reflog. Следовательно, я думал просто сделать git reset --hard 72d8fff после этого git reset --soft HEAD~9 [здесь я запутался, должен ли я делать HEAD~8], затем git commit и затем git push -f. Обратите внимание, что это основная ветка, поэтому я напуган. - person amyJ; 10.10.2020
comment
@amyJ Сначала попробуйте локально: если результат правильный, тогда вы можете нажать. Не настаивайте, если вы не уверены. - person VonC; 10.10.2020
comment
хорошо, поэтому, когда я делаю git reset --hard 72d8fff, я получаю предыдущую фиксацию, с которой я начал rebase. Теперь, когда я делаю git reset --soft HEAD~1, все коммиты из [5b8900b, 72d8fff] исчезают. Вероятно, это потому, что я внес эти изменения в ветку функций, а затем объединился с master, а git указывает на предыдущую HEAD. Когда я делаю git commit -v, изменения выглядят нормально. Меня беспокоит только то, должен ли я сначала прервать rebase, прежде чем что-либо делать? Сообщения, размещенные в вопросе, все еще там - person amyJ; 10.10.2020
comment
Да, перед любым сбросом я бы сначала прервал текущую перебазировку или вышел из нее в крайнем случае (stackoverflow.com/a/41363262/ 6309) - person VonC; 10.10.2020