git commit を -m オプションなしで実行すると、突然Vimというテキストエディタが起動して画面が変わります。操作方法がわからず固まってしまい、「コミット自体を中止してやり直したい」と思っている方は多いはずです。この記事では、コミットをキャンセルしてVimを安全に終了する :cq コマンドを解説します。
このシリーズの全記事
- 第1回:プログラミングエラーメッセージの読み方
- 第2回:VSCodeで「command not found: code」が出た時の解決方法
- 第3回:npmのEACCESエラーをsudoなしで安全に解決する方法
- 第4回:git commitでVimが開いたときにコミットをキャンセルする方法【この記事】
- 第5回:git detached HEAD状態から安全に復帰する方法
- 第6回:git resetとgit revertの違いと使い分け
- 第7回:git restoreで特定のファイルだけを過去に戻す方法
- 第8回:VSCodeのマージエディタでgitコンフリクトを解消する手順
- 第9回:.envをGitにコミットしてしまった場合の履歴からの完全削除
この記事でわかること
- なぜgit commitでVimが起動するのか
- コミットを中断してVimを終了する:cqの使い方
- Gitが終了コードを監視してコミットをキャンセルする仕組み
なぜgit commitでVimが開くのか
Git には「コミットメッセージをエディタで入力する」という動作が組み込まれています。git commit -m "メッセージ" のように -m オプションを付けた場合はエディタが起動しませんが、-m なしで git commit を実行すると、GitはOSのデフォルトエディタを起動してコミットメッセージの入力を求めます。
macOSとLinuxの多くの環境では、デフォルトエディタがVimに設定されているため、見慣れない画面が表示されます。Vimには「ノーマルモード」と「インサートモード」が存在し、起動直後はノーマルモードのため文字を入力しても表示されません。
注意
ターミナルウィンドウを強制終了してVimを抜けても、コミット処理は中断されません。次にターミナルを開いてgit commitを実行すると、MERGE_MSG等の一時ファイルが残っている場合があります。正しい手順で終了してください。
:cqでコミットをキャンセルしてVimを終了する
コミットメッセージを書かずにコミット自体をキャンセルしたい場合、:cq を使います。以下の手順で実行してください。
-
ノーマルモードであることを確認する
Vimが起動直後はノーマルモードです。
Escキーを一度押すと確実にノーマルモードに戻れます。画面下部にINSERTやREPLACEの表示がなければノーマルモードです。 -
:cq と入力してEnterを押す
ノーマルモードで
:を入力すると、画面下部にコマンド入力欄が現れます。続けてcqと入力してEnterを押してください。# Vimのコマンドラインに入力する内容 :cq # 出力:(Vimが終了し、ターミナルに以下が表示される) error: There was a problem with the editor 'vi'. Please supply the message using either -m or -F option. # コミットは実行されていない
コミットが中断され、ターミナルに戻ります。git log を確認してもコミットは追加されていません。
なぜ:cqでコミットがキャンセルされるのか
Gitはエディタを「子プロセス」として起動し、エディタの終了コードを監視しています。終了コードとは、プログラムが終了したときにOSに返す数値です。
通常の保存終了(:wq)では終了コード 0(正常終了)が返されます。Gitはこれを「コミットメッセージの入力が完了した」と判断してコミットを実行します。
一方、:cq は終了コード 1(異常終了)をOSに返します。Gitはこれを「エディタでエラーが発生した=コミットメッセージの入力が完了していない」と判断し、コミット処理を安全にキャンセルします。
ポイント
:cq は「コミットをキャンセルしたい場合」に使います。コミットメッセージを書いて正常に終了したい場合は :wq(保存して終了)を使ってください。
Vimを使わない設定に変更する方法
そもそもVimを起動させたくない場合は、GitのデフォルトエディタをVSCodeやnanoに変更できます。
# デフォルトエディタをVSCodeに変更する
git config --global core.editor "code --wait"
# デフォルトエディタをnano(シンプルなエディタ)に変更する
git config --global core.editor "nano"
# 設定を確認する
git config --global core.editor
# 出力:
code --wait
まとめ
- git commitでVimが起動するのは、
-mオプションなしで実行したため。GitがデフォルトエディタとしてVimを起動する - コミットをキャンセルするには、ノーマルモードで
:cqと入力してEnterを押す :cqは終了コード1をGitに返し、Gitがコミット処理を安全にキャンセルする仕組み
シリーズナビゲーション:脱・初学者サバイバルガイド


コメント