Git Cherry pickを使う | 作業ブランチを誤ってリモートmainにプッシュしてしまった時の対処方法

gitコマンドのrevertとcherry pickを使って、リモートのコミットの打ち消しと再度プッシュを行う

7/22/2025

はじめに

プロジェクトに新しく「カテゴリー」機能を追加するために作業を行っていた。
完成したのでプルリクを作成しようとしたところ、gitのコマンドを間違えしまいプルリク作成が出来ない状態になってしまった。

簡単にいうと、カテゴリーの追加作業をしていたブランチを、リモートのメインにマージしてしまった。

メインに反映済みのためPRは作成できない。
そこで、gitのrevertとcherry pickというものを行うことにした。

誤って行った作業の流れ

  1. 作業ブランチ feature/add-Category で作業し、コミット。
  2. 一旦、別作業のプルリクをGitHub上で main にマージする。
  3. main の最新を取り込むため、git pull を実行してローカルmainを更新。
  4. 再び feature/add-Category に戻り、最新状態にしようとしたが、誤って git pull を実行してしまった。
  5. この時、以下のようなメッセージが表示されていた:
    Merge branch 'main' into feature/add-Category 
    # Please enter a commit message to explain why this merge is necessary, 
    # especially if it merges an updated upstream into a topic branch.

  6. そのままマージコミットとともに push してしまう。

その結果どうなったか

GitHubでプルリクを作成しようとしたところ、
すでに feature/add-Category の作業が main にマージされていた。

リモート上でfeature/add-Categoryブランチも確認出来ない。

差分も出ず、プルリクエストを作成できない状態だった。


✅ 原因

誤って feature/add-Category ブランチで git pull を実行してしまったことで、Git はそのブランチに対応するリモート追跡ブランチ(origin/feature/add-Category)を探そうとした。

しかし、origin/feature/add-Category はまだリモートには存在していなかったため、Git はmain ブランチをマージ対象として使用しようとした

その結果、Gitは origin/main の最新コミットと、現在のfeature/add-Category の状態をマージしようとし、マージコミットを作成するためのメッセージ入力(先ほどの作業④の部分)状態になった。

マージコミットとは、ブランチ同士を統合して、新たなコミットを1つ作成すること

今回の場合、feature/add-Categoryブランチがorigin/mainの最新変更を取り込んで一つのマージコミットになった。
これによって、feature/add-Categoryはorigin/mainと同じ変更を含む合成状態になる。

また、そのままVScodeの機能を使ってプッシュした際に、プッシュ先がorigin/mainになってしまっていたと思われる。


🧯 対処:RevertとCherry-pickを使って修正した

対処の全体の流れ

  1. ローカルの main ブランチで revert を実行
  2. origin/mainpush
  3. 新しいブランチを切る
  4. 必要なコミットを cherry-pick で再適用
  5. push(ブランチを明示)
  6. PRを作成

Revertとは?

git revert は、過去のコミットを打ち消す新しいコミットを作るコマンド。
元のコミット自体を削除するのではなく、その内容を「反対方向」に変更する。

たとえば、機能Aを追加したコミットを revert すると、
機能Aを削除するコミットが新しく作成される。

git revert 57f1c29 --no-edit

このように、打ち消したいコミットを mainrevert していく。
57f1c29の部分はコミットIDを入れる。

そうすると、追加したカテゴリー機能が削除されるコミットが作成される。


Revert後の手順

  1. mainrevert したあと、リモートに push
git push origin main
  1. 新しく作業ブランチを作成:
git checkout -b feature/add-category-from-cherry-pick
  1. 必要なコミットを cherry-pick で拾い直す:
git cherry-pick 57f1c29 aad13b2 4baf1e8 088c332 7f56aed 61faa2a 9426e5a
  • revertで削除した(打ち消した)カテゴリー機能が復活
  • cherry-pickを使うことにより、コミットIDを使用して変更・編集内容を取り出せる。
  1. ブランチ名を明示して push
git push -u origin new-feature/add-category
  • ⚠️プッシュ先は上記のように明示すること。VScode上のプッシュボタンを使用したところ、またしてもorigin /mainにマージされてしまった。

⚠️なぜ再びmainに反映されてしまったのか?

VSCodeのGit UIが、push先を main にしてしまっていたことが原因だった。

VSCodeのUIは、追跡ブランチが既に存在している場合、自動でそこにpushしてしまうことがある
明示的に「新しいブランチとしてpush」しない限り、意図しないpush先になってしまうことがある。


🛠 今後の対策

  • push時は、VSCodeのGit UIではなく、CLIを使用するようにする。

まとめ

Gitの操作ミスによって、意図せず main に作業内容が含まれてしまうことがあった。
しかし、revertcherry-pick を使うことで、コミットの打ち消しと再pushをすることができた。

間違えたコマンドを打った時には修正する方法も知っておく必要がある。