MENU
\ お問い合わせはこちら! /

git cherry-pickの取り消し方法|revert・reset・コンフリクト解消まで完全解説

  • git cherry-pick を取り消したいけど、どのコマンドを使えばいいか分からない
  • コンフリクトが起きて cherry-pick が止まってしまった
  • push 後に cherry-pick したコミットを取り消したい

cherry-pick の取り消し方法は「どのタイミングで取り消すか」によって使うコマンドが変わります。

この記事では、コンフリクト中・コミット後・push 後のそれぞれのケースで使うべきコマンドを、実際の手順と一緒に丁寧に解説します。

取り消し方法は「タイミング」で変わる

cherry-pick の取り消しは、状況によって使うコマンドが3パターンに分かれます。

タイミング使うコマンド
cherry-pick 中にコンフリクトが起きたgit cherry-pick --abort
cherry-pick 完了後・push 前git reset HEAD~1
push 後git revert <コミットID>

これを頭に入れておくと、焦らず対処できます。それぞれ詳しく見ていきましょう。

コンフリクト中に取り消す:git cherry-pick –abort

cherry-pick を実行したときにコンフリクトが発生すると、Git は処理を一時停止して次のようなメッセージを表示します。

Bash
CONFLICT (content): Merge conflict in src/main.py
error: could not apply a1b2c3d... fix: ログ出力を修正
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
hint: You can instead skip this commit: run "git cherry-pick --skip".
hint: To abort and get back to the state before "cherry-pick",
hint: run "git cherry-pick --abort".

この状態で「やっぱりこの cherry-pick 自体をなかったことにしたい」という場合は、次のコマンドを実行します。

Bash
git cherry-pick --abort

このコマンドを実行すると、cherry-pick を始める前の状態にきれいに戻ります。作業中のファイルへの変更もすべて元に戻るので安心です。

–abort が使えるのはコンフリクト中だけ

注意点として、--abort が有効なのは cherry-pick がコンフリクトで止まっている最中だけです。

コンフリクト中のステータスは次のように確認できます。

Bash
$ git status
On branch main
You are currently cherry-picking commit a1b2c3d.
  (fix conflicts and run "git cherry-pick --continue")
  (use "git cherry-pick --skip" to skip this patch)
  (use "git cherry-pick --abort" to cancel the cherry-pick operation)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   src/main.py

「You are currently cherry-picking commit」と表示されていれば、--abort が使える状態です。

cherry-pick が正常に完了してコミットが作られた後では、--abort は使えません。その場合は後述の git reset を使います。

コンフリクトを解消してチェリーピックを完了させる

「取り消すのではなく、コンフリクトを直して cherry-pick を完了させたい」という場合の手順も押さえておきましょう。

–continue でチェリーピックを再開する

コンフリクトを解消した後は、変更をステージに追加してから次のコマンドを実行します。

Bash
# 1. コンフリクトしたファイルを修正する
vim src/main.py

# 2. 修正したファイルをステージに追加
git add src/main.py

# 3. cherry-pick を再開
git cherry-pick --continue

実行するとコミットメッセージの入力画面が開きます。そのまま保存すれば cherry-pick が完了します。

–skip でそのコミットだけ飛ばす

複数コミットを cherry-pick している途中で、特定のコミットだけをスキップしたい場合は次のコマンドを使います。

Bash
git cherry-pick --skip

コンフリクトが起きたコミットを適用せずに次のコミットへ進みます。そのコミットの変更を捨てるという選択肢です。

コミット後・push 前に取り消す:git reset

git cherry-pick 後のコミットを取り消す代表的な方法が git reset です。

cherry-pick が正常に完了してコミットが作られたけど、push する前に「やっぱりやめたい」という場合に使います。

ポイント:git reset は「コミット履歴を巻き戻すコマンド」です。そのため、すでに共有された履歴に対して使うと他の人に影響を与える可能性があります。

コミットだけ消してファイルの変更は残す(–soft / –mixed)

cherry-pick で作ったコミットを取り消しつつ、ファイルの変更内容は手元に残したい場合は次のコマンドを使います。

コマンド中の HEAD~1 は「1つ前のコミット」を意味します。cherry-pick で作ったコミットが直前の1件であれば、このまま使えます。

Bash
# --soft: コミットを取り消す。変更はステージに残る
git reset --soft HEAD~1

# --mixed(デフォルト): コミットを取り消す。変更はワーキングツリーに残る
git reset HEAD~1

コミットもファイルの変更も完全に消す(–hard)

cherry-pick で取り込んだ変更そのものが不要で、完全に元に戻したい場合は次のコマンドを使います。

Bash
git reset --hard HEAD~1

注意:このオプションはファイルの変更も含めて完全に削除します。取り消しは非常に困難なので、本当に消していいか必ず確認してから実行してください。

–soft / –mixed / –hard の違い一覧

オプションコミットステージ(index)ワーキングツリー
--soft取り消す変更が残る変更が残る
--mixed(デフォルト)取り消す変更が消える変更が残る
--hard取り消す変更が消える変更が消える

補足:もし reset 後にすでに push 済みの履歴を上書きしたい場合は git push --force が必要になります。ただし、他のメンバーの履歴を壊す可能性があるため、チーム開発では基本的に避けましょう。

push 後に取り消す:git revert

リモートリポジトリへ push してしまった後でも git reset 自体は使えますが、履歴を書き換えるため git push --force が必要になります。

これは他のメンバーの履歴を壊す可能性があるため、チーム開発では基本的に避け、git revert を使うのが安全です。

git revert の使い方

まず、取り消したい cherry-pick のコミット ID を確認します。

Bash
git log --oneline
Bash
a1b2c3d (HEAD -> main) fix: ログ出力を修正  ← cherry-pick したコミット
e4f5g6h feat: 新機能を追加
7i8j9k0 docs: READMEを更新

コミット ID が確認できたら次のコマンドを実行します。

Bash
git revert a1b2c3d

コミットメッセージの入力画面が開きます。そのまま保存すると「Revert “fix: ログ出力を修正”」というコミットが新たに作られ、cherry-pick の変更が打ち消されます。

あとは通常どおり push すれば完了です。

Bash
git push origin main

git revert の特徴:履歴が残る

このコマンドは既存のコミットを書き換えるのではなく、「変更を打ち消す新しいコミット」を追加します。

そのためコミット履歴がきれいに残り、チームの他のメンバーに影響を与えません。push 後の取り消しにはこちらが安全です。

注意:git revert でもコンフリクトが発生する場合があります。その場合は通常のマージと同様にコンフリクトを解消してからコミットします。

コミットメッセージ入力をスキップしたい場合

エディタを開かずにデフォルトのメッセージでコミットしたい場合は、次のように実行します。

Bash
git revert a1b2c3d --no-edit

まとめ:シーン別コマンド早見表

cherry-pick の取り消し方法を状況別にまとめます。

状況コマンド備考
コンフリクト中・取り消したいgit cherry-pick --abortcherry-pick 前の状態に戻る
コンフリクト中・解消して続けたいgit addgit cherry-pick --continueファイル修正後にステージへ追加
コンフリクト中・そのコミットだけ飛ばしたいgit cherry-pick --skip変更は適用されない
コミット後・push 前(変更を残す)git reset --soft HEAD~1変更はステージに残る
コミット後・push 前(完全に消す)git reset --hard HEAD~1変更も完全削除(注意)
push 後git revert <コミットID>打ち消しコミットを追加

どれを使うべきか迷ったら

判断基準はシンプルです。

  • 履歴を書き換えてもいい(push 前)→ git reset
  • 履歴を残したい(push 済み)→ git revert

チーム開発では基本的に revert を使うと覚えておくと安全です。

「取り消したいのはどのタイミングか」を最初に確認して、適切なコマンドを選ぶようにしましょう。

「そもそも cherry-pick の使い方が曖昧」という方は、先にこちらの記事を読むのがおすすめです。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)