「git pullしたらコンフリクトした…もう面倒だから全部リモートの内容にしたい」
「ローカルの変更は捨てていいから、とにかくリモートと同じ状態にしたい」
「git pull –forceって使えないの?」
Gitを使っていて、ローカルの変更を無視してリモートの内容で強制的に上書きしたい場面、ありますよね。
この記事では、git pullを強制的に実行してローカルを上書きする方法を、初心者の方にも分かりやすく解説していきます。
「git pull –force」は存在しない!

まず最初に、重要な事実をお伝えします。
よくある勘違い
多くの人が思っている:
# こんなコマンドがあればいいのに…
$ git pull --force # ← これは期待通りには動きません!
実は、git pull --forceというコマンドは存在しません
正しい方法は?
ローカルを強制的に上書きするには、複数のコマンドを組み合わせる必要があります。
基本的な流れ:
git fetch:リモートの最新情報を取得git reset --hard:ローカルを強制的にリセット
次のセクションから、具体的な方法を見ていきましょう。
基本的な強制pull方法
最もシンプルで一般的な方法です。
標準的な手順
コマンド:
# リモートの最新情報を取得
$ git fetch origin
# ローカルを強制的にリモートと同じ状態にする
$ git reset --hard origin/main
ブランチがmasterの場合:
$ git fetch origin
$ git reset --hard origin/master
コマンドの説明
git fetch origin
$ git fetch origin
- リモートの最新情報をダウンロード
- ローカルファイルはまだ変更しない
- 安全に情報収集だけ行う
git reset –hard origin/main
$ git reset --hard origin/main
- ローカルブランチをリモートと完全に一致させる
--hard:作業ディレクトリも強制的に上書き- コミットされていない変更は全て失われる
実行例
ステップ1:現在の状態を確認
$ git status
On branch main
Your branch and 'origin/main' have diverged,
and have 3 and 5 different commits each, respectively.
Changes not staged for commit:
modified: file1.txt
modified: file2.txt
ローカルとリモートが食い違っている状態です。
ステップ2:リモートの最新情報を取得
$ git fetch origin
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 10 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (10/10), done.
From https://github.com/user/repo
abc1234..def5678 main -> origin/main
ステップ3:ローカルを強制的にリモートに合わせる
$ git reset --hard origin/main
HEAD is now at def5678 Latest commit message
ステップ4:確認
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
完全に同期されました!
ワンライナーで実行
2つのコマンドを1行で実行することもできます:
$ git fetch origin && git reset --hard origin/main
&&:前のコマンドが成功したら次を実行
全リモートから取得する方法
複数のリモートがある場合の方法です。
コマンド
# 全てのリモートから最新情報を取得
$ git fetch --all
# ローカルを強制的にリモートに合わせる
$ git reset --hard origin/main
fetch –allとは?
通常のfetch:
$ git fetch origin
# origin というリモートだけ取得
fetch –all:
$ git fetch --all
# 設定されている全てのリモートから取得
複数のリモートがある場合に便利です:
origin(メインのリモート)upstream(フォーク元)backup(バックアップ用)など
実行例
# 全リモートから取得
$ git fetch --all
Fetching origin
Fetching upstream
remote: Counting objects: 15, done.
remote: Total 15 (delta 8), reused 0 (delta 0)
Unpacking objects: 100% (15/15), done.
# 強制リセット
$ git reset --hard origin/main
HEAD is now at abc1234 Update README
ローカル変更を保存する方法
変更を完全に捨てたくない場合の方法です。
git stashで一時保存
コマンド:
# ローカル変更を一時保存
$ git stash
# 強制pull
$ git fetch origin
$ git reset --hard origin/main
# 必要なら変更を戻す
$ git stash pop
stashの詳細
stashとは?
「隠し場所」「一時保管所」の意味。
ローカルの変更を一時的に退避させる機能です。
基本的な使い方:
# 保存
$ git stash
Saved working directory and index state WIP on main
# リストを確認
$ git stash list
stash@{0}: WIP on main: abc1234 Last commit
# 復元
$ git stash pop
実践例
シナリオ:作業途中だけど、リモートの最新を取り込みたい
# 現在の状態
$ git status
On branch main
Changes not staged for commit:
modified: feature.js
# 変更を一時保存
$ git stash save "作業途中のfeature実装"
Saved working directory and index state On main: 作業途中のfeature実装
# 状態確認
$ git status
On branch main
nothing to commit, working tree clean
# 強制pull
$ git fetch origin
$ git reset --hard origin/main
HEAD is now at def5678 Update feature
# 保存した変更を確認
$ git stash list
stash@{0}: On main: 作業途中のfeature実装
# 変更を戻す
$ git stash pop
Auto-merging feature.js
CONFLICT (content): Merge conflict in feature.js
コンフリクトした場合は手動で解決が必要です。
stashのオプション
未追跡ファイルも含める:
$ git stash --include-untracked
# または
$ git stash -u
全てのファイルを含める:
$ git stash --all
# または
$ git stash -a
メッセージ付きで保存:
$ git stash save "実装途中のログイン機能"
特定のstashを復元:
# リスト表示
$ git stash list
# 特定のstashを適用(削除しない)
$ git stash apply stash@{1}
# 特定のstashを適用(削除する)
$ git stash pop stash@{1}
バックアップブランチを作成する方法

より安全に、変更履歴も残したい場合の方法です。
基本的な手順
# 現在のブランチをバックアップ
$ git branch backup-branch
# 強制pull
$ git fetch origin
$ git reset --hard origin/main
これで、元の状態がbackup-branchに保存されます。
詳細な手順
ステップ1:バックアップブランチを作成
$ git branch backup-$(date +%Y%m%d)
# 日付付きで作成(例:backup-20241211)
ステップ2:バックアップを確認
$ git branch
backup-20241211
* main
ステップ3:変更をコミット(未コミットの場合)
$ git add .
$ git commit -m "バックアップ:強制pull前の状態"
ステップ4:元のブランチに戻る
$ git checkout main
ステップ5:強制pull
$ git fetch origin
$ git reset --hard origin/main
バックアップから復元
特定のファイルだけ復元:
$ git checkout backup-20241211 -- path/to/file.txt
特定のコミットだけ取り込む:
$ git cherry-pick abc1234
ブランチ全体を復元:
$ git reset --hard backup-20241211
未追跡ファイルも削除する
git reset --hardだけでは未追跡ファイルは残ります。
未追跡ファイルとは?
未追跡ファイル(Untracked files):
一度もgit addされていないファイルのこと。
例:
$ git status
On branch main
Untracked files:
temp.txt
debug.log
cache/
これらはgit reset --hardでは削除されません。
git cleanで削除
基本コマンド:
$ git clean -fd
オプションの意味:
-f:強制的に削除(force)-d:ディレクトリも削除
テスト実行(ドライラン)
実際に削除する前に、何が削除されるか確認できます:
# 何が削除されるか表示(実際には削除しない)
$ git clean -n -fd
Would remove temp.txt
Would remove debug.log
Would remove cache/
問題なければ、実際に実行:
$ git clean -fd
Removing temp.txt
Removing debug.log
Removing cache/
完全なクリーンアップ
リモートの内容で完全に上書き+未追跡ファイルも削除:
# リモートの最新を取得
$ git fetch origin
# ローカルを完全にリセット
$ git reset --hard origin/main
# 未追跡ファイルも削除
$ git clean -fd
さらに厳格に:
# .gitignoreで無視されているファイルも削除
$ git clean -fdx
# 全て削除(超危険!)
$ git clean -fdX # .gitignoreのファイルのみ
cleanのオプション一覧
| オプション | 説明 |
|---|---|
-n | ドライラン(テスト実行) |
-f | 強制実行(必須) |
-d | ディレクトリも削除 |
-x | .gitignoreのファイルも削除 |
-X | .gitignoreのファイルだけ削除 |
-i | 対話モード |
特定のブランチで強制pull
複数のブランチを管理している場合の方法です。
現在のブランチで実行
# 現在のブランチ名を自動取得
$ git fetch origin
$ git reset --hard origin/$(git branch --show-current)
$(git branch --show-current):現在のブランチ名
別のブランチに切り替えて実行
# developブランチに切り替え
$ git checkout develop
# 強制pull
$ git fetch origin
$ git reset --hard origin/develop
全ブランチを一気に更新
スクリプト例:
#!/bin/bash
# 全ブランチを最新に
for branch in $(git branch | sed 's/*//'); do
echo "Updating $branch..."
git checkout $branch
git fetch origin
git reset --hard origin/$branch
done
# mainブランチに戻る
git checkout main
保存して実行:
$ chmod +x update_all_branches.sh
$ ./update_all_branches.sh
サブモジュールがある場合
プロジェクトにサブモジュールが含まれる場合の対処法です。
サブモジュールも含めて更新
基本コマンド:
# メインリポジトリを更新
$ git fetch origin
$ git reset --hard origin/main
# サブモジュールを更新
$ git submodule update --init --recursive
サブモジュールも強制リセット
# メインを更新
$ git fetch origin
$ git reset --hard origin/main
# サブモジュールも強制リセット
$ git submodule foreach --recursive git fetch origin
$ git submodule foreach --recursive git reset --hard origin/HEAD
ワンライナーで実行
$ git fetch --recurse-submodules && \
git reset --hard origin/main && \
git submodule update --init --recursive --force
実際のユースケース
実際の開発でよく使うシナリオです。
ケース1:開発環境をリセット
シナリオ:
色々試していたら環境が壊れた。クリーンな状態に戻したい。
手順:
# 全ての変更を保存(念のため)
$ git stash --all
# 完全にリセット
$ git fetch origin
$ git reset --hard origin/main
$ git clean -fdx
# 依存関係を再インストール
$ npm install # または yarn install, pip install など
ケース2:コンフリクト解決を諦める
シナリオ:
マージでコンフリクトが複雑すぎる。最初からやり直したい。
手順:
# マージを中止
$ git merge --abort
# ローカルの変更をバックアップ
$ git stash
# 強制pull
$ git fetch origin
$ git reset --hard origin/main
# 必要なら変更を再適用
$ git stash pop
# コンフリクトを手動で解決
ケース3:間違ったコミットをした
シナリオ:
mainブランチに直接コミットしてしまった。リモートの状態に戻したい。
手順:
# 間違ったコミットをバックアップ
$ git branch backup-wrong-commits
# リモートの状態に戻す
$ git fetch origin
$ git reset --hard origin/main
# 必要なら、正しいブランチで作業再開
$ git checkout -b feature-branch
$ git cherry-pick <commit-hash>
ケース4:本番環境のデプロイ
シナリオ:
本番サーバーで確実にリモートと同じ状態にしたい。
手順:
# 本番ブランチに切り替え
$ git checkout production
# 念のためバックアップ
$ git branch backup-production-$(date +%Y%m%d-%H%M%S)
# 強制的に最新に
$ git fetch origin
$ git reset --hard origin/production
# 依存関係を更新
$ composer install --no-dev # 例:PHP
$ npm ci # 例:Node.js
# アプリケーションを再起動
$ sudo systemctl restart myapp
ケース5:他の人の作業環境を修正
シナリオ:
チームメンバーのPCが変な状態になった。リセットしたい。
手順:
# 現在の状態を確認
$ git status
$ git log --oneline -5
# 全てバックアップ
$ git stash --all
# クリーンな状態に
$ git fetch --all
$ git reset --hard origin/main
$ git clean -fd
# 動作確認
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
エイリアスで簡単にする
よく使うコマンドをエイリアスに登録しておくと便利です。
基本的なエイリアス
設定方法:
# 強制pullのエイリアス
$ git config --global alias.fpull '!git fetch origin && git reset --hard origin/$(git branch --show-current)'
使い方:
$ git fpull
便利なエイリアス集
完全リセット:
$ git config --global alias.hard-reset '!git fetch origin && git reset --hard origin/$(git branch --show-current) && git clean -fd'
使用例:
$ git hard-reset
バックアップ付き強制pull:
$ git config --global alias.safe-reset '!git branch backup-$(date +%Y%m%d-%H%M%S) && git fetch origin && git reset --hard origin/$(git branch --show-current)'
使用例:
$ git safe-reset
stash付き強制pull:
$ git config --global alias.stash-pull '!git stash && git fetch origin && git reset --hard origin/$(git branch --show-current) && git stash pop'
使用例:
$ git stash-pull
.gitconfigに直接記述
~/.gitconfigファイルに以下を追加:
[alias]
# 強制pull
fpull = !git fetch origin && git reset --hard origin/$(git branch --show-current)
# 完全リセット(clean付き)
hard-reset = !git fetch origin && git reset --hard origin/$(git branch --show-current) && git clean -fd
# バックアップ付き
safe-reset = !git branch backup-$(date +%Y%m%d-%H%M%S) && git fetch origin && git reset --hard origin/$(git branch --show-current)
# stash付き
stash-pull = !git stash && git fetch origin && git reset --hard origin/$(git branch --show-current) && git stash pop
# テスト実行
dry-reset = !git fetch origin && echo "Would reset to:" && git log HEAD..origin/$(git branch --show-current) --oneline
危険性と注意事項
強制pullは強力ですが、危険も伴います。
何が失われるか
git reset –hardで失われるもの:
- ✗ コミットされていない変更
- ✗ ステージングされた変更
- ✗ ローカル専用のコミット(プッシュしていないもの)
保持されるもの:
- ✓ リモートにプッシュ済みのコミット
- ✓ 他のブランチ
- ✓ stashに保存した変更
- ✓ バックアップブランチ
実行前のチェックリスト
☑️ ステップ1:何が失われるか確認
$ git status
$ git diff
☑️ ステップ2:ローカル専用コミットをチェック
$ git log origin/main..HEAD
何か表示されたら、それらは失われます。
☑️ ステップ3:重要なファイルがないか確認
$ git ls-files --others --exclude-standard
未追跡ファイルのリスト。
☑️ ステップ4:バックアップを作成
# 変更を保存
$ git stash --all
# または
$ git branch backup-$(date +%Y%m%d)
☑️ ステップ5:実行するブランチを確認
$ git branch
* main
develop
feature-branch
*が付いているブランチが対象になります。
取り返しがつかない操作
以下の操作は元に戻せません:
1. コミットされていない変更
$ git reset --hard
# → 保存していない変更は完全に消える
2. git cleanで削除したファイル
$ git clean -fd
# → 未追跡ファイルは完全に消える
3. 長期間経過したstash
$ git stash drop
# → stashから削除すると復元不可
reflogで復元できる場合も
git reset --hardを実行した直後なら、reflogで復元できることがあります:
# reflogを確認
$ git reflog
abc1234 HEAD@{0}: reset: moving to origin/main
def5678 HEAD@{1}: commit: My important changes
# 復元
$ git reset --hard def5678
ただし、reflogには限界があります:
- コミットされていない変更は復元不可
- デフォルトで90日後に削除される
チーム開発での注意点

チームで使う場合の配慮事項です。
共有ブランチでの使用
危険な例:
# mainブランチで強制リセット
$ git checkout main
$ git reset --hard origin/main
$ git push --force # ← これは絶対ダメ!
なぜダメ?
- 他のメンバーの作業に影響
- 履歴が書き換わる
- コンフリクトが発生
正しい使い方:
共有ブランチでの強制リセットは、自分のローカルだけに留めましょう。
# ローカルをリセット(OK)
$ git reset --hard origin/main
# リモートにはpushしない!
個人ブランチでの使用
安全な使い方:
# 自分専用のブランチで
$ git checkout my-feature-branch
$ git reset --hard origin/main
$ git push --force # 自分専用ならOK
個人ブランチなら、自由に強制リセット可能です。
チームへの周知
強制リセットを行った場合は、チームに報告しましょう:
Slackなどで通知例:
@team ローカル環境をリセットしました。
もし変な挙動があれば、以下を実行してください:
git fetch --all
git reset --hard origin/main
git clean -fd
よくある質問Q&A
Q:実行前にテストする方法は?
A:ドライランができます。
# 何が変更されるか確認
$ git fetch origin
$ git log HEAD..origin/main --oneline
# 何が削除されるか確認
$ git clean -n -fd
-nオプションで、実際には実行せずシミュレーションできます。
Q:間違えて実行してしまったら?
A:reflogで復元を試みます。
# 直前の状態を確認
$ git reflog
abc1234 HEAD@{0}: reset: moving to origin/main
def5678 HEAD@{1}: commit: Important work
# 復元
$ git reset --hard def5678
ただし、コミットされていない変更は復元できません。
Q:特定のファイルだけ強制的に上書きしたい
A:git checkoutを使います。
# リモートの最新を取得
$ git fetch origin
# 特定のファイルだけ上書き
$ git checkout origin/main -- path/to/file.txt
これで、そのファイルだけがリモートの内容で上書きされます。
Q:reset –hardとreset –softの違いは?
A:影響範囲が異なります。
–hard:
$ git reset --hard origin/main
- コミット履歴をリセット
- ステージングエリアもリセット
- 作業ディレクトリもリセット
- 全てが失われる
–soft:
$ git reset --soft origin/main
- コミット履歴だけリセット
- ステージングエリアは保持
- 作業ディレクトリも保持
–mixed(デフォルト):
$ git reset origin/main
- コミット履歴をリセット
- ステージングエリアもリセット
- 作業ディレクトリは保持
Q:プッシュしていないコミットも消えますか?
A:はい、消えます。
# ローカル専用コミットを確認
$ git log origin/main..HEAD
commit abc1234
Author: You
Date: Today
これは消える
# reset --hardを実行
$ git reset --hard origin/main
# → abc1234は失われる
対策:
バックアップブランチを作成しましょう。
$ git branch backup-before-reset
$ git reset --hard origin/main
Q:他のブランチには影響しますか?
A:いいえ、影響しません。
# mainブランチでリセット
$ git checkout main
$ git reset --hard origin/main
# 他のブランチは無傷
$ git checkout feature-branch
# → featureブランチの内容はそのまま
各ブランチは独立しています。
まとめ:安全に強制pullを使いこなそう
長い記事を読んでいただき、ありがとうございました!
この記事の重要ポイントをまとめます:
基本コマンド
# 標準的な方法
git fetch origin
git reset --hard origin/main
# 未追跡ファイルも削除
git clean -fd
安全な使い方
# stashで保存
git stash --all
git fetch origin
git reset --hard origin/main
# バックアップブランチ作成
git branch backup-$(date +%Y%m%d)
git reset --hard origin/main
重要な注意点
⚠️ git pull --forceは期待通りには動かない
⚠️ git reset --hardは取り返しがつかない
⚠️ 必ずバックアップを取る
⚠️ 共有ブランチでは使わない
⚠️ チームに影響がないか確認
実行前のチェックリスト
✅ ローカル変更の確認(git status)
✅ プッシュしていないコミットの確認(git log)
✅ バックアップの作成(git stashまたはgit branch)
✅ 正しいブランチにいるか確認(git branch)
よく使うシーン
✅ 開発環境のリセット
✅ コンフリクト解決を諦める時
✅ 間違ったコミットの取り消し
✅ 本番環境のデプロイ
強制pullは強力な機能ですが、正しく使えば開発効率を大幅に向上させることができます。
この記事を参考に、安全かつ効率的にGitを使いこなしてくださいね!

コメント