【入門編】Gitインデックスの秘密:git update-index –assume-unchangedと–skip-worktreeの決定的な違い – バージョン管理・CI/CD活用バイブル

こんにちは。現場で泥臭くコードを書き、CI/CDのパイプラインを最適化することに命を懸けているエンジニアです。

開発の現場で、こんなイライラを感じたことはありませんか?
「設定ファイル(`config.json`や`.env`など)をローカル環境用に書き換えたのに、`git status`を叩くたびに変更差分として表示されて邪魔だ!」

この「消えない差分」を隠そうとして、多くのエンジニアが沼にハマるポイントがあります。それが今回解説する `git update-index` の2つのオプション、`–assume-unchanged` と `–skip-worktree` です。

似たような挙動に見えて、その設計思想と「裏切られた時のダメージ」は天と地ほど違います。 今日は、このGitの深淵を一緒に覗いてみましょう。

—

なぜ「追跡」が邪魔になるのか?

プロジェクトには「テンプレート」と「ローカル設定」が混在することがあります。
リポジトリには `config.sample.json` を入れておき、ローカルで `config.json` にリネームして使う。このとき、Gitは「`config.json` が変更された!」と大騒ぎします。

これを黙らせるために安易に `.gitignore` を使うと、それは「今後一切、そのファイルを管理しない(新規ファイル扱い)」という宣言になってしまいます。今回紹介するコマンドは、「管理はしているけど、今は変更を無視してくれ」という、より高度な制御を行うためのものです。

—

1. `–assume-unchanged`:自分を偽る「嘘つき」の旗印

設計思想: 「このファイルは(今後も)変わらないはずだ。チェックするコストを省け」

  • 何をするか: Gitに対して「このファイルは変更されていない」と強引に思い込ませます。
  • 最大の悲劇: `git pull` を実行した際、もしリモートリポジトリ側でそのファイルが更新されていたら、Gitはそれを無視して、あなたのローカルの古いファイルを正として保持しようとします。
  • いつ使うべきか: コンパイル済みのバイナリや、絶対に変わらないことが保証されている巨大な設定ファイルなど、「パフォーマンスのためにGitのチェックをスキップしたい」という特殊なケースにのみ使います。

設定コマンド:

変更を無視する設定
git update-index –assume-unchanged path/to/config.json

無視を解除する設定
git update-index –no-assume-unchanged path/to/config.json

—

2. `–skip-worktree`:正当な「個人的カスタマイズ」の盾

設計思想: 「このファイルは管理対象だが、ローカルの変更は私のものだ。Gitの処理に巻き込むな」

  • 何をするか: 「このファイルの変更は、追跡対象外として扱ってくれ」とGitに伝えます。
  • 最大の利点: `–assume-unchanged` と違い、`git pull` でリモートの更新があった場合、きちんと追跡してくれます。 もし衝突(コンフリクト)が起きれば、Gitはあなたに警告を発します。
  • いつ使うべきか: まさに冒頭の例のような「ローカル専用の設定ファイル」を管理する時に最適です。

設定コマンド:

ローカル変更を追跡から除外する
git update-index –skip-worktree path/to/config.json

除外設定を解除する
git update-index –no-skip-worktree path/to/config.json

—

比較表:どっちを選ぶべき?

| 機能 | `–assume-unchanged` | `–skip-worktree` |
| :— | :— | :— |
| 主な用途 | パフォーマンス向上(基本不変) | ローカルのカスタマイズ除外 |
| git pull 後の挙動 | リモート更新を無視 | リモート更新を検知・警告 |
| 安全度 | 低い(更新を見落とす) | 高い(正しく追跡する) |

結論:迷ったら `–skip-worktree` を選んでください。 これが、現場でトラブルを避けるための鉄則です。

—

動作確認:自分の手で確かめる「HelloWorld」

実際に、今の挙動をターミナルで確認してみましょう。

1. サンプルファイル作成
echo “dev” > config.json
git add config.json
git commit -m “Add config”

2. ローカルで変更して、skip-worktreeを適用
echo “local_dev” > config.json
git update-index –skip-worktree config.json

3. statusを確認(ここがポイント!)
git status
=> “nothing to commit, working tree clean” と表示されるはずです!
変更したのに差分が出ない。これが魔法の正体です。

4. 後片付け
git update-index –no-skip-worktree config.json
git checkout config.json

—

先輩エンジニアからのアドバイス

「`–assume-unchanged` を使ってしまって、重要な設定変更が反映されずに数時間デバッグした」というのは、どの現場でも一度は通る新人エンジニアの洗礼です。

Gitは強力なツールですが、その分、内部的なインデックス操作は「取り扱い注意」です。もしチーム内で特定のファイルを全員がローカルで書き換えたい場合は、これらコマンドに頼るのではなく、`config.json.example` を用意し、`.gitignore` で実際の `config.json` を無視する運用に切り替えるのが、最も健全なチーム開発の姿ですよ。

これをマスターすれば、あなたのターミナルは驚くほど静かに、そして賢くなります。ぜひ、明日の開発から使いこなしてみてくださいね!

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