git commitでVimが開いたときにコミットをキャンセルして安全に終了する方法【:cq解説】

Git

git commit を -m オプションなしで実行すると、突然Vimというテキストエディタが起動して画面が変わります。操作方法がわからず固まってしまい、「コミット自体を中止してやり直したい」と思っている方は多いはずです。この記事では、コミットをキャンセルしてVimを安全に終了する :cq コマンドを解説します。

この記事でわかること

  • なぜ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 を使います。以下の手順で実行してください。

  1. ノーマルモードであることを確認する

    Vimが起動直後はノーマルモードです。Esc キーを一度押すと確実にノーマルモードに戻れます。画面下部に INSERTREPLACE の表示がなければノーマルモードです。

  2. :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がコミット処理を安全にキャンセルする仕組み

関連記事

コメント

タイトルとURLをコピーしました