Gitで強制プル(force pull)を実行する方法|fetchとresetの使い方を解説
Gitでは、マージ操作によって上書きされてしまう未コミットの変更や未追跡ファイルがローカルに存在する場合、リモートからファイルをプルすることができません。そんなときに役立つのが「強制プル(force pull)」です。この方法を使えば、Gitに強制的に変更を取得させることができます。
本記事では、具体例を挙げながら、Gitリポジトリの内容を強制的にプルする方法を解説します。git pullコマンドやgit fetchコマンドの使い方、resetオプションを使った強制プルの手順についても詳しく見ていきましょう。
プルとは何か?
Gitのプル操作とは、リモートリポジトリからすべてのメタデータとファイルをダウンロードし、取得したデータをもとにローカルリポジトリを更新することです。
プルは、ローカルのファイルをリモートリポジトリのバージョンと一致させるための手段です。他の人がリモートリポジトリに行った変更をダウンロードしたい場合は、リポジトリをプルする必要があります。なお、プルは自動的に実行されるものではありません。
ただし、プルによって上書きされてしまう未追跡ファイルがある場合、プルは実行できません。これは、ローカルブランチにまだGitリポジトリへ追加されていないファイルが存在し、プルを実行するとそのファイルが置き換えられてしまうことを意味します。
同様に、プルによって上書きされてしまう未コミットの変更がローカルにある場合も、リポジトリをプルすることはできません。
Gitで強制プルを実行する手順
ここでは、Webプロジェクトのコードを含む「ck-git」というリポジトリを例に説明します。共同作業者が「README.md」というファイルを更新しましたが、私たちも同じファイルをローカルで編集しており、まだ変更をリポジトリにプッシュしていない状況です。
この状態でプルを試みると、どうなるか見てみましょう。
git pull
このコマンドを実行すると、次のようなエラーが返されます。
error: Your local changes to the following files would be overwritten by merge: README.md
Please, commit your changes or stash them before you can merge.
選択肢は3つあります。変更をコミットする、スタッシュ(stash)して一時退避させる、あるいはGitに強制的にプルさせてファイルを上書きする、のいずれかです。
強制プルを行うには、まずリモートの変更をフェッチ(fetch)し、その後リポジトリをリセットしてその変更を反映させます。まずはgit fetchコマンドで変更を取得しましょう。
git fetch --all
このコマンドにより、リモートリポジトリに対して行われた変更に関するメタデータがすべて取得されます。次に、現在のブランチをバックアップします。これは、コードが上書きされた際に作業を失わないようにするための重要なステップです。
ブランチのバックアップにはgit branchコマンドを使用します。
git branch backup
このコマンドで「backup」という新しいブランチが作成されます。バックアップブランチの準備ができたら、リポジトリをリセットして、リモートリポジトリの内容を反映させましょう。
リポジトリの更新にはgit resetコマンドを使用します。
git reset --hard origin/master
--hardオプションを付けると、リモートリポジトリからすべてのファイルがダウンロードされ、プロジェクトのローカル作業コピーに反映されます。これにより、自分が加えた変更はすべて上書きされる点に注意してください。
origin/masterという記述は、取得対象のブランチを指しています。この例では、「origin」という名前のリモートリポジトリから「master」ブランチの内容をダウンロードしています。
ブランチ名やリモート名が異なるリポジトリで作業している場合は、次の形式を参考にresetコマンドを使ってください。
git reset --hard <remote>/<branch>
git resetコマンドにより、リポジトリはフェッチした最新のコミットの状態にリセットされます。
未コミットの変更を保存する方法
コミットしていない変更を一時的に保存したい場合は、git stashコマンドが便利です。このコマンドを使うと、コードを「スタッシュ(退避)」しておき、後で取り出すことができます。それでは、実際にコードのスタッシュを作成してみましょう。
git stash
これで、リポジトリに加えたすべての変更がスタッシュに保存されます。後で再度それらの変更を扱いたいときは、スタッシュを「pop」して復元します。
git stash pop
git stashによる変更の保存についてさらに詳しく知りたい方は、git stashのチュートリアル記事もあわせてご覧ください。
まとめ
Gitリポジトリでは、リモートから強制的に内容をプルすることが可能です。そのためには、まずリポジトリの内容をフェッチし、その後、コードベースで使用したいリモートブランチの状態へ変更をリセットします。
これで、プロのようにGitの強制プル操作を実行するための知識が身につきました!
-
GitとGitHubの使い方入門:初心者向けステップバイステップガイド
GitHubは現在、世界最大のオープンソースプロジェクトホスティングサービスです。Atomテキストエディタ、GoogleのTensorFlow、Facebook(現Meta)のReactなど、有名なプロジェクトが多数公開されています。ビッグデータ、人工知能(AI)、IoTといった先進的な分野のプロジェクトで特に知られていますが、アニメーション、絵文字、ゲーム、シンプルなソフトウェアなども見つけることができます。仕組みは「トレント」にやや似ていますが、扱う対象がソフトウェアやアプリである点が異なります。 GitHubを使い始めたばかりの方にとって、学習曲線はかなり急に感じられるかもしれません。
-
【Git】「fatal: 'origin' does not appear to be a git repository」エラーの原因と解決方法
「fatal: origin does not appear to be a git repository」エラーとは Gitは、ソフトウェア開発時にソースコードへの変更を追跡するために使用される分散型バージョン管理システムです。また、GitHubはGitを利用したバージョン管理のためのオンラインホスティングサービスであり、どちらも開発現場で広く活用されています。しかし近年、Macのターミナルで「git」コマンドを実行しようとした際に、「fatal: origin does not appear to be a git repository(致命的:originがGitリポジトリではないようで