タイトルの問題を解決する際に行なったことをまとめます.
類似の問題が発生した際の参考としていただけると幸いです.
投稿主はGitの経験が浅いため,本記事で紹介する内容は不正確,または遠回りなものである可能性があります.
問題の詳細
コミット2を基にコミットAをローカルで作成したが,いざリモートにプッシュしようとするとコミット2から派生したコミットBが既にプッシュされていた,という問題です.
解決の形
コミットBを取り消すことは望ましくなかったため,コミットAでの変更をコミットBに反映することで解消する,ということを解決の形としました.
なお,コミットAとコミットBで扱うファイル数は同じ,コミットA-コミットB間で名称が異なるファイルは存在しないものとします.
実際に行なったこと
1. コミットAの内容をスタッシュに保存する
コミットAの内容をスタッシュに保存します.
# コミットAの内容をスタッシュに保存
$ git stash
# コミットAの内容をスタッシュに保存(新規作成ファイルも保存する場合)
$ git stash -u
# スタッシュへの保存を確認
$ git stash list
スタッシュへの保存を確認したら,コミットAのあるブランチに移動します.
$ git checkout [コミットAのあるローカルブランチ名]
2. リモートの最新コミットBの内容をローカルに持ってくる
コミットAの内容をリセットしてコミット2の状態(コミットAをコミットしていない状態)に戻します.
こうすることで,コミットBの内容をローカルにプルすることが可能となります.
# コミットAをリセット
$ git reset --hard [コミットAのハッシュ値]
続いて,コミットBの内容をローカルに反映します.反映先は先ほどリセットコマンドで戻ったコミット2になります.
# コミットBをプル
$ git pull [リモートリポジトリURL] [コミットBのあるリモートブランチ名]
3. スタッシュをコミットBにマージする
ここまででローカルにもコミットBが反映された状態となるので,ローカルのコミットBに先ほど保存したスタッシュの内容をマージします.
# スタッシュの内容をローカルのコミットBにマージ
$ git merge stash
コミットBにマージしてできたコミットをコミットCとします.
4. マージ後のコミットCをリモートにプッシュする
これでローカルの最新コミットであるコミットCは,コミットBから派生し,かつコミットAの変更を反映したコミットであるため,リモートのコミットBの先にプッシュすることが可能です.
このコミットCをリモートにプッシュします.
$ git push [リモートリポジトリのURL] [コミットCのあるローカルブランチ名]
以上で,求める解決の形が実現できました!