#事の始まり
ブランチAにコミットするはずの内容を間違えてブランチBにコミットしてしまった。
チームのSlackで助けを求めたところ、cherry-pickコマンドでなんとかするのが良さそうということが判明。
#チェリーピックってなんすか
ブランチβにあるコミットの更新内容を、ブランチαに取り込むことができるgitの機能とのこと。
この説明を見たときは正直「マージでも同じなんじゃね?」と思ったけど、どうやらそうではなく、あくまでコミット単位で取り込めるというのがチェリーピックの特徴ということがわかった。
例えばブランチβに分岐してから10個のコミットが生まれていた場合を考えてみる。
これをαに「マージ」しようとすると、それまでの10個のコミットでの変更内容が全てαへと適用されてしまうことになる。
一方、これを「チェリーピック」で処理すれば、5個目と6個目のコミットで生じた変更分だけをαに取り込むことができるということ。
#どうすれば使えるんだい
打ち込むコマンドは次の通り。
git cherry-pick [commit-ID]
//一連の複数コミットをまとめてチェリーピックしたい場合は始点コミットと終点コミットをピリオド二つで結ぶ
git cherry-pick [commit-ID-start]..[commit-ID-end]
※複数コミットをまとめる場合、始点コミットは「取り込みたいコミットの一つ前」を指定する必要がある。
[git]複数のcommitをまとめてcherry-pickする
https://dackdive.hateblo.jp/entry/2016/06/06/203542
このコマンドを打ち込むことで、現在チェックアウトしているブランチに、指定したコミットIDの内容を適用させることができる。
コミットIDそのものはgit log
コマンドを実行すると確認可能。
#なんかコンフリクト出ましたけど
実際にコマンドを実行してみたところ、コンフリクトが発生してしまった。
どんなときもすんなり行けるという訳ではないらしい。というか、私のコミットの粒度がおかしいんだと思う。
error: could not apply b80f80c... [コミットメッセージ]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
vi [file]
コマンドでコンフリクトを解消すればいいよ!みたいな情報を見かけたので、実行してみる。
viを実行してから/<<<
コマンドでコンフリクト箇所を検索。
E486: Pattern not found: <<<
えええ・・・コンフリクト箇所が見つからないってこと?
#結局
このファイルは40万行くらいあるファイルだったので、キャパオーバーを起こしてしまったのかも。
試しにVSCodeで検索をかけてみたところ、ちゃんと見つかった。1万3000箇所くらい。
とても人力ではやっていられないので、チェリーピックでの方法は諦めることに。トホホ。
今後似たようなケースに遭遇したら、チェリーピックって方法もあったなあぐらいに覚えておくことにします。
さて、そもそもの問題は解決していないままなんですけどどうしましょうかね(頭抱え)