Git Force Pull
このチュートリアルでは、Git でリモートリポジトリから変更を強制的にプルする方法について学習します。
場合によっては、ローカルの変更を破棄して、共同開発環境のリモートリポジトリからの更新に置き換える必要があります。
git pull コマンドを使用して、リモートリポジトリからローカルリポジトリのローカルブランチに変更をフェッチします。
git pull コマンドは、ローカルブランチでの変更がリモートリポジトリでの変更の背後にある場合にのみ成功します。
ローカルブランチとリモートリポジトリの変更が分岐していて、ローカルの変更を破棄したい場合は、ローカルの変更を上書きするために強制的に git pull を実行する必要があります。
これを例を挙げて詳しく説明します。
git fetch、git reset、git merge を使用して、Git のリモート変更を強制的にプルする
git pull コマンドは単一の操作ではありません。git pull コマンドはコマンド viz を実行します。git fetch を使用してリモートリポジトリからデータをフェッチし、次にコマンド git merge を使用してそれらの変更をローカルリポジトリにマージします。
したがって、git pull コマンドは、次の 2つのコマンドを実行します。
$ git fetch
$ git merge origin/$CURRENT_BRANCH
git fetch コマンドは、リモートリポジトリから最新の変更をダウンロードします。ローカルリポジトリの merge または rebase は行いません。
上記の git merge コマンドは、ローカルリポジトリのローカルブランチにまだ存在していない、$CURRENT_BRANCH に追加されたエイリアス origin によって指定されたリモートリポジトリからの変更をマージします。
したがって、ローカルリポジトリのローカルブランチがリモートリポジトリのブランチから分岐している場合、git pull は失敗します。
ローカルブランチの作業ツリー内のファイルにローカルな変更を加えた可能性があります。したがって、これにより git pull が失敗します。
リモートリポジトリの変更を優先して、ローカルの変更を破棄することを決定する場合があります。
したがって、ローカルの変更を上書きする変更を強制的にプルする必要があります。
リモート変更を強力にプルするには、次のようにする必要があります。
$ git fetch
$ git reset --hard HEAD
$ git merge origin/$CURRENT_BRANCH
--hard オプションを指定した git reset コマンドは、ブランチをフェッチしたものにリセットします。また、追跡されたファイルへのローカルな変更はすべて破棄され、追跡されていないファイルは削除されます。
したがって、ローカルの変更は失われるため、これは注意して使用してください。
または、変更をプルする前にローカルの変更を保存することもできます。変更をプルするとともに、git stash を使用して変更を隠しておくことができます。
次のようにできます。
$ git fetch
$ git stash
$ git merge origin/$CURRENT_BRANCH
$ git stash pop
したがって、git stash を使用する場合、ローカルリポジトリのローカルブランチの git reset を実行する必要はありません。
git stash pop を使用して、stash からローカルの変更を取得しました。