Git強制pullでローカルを上書き|確実にリモートと同期する方法

git

「git pullしたらコンフリクトした…もう面倒だから全部リモートの内容にしたい」
「ローカルの変更は捨てていいから、とにかくリモートと同じ状態にしたい」
「git pull –forceって使えないの?」

Gitを使っていて、ローカルの変更を無視してリモートの内容で強制的に上書きしたい場面、ありますよね。

この記事では、git pullを強制的に実行してローカルを上書きする方法を、初心者の方にも分かりやすく解説していきます。

スポンサーリンク
  1. 「git pull –force」は存在しない!
    1. よくある勘違い
    2. 正しい方法は?
  2. 基本的な強制pull方法
    1. 標準的な手順
    2. コマンドの説明
    3. 実行例
    4. ワンライナーで実行
  3. 全リモートから取得する方法
    1. コマンド
    2. fetch –allとは?
    3. 実行例
  4. ローカル変更を保存する方法
    1. git stashで一時保存
    2. stashの詳細
    3. 実践例
    4. stashのオプション
  5. バックアップブランチを作成する方法
    1. 基本的な手順
    2. 詳細な手順
    3. バックアップから復元
  6. 未追跡ファイルも削除する
    1. 未追跡ファイルとは?
    2. git cleanで削除
    3. テスト実行(ドライラン)
    4. 完全なクリーンアップ
    5. cleanのオプション一覧
  7. 特定のブランチで強制pull
    1. 現在のブランチで実行
    2. 別のブランチに切り替えて実行
    3. 全ブランチを一気に更新
  8. サブモジュールがある場合
    1. サブモジュールも含めて更新
    2. サブモジュールも強制リセット
    3. ワンライナーで実行
  9. 実際のユースケース
    1. ケース1:開発環境をリセット
    2. ケース2:コンフリクト解決を諦める
    3. ケース3:間違ったコミットをした
    4. ケース4:本番環境のデプロイ
    5. ケース5:他の人の作業環境を修正
  10. エイリアスで簡単にする
    1. 基本的なエイリアス
    2. 便利なエイリアス集
    3. .gitconfigに直接記述
  11. 危険性と注意事項
    1. 何が失われるか
    2. 実行前のチェックリスト
    3. 取り返しがつかない操作
    4. reflogで復元できる場合も
  12. チーム開発での注意点
    1. 共有ブランチでの使用
    2. 個人ブランチでの使用
    3. チームへの周知
  13. よくある質問Q&A
    1. Q:実行前にテストする方法は?
    2. Q:間違えて実行してしまったら?
    3. Q:特定のファイルだけ強制的に上書きしたい
    4. Q:reset –hardとreset –softの違いは?
    5. Q:プッシュしていないコミットも消えますか?
    6. Q:他のブランチには影響しますか?
  14. まとめ:安全に強制pullを使いこなそう

「git pull –force」は存在しない!

まず最初に、重要な事実をお伝えします。

よくある勘違い

多くの人が思っている:

# こんなコマンドがあればいいのに…
$ git pull --force  # ← これは期待通りには動きません!

実は、git pull --forceというコマンドは存在しません

正しい方法は?

ローカルを強制的に上書きするには、複数のコマンドを組み合わせる必要があります。

基本的な流れ:

  1. git fetch:リモートの最新情報を取得
  2. 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を使いこなしてくださいね!

コメント

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