事例
当初、こんな感じのブランチ構成とツリーになっているとします。
main
┃ [コミットX]
┣ task-1
┃ ┣ task-2
トラブルが発生する流れ(例):
1.task-1をmainにマージする際に、mainの最新コミットにrebaseしてからマージした。
2.task-2をmainにマージしようとしたら、コミット履歴がおかしくなっていて、最新mainと複雑なコンフリクトが発生!
main
┃ [task-1を最新mainにrebaseしてマージ]
┃ [コミットX]
┣
┃ ┣ task-2 →コミット履歴がおかしくなって最新mainにrebaseもマージもできない!
こんなケースで、マージできなくなって困った時の対処方法です。
アジャイル開発で、一つの機能を複数人で作り込んでいく場合などはありがちなトラブルかと思います。
対処手順
1.最新のmainブランチを取得する。
git fetch
git checkout main
git reset --hard origin/main
2."task-2"ブランチの名前を"task-2-back"に変更して退避する。
git branch -m task-2 task-2-back
3."task-2"ブランチをmainブランチから切り直す。
(カレントブランチが"main"の前提で)
git checkout -b task-2
4."task-2-back"ブランチの対象コミットをcherry-pickする。
コミットが一つの場合/複数の場合、コミットをまとめたい場合、cherry-pickでコンフリクトした場合、いろいろあるかと思いますが、こちらの解説記事がとても分かりやすいと思います。
git cherry-pickを完全マスター!特定コミットのみを取り込む方法 - SAMURAI ENGINEER Blog
5.リモートにforce pushする。
(カレントブランチが"task-2"の前提で)
git push -f origin HEAD