git pullの概要|git pullコマンドが実行する2つのコマンド

git pullの概要|git pullコマンドが実行する2つのコマンド

git pull


git pullとはリモートリポジトリの内容をローカルリポジトリに反映するコマンドのことです。コマンドを実行する時は

と記載します。git pullについて概要を説明すると、このような説明になります。

しかし、この記事ではgit pullについての概要についての説明に留まらず、リポジトリについての説明、git pullコマンドが実行される時に実行する2つのコマンドであるgit fetchコマンドとgit mergeコマンドについて説明します。

さらには実運用のためにgit pullコマンド実行後に使うコマンドや実例についてまで説明し、開発者の方が実務に役立てるようになることを目論んだ内容の記事を書きます。

リポジトリとは

リポジトリには、リモートリポジトリとローカルリポジトリの2種類のリポジトリが存在します。リモートリポジトリとローカルリポジトリがどのようなリポジトリなのかを説明します。

リモートリポジトリとは

リモートリポジトリとはサーバ上のリポジトリであり、共用のリポジトリです。各ローカルユーザーの変更内容が、リモートリポジトリで管理されます。

ローカルリポジトリとは

ローカルリモートリポジトリとはローカルで各ユーザーが作業するリポジトリのことです。各ローカルユーザーは、ローカルリポジトリでの変更内容をリモートリポジトリに反映し、リモートリポジトリより他のユーザーの変更内容をローカルリポジトリに取得します。

ローカルリモートリポジトリはリモート追跡ブランチとローカルブランチより構成されます。リモート追跡ブランチとローカルブランチについては後述します。

git pullコマンドが実行する2つのコマンド

git pullコマンドはそれ自体に留まらず、git pullコマンドが実行される時に実行する2つのコマンドを理解しておくと、理解が正確です。

git pullコマンドが実行される時に実行する2つのコマンドであるgit fetchコマンドとgit mergeコマンドについて説明します。

git fetchコマンドとは

git fetchコマンドとは、git pullコマンドが実行される時に実行されるコマンドの1つで、リモートリポジトリの内容をローカルリポジトリのリモート追跡ブランチに反映するコマンドのことです。

リモート追跡ブランチとは、ローカルリポジトリで各ローカルユーザーが作業するブランチではなく、リモートリポジトリの内容のコピーを持つブランチのことです。

git mergeコマンドとは

git mergeコマンドとは、git fetchコマンドでリモートリポジトリの内容をリモート追跡ブランチに反映した内容を、ローカルブランチに反映するコマンドのことです。

ローカルブランチとは、ローカルリポジトリで各ローカルユーザーが作業するブランチです。各ローカルユーザーは、git mergeコマンドでローカルブランチに反映された内容に対して作業します。

git pullコマンド実行後に使うコマンド

gitを参照目的だけに使用するのであれば、リモートリポジトリの内容をローカルリポジトリに反映する操作のみを理解しておけば良いですが、開発者の方はローカルリポジトリの内容にソースを追加したり、削除したり、更新することがあると思います。

そのため、git pullコマンド実行後に使うコマンドである、git addコマンド、git rmコマンド、git commitコマンド、git pushコマンドについて説明します。

git addコマンドとは

git addコマンドとは、ローカルリポジトリでソースファイルを新規作成した時等に、ソースファイルをインデックスに追加するコマンドのことです。インデックスに追加されたファイルはローカルリポジトリに登録されるわけではないので注意が必要です。

インデックスに追加されたファイルをローカルリポジトリに登録するには、後述するgit commitコマンドを実行する必要があります。

エクスプローラー上でファイルを新規作成すれば、エクスプローラーにおいてはファイルが追加されますが、gitにおいてファイルが追加されたことを示すためにはgit addコマンドを実行する必要があります。

git rmコマンドとは

git rmコマンドとは、ローカルリポジトリでソースファイルを削除した時等に、ファイル削除したことをローカルリポジトリに反映するコマンドです。

エクスプローラー上でファイルを削除すれば、エクスプローラーにおいてはファイルが削除されますが、gitにおいてファイルが削除されたことを示すためにはgit rmコマンドを実行する必要があります。

git commitコマンドとは

git commitコマンドとは、各ローカルユーザーがローカルで作業した内容をローカルリポジトリに反映するコマンドです。

前述したgit addコマンドでインデックスに追加されたファイルもgit commitコマンド実行により、ローカルリポジトリに反映されます。git commitコマンドを実行した段階では、リモートリポジトリは更新されません。

git pushコマンドとは

git pushコマンドとは、ローカルリポジトリの内容をリモートリポジトリに反映するコマンドです。実運用ではgit commitコマンドを実行した後に、git pushコマンドを実行する流れとなります。

実例を通して考える

実例として、リモートリポジトリA、ローカルリポジトリB、ローカルリポジトリCが存在するとし、ローカルリポジトリBでは機能1及び機能2の開発が行われ、ローカルリポジトリCでは機能3及び機能4の開発が行われるとします。

ローカルリポジトリBのユーザーは、ローカルリポジトリBで機能1及び機能2に対して新規作成したファイルをgit addしたり、変更した内容をgit comiit→git pushしリモートリポジトリに反映したりします。

ローカルリポジトリCのユーザーは、ローカルリポジトリBのユーザーがgit pushした内容を、git pullしてリモートリポジトリの内容をローカルリポジトリCに反映することにより、機能1及び機能2の内容をローカルリポジトリCに取り込めます。

また、機能3及び機能4についても同様に考えられます。ローカルリポジトリCのユーザーは、ローカルリポジトリCで機能3及び機能4に対して新規作成したファイルをgit addしたり、変更した内容をgit comiit→git pushしたりします。

不要なファイルがローカルリポジトリCに存在した場合は、git rmコマンドを用いることもあります。

ローカルリポジトリBのユーザーは、ローカルリポジトリCのユーザーがgit pushした内容を、git pullしてリモートリポジトリの内容をローカルリポジトリBに反映することにより、機能3及び機能4の内容をローカルリポジトリBに取り込めます。

実例を通して応用的な問題について考える

前段落で述べた例で、ローカルリポジトリBのユーザーが機能5のファイルA内のAAAというファンクションに変更を加え、同時にローカルリポジトリCのユーザーが機能5のファイルA内のAAAというファンクションに変更を加えていたとします。

ローカルリポジトリBのユーザーが機能5のファイルAに加えた内容をリモートリポジトリAに反映した後に、ローカルリポジトリCのユーザーがファイルAをリモートリポジトリAに反映しようとするとコンフリクトという変更内容の競合現象が生じます。

コンフリクトが生じると、ローカルリポジトリCのユーザーは変更内容をリモートリポジトリAに反映できません。

ローカルリポジトリCのユーザーは、どのようにオペレーションすれば競合現象が防げたかについて記載します。

まず、ローカルリポジトリBのユーザーがリモートリポジトリAに反映した内容をgit pullし、ローカルリポジトリCに反映させた後に、機能5のファイルA内のAAAというファンクションに変更を加えると、変更内容の競合現象が防げたと言えます。

git pull記事総括

記事の内容について理解して頂けましたでしょうか?gitを操作していると何か操作に詰まることもあると思いますが、この記事は開発者の方が実務に役立てるようになることを目論んだ内容となっていますので、操作に詰まった時はもう一度この記事を読んで頂けると何かヒントが見つかるかもしれません。

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。