---
slug: "git-skip-worktree-guide"
title: "Git skip-worktree で追跡ファイルの変更を無視する方法"
description: "Git の `skip-worktree` フラグを使って、特定のローカル変更を `git status` から隠す方法。`.gitignore` で除外できないトラックされたファイルの一時的な差分管理に便利。"
url: "https://www.ytyng.com/blog/git-skip-worktree-guide"
publish_date: "2026-01-09T03:02:43.095Z"
created: "2026-01-09T03:02:43.097Z"
updated: "2026-05-11T13:21:25.611Z"
categories: []
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20260109/7e68b4d5edc04dc1bb9e11699a7dd180.png.webp?width=768"
has_video: true
has_music: true
video_urls: ["https://media.ytyng.net/ytyng-blog/328/featured-video-1.mp4", "https://media.ytyng.net/ytyng-blog/328/featured-video-2.mp4", "https://media.ytyng.net/ytyng-blog/328/featured-video-3.mp4"]
music_urls: ["https://media.ytyng.net/ytyng-blog/328/featured-music-328-1.mp3", "https://media.ytyng.net/ytyng-blog/328/featured-music-328-2.mp3"]
lang: "ja"
---

# Git skip-worktree で追跡ファイルの変更を無視する方法

## TL;DR

既にコミット済みのファイルの変更を無視したい場合は `git update-index --skip-worktree` を使う。`.gitignore` や `.git/info/exclude` は未追跡ファイルにしか効かない。

## 問題: `.git/info/exclude` では追跡ファイルの変更を無視できない

プロジェクトごとにローカル環境だけでファイルを無視したい時、`.git/info/exclude` を使えばいいと思うかもしれない。しかしこれには落とし穴がある。

**`.git/info/exclude` も `.gitignore` も、未追跡のファイルをignoreするためのもの。既にコミット済み（追跡されている）ファイルには効果がない。**

つまり、既にリポジトリに含まれている設定ファイルをローカルでカスタマイズして、その変更を無視したい場合には使えない。

## 解決策: `--skip-worktree` を使う

既に追跡されているファイルのローカルでの変更を無視するには、`git update-index --skip-worktree` を使う:

```bash
# ローカルの変更を無視する
git update-index --skip-worktree path/to/file

# 元に戻す
git update-index --no-skip-worktree path/to/file
```

### `--skip-worktree` とは

これは「このファイルはローカルで変更するけど、その変更は追跡しない」という設定。設定ファイルのローカルカスタマイズなど、意図的に変更を無視したい場合に使う。

### よくある使用例

- 開発環境の設定ファイル（`config/local.py`, `.env.local` など）のカスタマイズ
- IDEの設定ファイルの個人向け調整
- ローカル専用のデバッグ用設定

## 設定されているファイルの一覧を確認する

```bash
# --skip-worktree が設定されているファイルの一覧
git ls-files -v | grep '^S'

# パス名だけ欲しい場合
git ls-files -v | grep '^S' | cut -c 3-
```

### `git ls-files -v` の出力の意味

- `S` = skip-worktree が設定されている
- `H` = 通常の追跡ファイル
- `h` = assume-unchanged が設定されている

### エイリアスを作っておくと便利

```bash
git config --global alias.skipped "ls-files -v | grep '^S'"

# 使う時
git skipped
```

## `--skip-worktree` vs `--assume-unchanged`

Git には似たようなオプションとして `--assume-unchanged` もあるが、用途が異なる:

| オプション | 用途 | 安定性 |
|-----------|------|--------|
| `--skip-worktree` | 意図的に変更を無視する | 安定（ユーザーが明示的に解除しない限り維持） |
| `--assume-unchanged` | パフォーマンス最適化 | 不安定（Git操作で勝手にリセットされることがある） |

**推奨:** ローカルの変更を意図的に無視したい場合は `--skip-worktree` を使う方が確実。

## 注意点

### リモートの更新とのコンフリクト

リモートで同じファイルが更新されて `git pull` しようとするとコンフリクトする可能性がある。その場合は:

```bash
# 一旦 skip-worktree を解除
git update-index --no-skip-worktree path/to/file

# ローカルの変更を退避
git stash

# リモートから取得
git pull

# 必要に応じて変更を戻す
git stash pop

# 再度 skip-worktree を設定
git update-index --skip-worktree path/to/file
```

### チーム開発での注意

`--skip-worktree` はローカル設定なので、チーム全体で無視したいファイルには `.gitignore` を使うべき。

## まとめ

- **未追跡ファイル**を無視: `.gitignore` または `.git/info/exclude`
- **追跡ファイルの変更**を無視: `git update-index --skip-worktree`
- 設定の確認: `git ls-files -v | grep '^S'`

ローカル環境固有の設定変更を気にせず開発できるようになる、地味だけど便利なテクニックだ。
