タイトル: ローカルリポジトリの変更をコミット
SEOタイトル: git commit 完全ガイド
| この記事の要点 |
|
基本コマンド
# ステージ済の変更をコミット
git add file.txt
git commit -m "Add feature X"
# 追跡中ファイルの変更を一括 add + commit
git commit -am "Update README"
# 複数行メッセージ(エディタが開く)
git commit
# メッセージをファイルから
git commit -F message.txt
# 空コミット(CI トリガー用など)
git commit --allow-empty -m "trigger CI"
コミットメッセージのエディタ設定
# エディタ変更
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim" # vim
git config --global core.editor "nano" # nano
# メッセージテンプレート(チームで統一する場合)
git config --global commit.template ~/.gitmessage
主なオプション
| オプション | 動作 |
|---|---|
-m "msg" | メッセージ指定 |
-am "msg" | 追跡中ファイルの add + commit |
--amend | 直前コミットを修正 |
--no-edit | amend 時にメッセージを変えない |
-S | GPG 署名 |
--allow-empty | 空コミット許可 |
--no-verify | pre-commit / commit-msg hook をスキップ(要注意) |
--author="名 | 著者を明示 |
--date="..." | 日時を明示 |
-v | エディタに diff も表示 |
--amend: 直前コミットの修正
「typo」「ファイル add 漏れ」を直前コミットに混ぜたい場合の必須機能。ただしpush 済のコミットを amend すると履歴改変になるので原則 push 前のみ。
# メッセージ変更
git commit --amend -m "fix: typo in README"
# add 漏れを追加(メッセージは変えない)
git add forgotten.txt
git commit --amend --no-edit
# 共有ブランチで amend してしまった場合
git push --force-with-lease origin feature/login
HEAD とは
HEAD は「現在のチェックアウト位置」を指す参照です。通常はカレントブランチの先端コミットを指します。
# HEAD の中身確認
cat .git/HEAD
# ref: refs/heads/main
# HEAD~1 1つ前のコミット
# HEAD~2 2つ前
# HEAD^ 1つ前(同じ)
# HEAD^^ 2つ前
# HEAD のコミット情報
git log -1 HEAD
git show HEAD
# 1つ前のコミット内容
git show HEAD~1
Conventional Commits 規約
業界標準のコミットメッセージ規約。type(scope): subject 形式で書きます。conventionalcommits.org。
feat(login): add Google OAuth ← 新機能
fix(auth): handle expired token ← バグ修正
docs(readme): add install steps ← ドキュメント
style(home): format with prettier ← 整形(動作変化なし)
refactor(api): extract validator ← リファクタリング
perf(query): add index ← パフォーマンス改善
test(login): add unit test ← テスト
build(deps): bump axios to 1.6 ← ビルド / 依存
ci(github): cache node_modules ← CI 設定
chore(repo): update .gitignore ← 雑務
revert: feat(login): add OAuth ← 取り消し
# Breaking Change(メジャーバージョン上昇)
feat(api)!: change response shape
BREAKING CHANGE: response.user is now response.data.user
この規約を採用すると semantic-release や standard-version で自動 CHANGELOG 生成・自動バージョニング・自動 tagが可能になります。
GPG 署名(-S)
GitHub に "Verified" バッジを付けてなりすまし防止します。OSS や企業のリポジトリで推奨。
# GPG 鍵生成
gpg --full-generate-key
# 鍵 ID 確認
gpg --list-secret-keys --keyid-format=long
# Git に登録
git config --global user.signingkey YOUR_KEY_ID
git config --global commit.gpgsign true
# 公開鍵を GitHub に登録
gpg --armor --export YOUR_KEY_ID
# → GitHub Settings → SSH and GPG keys に貼り付け
# 署名付きコミット
git commit -S -m "feat: add feature"
# SSH 鍵で署名も可能(Git 2.34+)
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
過去コミットの編集(rebase -i)
複数のコミットをまとめて整理したい場合。push 前のローカル履歴限定で使うのが安全です。
# 直近 5 コミットを対話的に編集
git rebase -i HEAD~5
# エディタが開く:
# pick abc123 feat: add login
# pick def456 fix: typo
# pick ghi789 wip
#
# 操作:
# p / pick そのまま
# r / reword メッセージ変更
# e / edit コミット内容変更
# s / squash 前のコミットに合体(メッセージも統合)
# f / fixup 前のコミットに合体(メッセージは前のを採用)
# d / drop 破棄
# x / exec シェルコマンド実行
--no-verify の使いどころと注意
pre-commit hook をスキップします。lint や test が走って遅い時に誘惑されますが、原則使わないべきです。CI で必ず弾かれます。
# 緊急時のみ
git commit --no-verify -m "WIP: emergency fix"
# 推奨: 重い hook を pre-push に移す
# .husky/pre-commit には軽い lint だけ、
# .husky/pre-push に重い test を置く
IDE 統合
- VS Code: Source Control パネル、メッセージ入力 → Ctrl+Enter でコミット
- JetBrains IDE: Commit ツールウィンドウ、変更分の diff を見ながらコミット
- GitHub Desktop: 視覚的、Conventional Commits 風のテンプレ表示
- Magit (Emacs) / Fugitive (Vim): CLI 派にも人気のリッチな統合
FAQ
Q: 著者名 (user.name / user.email) を間違えたままコミットしてしまった
A: 設定を直し、直近なら git commit --amend --reset-author --no-edit。複数なら git rebase -i で個別に。
Q: コミットを取り消したい
A: 履歴は残して取り消す git revert / 履歴ごと消す git reset --hard HEAD~1(破壊的)。共有ブランチでは revert 一択。
Q: コミットメッセージの良い書き方
A: 件名は 50 字以内・動詞で始める、空行、本文で「なぜ」を書く。Conventional Commits を採用するとレビューも CHANGELOG 生成も楽になります。