先に要点
- `git pull` の前にローカル変更があると、上書きを避けるために Git が止めることがあります。
- まずは `git status` で、何が未ステージなのか、何がステージ済みなのか、未追跡ファイルがあるのかを確認するのが先です。
- 対処は `commit する`、git stash で一時退避する、git restore で戻す、の3択で考えると整理しやすいです。
- `何となく reset --hard` はかなり危ないです。残したい変更があるなら、まず退避か commit を先にした方が安全です。
Git を使っていると、pull したいのに unstaged changes があると言われて進めない という場面はかなりよくあります。
初心者のうちはエラーメッセージだけ見ると焦りやすいですが、実際には いまあるローカル変更をどう扱うか決めてください と言われているだけです。
この記事では、2026年4月4日時点で Git 公式ドキュメントの git status、git stash、git restore、git pull、reset, restore and revert を確認しながら、Git で unstaged changes があって pull できないときの対処法を整理します。
Push や Pull Request まで含めて GitHub 上の自動化へつなげたいなら、GitHub Actionsとは?できること・最初の使い方を初心者向けに解説 もあわせて読むとつながりやすいです。
まず何が起きているのか
典型的には、git pull したときに
- local changes would be overwritten
- please commit your changes or stash them
のような意味のメッセージが出ます。
これは Git が意地悪をしているわけではなく、いまのローカル変更を勝手に上書きしないために止めている だけです。
Git 公式の git stash のドキュメントでも、ローカル変更が upstream 側とぶつかると git pull は上書きを拒否する、と説明されています。
つまり、最初に考えるべきことは pull をどう通すか ではなく、いまの変更を残したいのか、いったん避けたいのか、捨てたいのか です。
最初にやることは git status
最初にやることはかなり単純で、git status です。
git status
Git 公式の git status ドキュメントでも、HEAD と index、working tree の差分を表示すると説明されています。
初心者向けに言い換えると、いま何が変わっていて、どこまで保存済みなのかを確認するコマンド です。
ここで見たいのは次の3つです。
- 未ステージの変更だけなのか
- ステージ済みの変更もあるのか
- 未追跡ファイルがあるのか
この切り分けができると、対処法はかなり選びやすくなります。
対処法はこの3つで考えると整理しやすい
1. 残したいなら commit する
変更がもうまとまっていて、履歴として残してよいなら、いちばん素直なのは commit してから pull するやり方です。
git add .
git commit -m "WIP: pull前の退避"
git pull --rebase
WIP commit は本番ブランチにそのまま残したくないこともありますが、少なくとも内容を消さずに先へ進めます。
あとで履歴を整えられるなら、この方法が一番分かりやすいことも多いです。
ただし、雑に git add . すると未追跡ファイルまでまとめて入ることがあります。
実務では git add -p やファイル指定で、どこまで入れるかを少し慎重に見た方が安全です。
2. まだ commit したくないなら git stash
変更は残したいけれど、まだ commit は切りたくない。
このときに出番になるのが git stash です。
git stash push -u -m "pull前に一時退避"
git pull --rebase
git stash pop
Git 公式ドキュメントでは、git stash は working directory と index の状態を退避して、作業ツリーをきれいに戻すためのコマンドと説明されています。
また、dirty tree に pull できないときは stash して pull してから戻す という例も載っています。
ここでの実務上のポイントはこれです。
-mでメッセージを付ける- 未追跡ファイルも避けたいなら
-uを使う popは衝突することがあるので、戻したあとに status を必ず見る
一時退避としては便利ですが、stash は安心の永久保管ではない ので、長く放置しない方がよいです。
3. 変更を捨ててよいなら git restore
その変更が不要で、元に戻してよいなら git restore を使うのが今の Git ではかなり分かりやすいです。
1ファイルだけ戻すならこうです。
git restore app/Http/Controllers/UserController.php
全部の未ステージ変更を戻すならこうです。
git restore .
Git 公式ドキュメントでは、git restore は working tree のファイルを戻すコマンドで、--staged を付けると index 側も戻せると説明されています。
初心者向けには、ファイル内容を前の状態へ戻すためのコマンド と考えると入りやすいです。
ただし、この方法は消してよい変更だけ に使うべきです。
迷いがあるなら、先に stash した方が安全です。
ステージ済みの変更が混ざっているときはどうするか
未ステージだけでなく、すでに git add 済みの変更が混ざっていることもあります。
その場合は、まず status を見て切り分けます。
ステージだけ外したいなら、
git restore --staged path/to/file
ステージも working tree も両方戻したいなら、
git restore --staged --worktree path/to/file
のように使い分けます。
ここで git reset でも似たことはできますが、Git 公式の reset, restore and revert の説明でも、git restore は working tree や index の内容を戻す文脈で使うコマンドとして整理されています。
初心者なら、ファイルを戻す話は restore で考えた方が混乱しにくいです。
pull --rebase を使うときの考え方
git pull には取り込み方がいくつかあります。
Git 公式の git pull ドキュメントでは、--rebase、--no-rebase、--ff-only、--squash などの動きが整理されています。
実務でよくあるのは、
git pull --rebase
です。
これは履歴を直線的にしやすいので、チームによってはかなりよく使われます。
ただし、unstaged changes が残ったままなら rebase でも詰まる ので、先に clean な状態へしておく必要があります。
また、rebase 中は ours と theirs の見え方が merge と逆転して見えやすいので、そこも初心者がつまずきやすいポイントです。
実務で迷いにくい判断表
| 状況 | おすすめの対処 | 理由 |
|---|---|---|
| 変更を履歴に残してよい | commit してから pull | いちばん素直で、消えにくい |
| 変更は残したいが commit は早い | git stash | 一時退避して作業ツリーをきれいにできる |
| 変更を捨ててよい | git restore | 今の変更を戻して先へ進める |
| 一部だけステージを外したい | git restore `--staged` | index 側だけ戻せる |
| 履歴を線形に保ちたい | 退避後に `git pull --rebase` | rebase 前提の運用と相性がよい |
よくある失敗
何が消えるのか確認しないまま `git reset --hard` や `git clean -fd` を打ってしまうことです。急いでいるときほどやりがちですが、あとで戻せずかなりつらくなります。
ほかにもこの失敗は多いです。
git statusを見ずにコマンドを打つ- stash を大量に積んで、どれが何だか分からなくなる
stash pop後の merge conflict を軽く見て作業を進める- 未追跡ファイルが原因なのに tracked 変更だけを見ている
commit したくないと残したくないを混同する
実際のやり方をざっくり言うと
迷ったときは、まずこの順にすると安全です。
git status
git stash push -u -m "pull前に退避"
git pull --rebase
git stash pop
git status
もちろん、変更をそのまま commit してよいなら commit の方が素直です。
でも 今はまだ途中 という場面では、この流れがかなり現実的です。
まとめ
Git で unstaged changes があって pull できないときは、まず git status で状況を切り分けるのが先です。
そのうえで、残したいなら commit、まだ commit したくないなら <a href="/glossary/git-stash">git stash</a>、捨ててよいなら <a href="/glossary/git-restore">git restore</a> と考えると整理しやすいです。
特に大事なのは、焦って強いコマンドを打たないことです。
何を残したいのか を先に決めるだけで、かなり事故りにくくなります。
参考情報
- Git Docs: git-status
- Git Docs: git-stash
- Git Docs: git-restore
- Git Docs: git-pull
- Git Docs: Reset, restore and revert