複数のファイルを並行して編集しているとき、いま確定できる1ファイルだけをコミットしたい場面はよくあります。この記事では、安全に1ファイルだけをコミットする方法をまとめます。いつもはなるべく細かくコミットするようにしてるので、たまにこういうシチュエーションになると「どうやるんだっけ・・・」ってなるので、個人的にメモしておくっていう話でもあります_( _´ω`)_ペショ
次の3ファイルに変更があるものの、まずは config.js の変更だけをコミットしたい・・・こんなケースを想定してみます。
config.js(設定の修正:コミットしたい)app.js(機能開発中:まだコミットしたくない)style.css(デザイン調整中:まだコミットしたくない)git status出力例
On branch main
Changes not staged for commit:
modified: config.js
modified: app.js
modified: style.css
no changes added to commitgit add config.jsgit status出力例
On branch main
Changes to be committed:
modified: config.js
Changes not staged for commit:
modified: app.js
modified: style.cssgit commit -m "config.jsの設定を更新"git status出力例
On branch main
Changes not staged for commit:
modified: app.js
modified: style.css
no changes added to commit上記ではステージされた config.js だけがコミットされ、他のファイルの進行中の変更はそのまま残ります。
git add config.js utils.js
git commit -m "設定ファイルとユーティリティを更新"同じファイルの変更をハンク単位で選びたいときはパッチモードが便利です。
git add -p config.js対話例
diff --git a/config.js b/config.js
@@ -10,7 +10,7 @@
const config = {
- apiUrl: 'http://localhost:3000',
+ apiUrl: 'https://api.example.com',
timeout: 5000
}
Stage this hunk [y,n,q,a,d,s,e,?]?主な選択肢
y:このハンクをステージn:このハンクをスキップq:終了a:このファイルの残りのハンクをすべてステージd:このファイルの残りのハンクをすべてスキップs:ハンクをさらに分割e:ハンク内容を手動編集してステージ?:ヘルプ表示補足:
git commit -pでもコミット直前にハンク選択ができます。
git restore --staged config.js
# すべてのステージを取り消す
git restore --staged .従来はgit resetを使っていましたが、現状ではgit restore --stagedを使います。
なお、作業ツリーの変更自体を捨てたい場合は、git restore config.js(ステージではなくファイル内容を巻き戻す)を使います。オプション--stagedがないと変更自体がなくなってしまうので注意。
git add src/
git commit -m "srcディレクトリの変更を反映"# 1) 変更の確認
git status
# 例: config.js, app.js, style.css, README.md が変更
# 2) 設定関連だけをコミット
git add config.js
git commit -m "feat: API URLを本番環境に変更"
# 3) ドキュメント更新をコミット
git add README.md
git commit -m "docs: インストール手順を更新"
# 4) 残りの変更を確認(まだコミットしない)
git status
# 出力: app.js, style.css が変更メッセージの feat: / docs: は Conventional Commits の形式。チーム開発で可読性が上がります。
# ステージ前(作業ツリー↔インデックス)
git diff config.js
# ステージ済み(インデックス↔HEAD)
git diff --staged config.js # --cached と同義
# 作業ツリーの全変更(ステージ・未ステージをまとめて)
git diff HEAD config.js# ステージ済みファイルの一覧
git diff --staged --name-only
# ステージ済みの詳細差分
git diff --staged
# コンパクトな状況表示
git status -s # --short と同義
git status -v # ステージ済みの差分行も表示git add -iファイル選択やパッチ選択を対話式でまとめて処理できます。
他ファイルの未ステージ変更を一時退避して、対象ファイルだけをコミットしたいとき。
# 未ステージの変更だけを退避(インデックスは保持)
git stash --keep-index
# 退避した変更を戻す
git stash pop「ほぼ全部をステージしたいが、この2ファイルだけ除外したい」場合は、除外マジックを使えます。
# 例: カレント配下のほぼ全てを追加しつつ、2ファイルを除外
git add . ':(exclude)app.js' ':(exclude)style.css'うっかり追加を防ぐため、慣れるまでは 明示的にファイル名を列挙 する方が安全です。
git add . は原則使わない
変更多数の場面では、意図しないファイルまでステージされがち。
→ 必要なファイルだけを列挙するか、パッチモードで選びましょう。
コミットメッセージは具体的に
「何を、なぜ」変更したか(背景や影響範囲)を残す。
Conventional Commits(feat:, fix:, docs:…)も有効。
関連する変更はまとめる
1コミット=1論理単位。レビューと履歴追跡が楽になります。
こまめに差分を確認
git status / git diff / git diff --staged をループさせて、意図通りのステージになっているかをチェック。
ステージ取り消しは git restore --staged が推奨
旧コマンドの git reset <path> でも同じ効果ですが、最新Gitの意図(作業ツリーとインデックス操作の分離)に沿うのは restore 系です。
git add -p / git commit -p が強力。git restore --staged がわかりやすく安全。