- 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 は処理を一時停止して次のようなメッセージを表示します。
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 自体をなかったことにしたい」という場合は、次のコマンドを実行します。
git cherry-pick --abortこのコマンドを実行すると、cherry-pick を始める前の状態にきれいに戻ります。作業中のファイルへの変更もすべて元に戻るので安心です。
–abort が使えるのはコンフリクト中だけ
注意点として、--abort が有効なのは cherry-pick がコンフリクトで止まっている最中だけです。
コンフリクト中のステータスは次のように確認できます。
$ 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 でチェリーピックを再開する
コンフリクトを解消した後は、変更をステージに追加してから次のコマンドを実行します。
# 1. コンフリクトしたファイルを修正する
vim src/main.py
# 2. 修正したファイルをステージに追加
git add src/main.py
# 3. cherry-pick を再開
git cherry-pick --continue実行するとコミットメッセージの入力画面が開きます。そのまま保存すれば cherry-pick が完了します。
–skip でそのコミットだけ飛ばす
複数コミットを cherry-pick している途中で、特定のコミットだけをスキップしたい場合は次のコマンドを使います。
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件であれば、このまま使えます。
# --soft: コミットを取り消す。変更はステージに残る
git reset --soft HEAD~1
# --mixed(デフォルト): コミットを取り消す。変更はワーキングツリーに残る
git reset HEAD~1コミットもファイルの変更も完全に消す(–hard)
cherry-pick で取り込んだ変更そのものが不要で、完全に元に戻したい場合は次のコマンドを使います。
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 を確認します。
git log --onelinea1b2c3d (HEAD -> main) fix: ログ出力を修正 ← cherry-pick したコミット
e4f5g6h feat: 新機能を追加
7i8j9k0 docs: READMEを更新コミット ID が確認できたら次のコマンドを実行します。
git revert a1b2c3dコミットメッセージの入力画面が開きます。そのまま保存すると「Revert “fix: ログ出力を修正”」というコミットが新たに作られ、cherry-pick の変更が打ち消されます。
あとは通常どおり push すれば完了です。
git push origin maingit revert の特徴:履歴が残る
このコマンドは既存のコミットを書き換えるのではなく、「変更を打ち消す新しいコミット」を追加します。
そのためコミット履歴がきれいに残り、チームの他のメンバーに影響を与えません。push 後の取り消しにはこちらが安全です。
注意:git revert でもコンフリクトが発生する場合があります。その場合は通常のマージと同様にコンフリクトを解消してからコミットします。
コミットメッセージ入力をスキップしたい場合
エディタを開かずにデフォルトのメッセージでコミットしたい場合は、次のように実行します。
git revert a1b2c3d --no-editまとめ:シーン別コマンド早見表
cherry-pick の取り消し方法を状況別にまとめます。
| 状況 | コマンド | 備考 |
|---|---|---|
| コンフリクト中・取り消したい | git cherry-pick --abort | cherry-pick 前の状態に戻る |
| コンフリクト中・解消して続けたい | git add → git 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 の使い方が曖昧」という方は、先にこちらの記事を読むのがおすすめです。



コメント