【Git入門】git pullの使い方!pullで最新ソースを取得しよう

git Git

git pullコマンドの使い方と、実際にpullを使用して、最新ソースを取得する例を載せています。
Gitの2.32.0バージョンを使用して、GitHubに接続して挙動を確かめてみました。

git pullの使い方

git pullコマンドを使用すると、gitリポジトリにある最新のソースコードを取得することができます。

動作としては、git fetchを行った後にgit mergeをしてくれるコマンドになります。
git fetchは最新の更新内容を取得するコマンドです。
git mergeは現在のブランチにソースコードをマージ(統合)してくれるコマンドになります。

git pullコマンドで最新の更新内容を取得して、一番最新の内容をマージしてくれるという感じで覚えておくと良いかと思います。
図に表すと、下記のような感じです。
git pullの概念解説図(pullする前)
git clone元のリモートリポジトリは「A, B, C」と3つコミットが進んでいます。
ローカルリポジトリはAのみの状態です。

この状態でgit pullコマンドを使用すると、下記のように「B, C」のプッシュされたコミットがローカルに取り込まれます。
git pullの概念解説図(pullした後)

もしも、リモートリポジトリとローカルで差分がある場合は、マージしてコミットする必要が出てきます。
ファイルの競合が起きていない場合はgitが自動的にマージしてくれます。

例えば、下記のようにGitのリモートリポジトリとローカルで、差分が出ている場合です。
「A, B, C」まではリモートとローカルどちらも同じで、それぞれ「D」と「E」という別々のコミットが作られています。

その後に、ローカルでgit pullコマンドを使用すると、下記のようにコミットをマージ(統合)してくれます。

pullを実際に使ってみる

実際にgit pullコマンドを実行して、動きを確認してみます。

最新のリポジトリを取得する

git pullコマンドを使用して、まだ1つしかコミットがない状態のローカルから、3つコミットされた状態のリモートリポジトリの最新の状態を取得してみます。
現在ローカルは、git logコマンドで確認すると、下記の状態です。

$ git log
commit 2e7f59cdb5b234a4b804e8424c5be0e3b2159a24 (HEAD -> main)
Author: yasuaki0206 <103511400+example@users.noreply.github.com>
Date:   Wed Apr 13 09:44:40 2022 +0900

    Initial commit

初回コミットしか表示されていません。
リモートリポジトリの最新の状態をGitHubで確認すると、下記の状態になっています。
GitHubのリポジトリから最新をpullする

コミットが3つ並んだ状態です。
最新のコミットまで取得するため、ローカルで下記のコマンドを実行します。

$ git pull origin main

git pullコマンドでoriginリポジトリのmainブランチの最新の内容を取得してきています。
実行すると、下記のように取得できます。

$ git pull origin main
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (6/6), done.
Unpacking objects: 100% (6/6), 596 bytes | 99.00 KiB/s, done.
remote: Total 6 (delta 1), reused 5 (delta 0), pack-reused 0
From github.com:yasuaki0206/test-repository
 * branch            main       -> FETCH_HEAD
 + 05fe7db...bad0092 main       -> origin/main  (forced update)
Updating 2e7f59c..bad0092
Fast-forward
 test.js | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 test.js

これで、最新の状態になりました。
git logコマンドを使用すると、下記のように3つのコミットが表示されて、GitHubの最新の状態と同じようになったことが確認できます。

$ git log
commit bad0092bbcfecf1a878ed502b458525736d97a68 (HEAD -> main, origin/main, origin/HEAD)
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Sat Apr 23 17:36:53 2022 +0900

    add console log

commit b206e144b6e69ef3c07278f0868dbedf33843539
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Tue Apr 19 16:52:38 2022 +0900

    add test.js

commit 2e7f59cdb5b234a4b804e8424c5be0e3b2159a24
Author: yasuaki0206 <103511400+example@users.noreply.github.comm>
Date:   Wed Apr 13 09:44:40 2022 +0900

    Initial commit

ローカルとリモートリポジトリの最新で差異がでたときは?

次はローカルとリモートリポジトリの最新で差異が出た場合です。

リモートリポジトリに1つコミットされて下記の状態になりました。
git pullでリモートリポジトリとローカルの差異

ローカルリポジトリにも1つファイルを追加して、コミットしました。
git logコマンドで確認すると、下記の状態です。

$ git log
commit 69049e816bc6f8fcb95e78af276965e68deb62d5 (HEAD -> main)
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Sat Apr 23 22:52:15 2022 +0900

    add main.js

commit bad0092bbcfecf1a878ed502b458525736d97a68
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Sat Apr 23 17:36:53 2022 +0900

    add console log

commit b206e144b6e69ef3c07278f0868dbedf33843539
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Tue Apr 19 16:52:38 2022 +0900

    add test.js

commit 2e7f59cdb5b234a4b804e8424c5be0e3b2159a24
Author: yasuaki0206 <103511400+emailexample@users.noreply.github.com>
Date:   Wed Apr 13 09:44:40 2022 +0900

    Initial commit

リモートリポジトリに存在しない、「add main.js」というコメントが入ったコミットができました。
リモートリポジトリの方にはローカルに存在しない「add loop output log」というコメントが入ったコミットがあります。

この状態でgit pullコマンドを使用してみます。

$ git pull origin main
From github.com:yasuaki0206/test-repository
 * branch            main       -> FETCH_HEAD
hint: Pulling without specifying how to reconcile divergent branches is
hint: discouraged. You can squelch this message by running one of the following
hint: commands sometime before your next pull:
hint: 
hint:   git config pull.rebase false  # merge (the default strategy)
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint: 
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
Press ENTER or type command to continue

そうすると、リモートリポジトリに更新があったので、マージするように促されてエディタが開きます。
「merge」というコミットコメントを追加して、マージしてみました。

マージした後にgit logで確認すると、下記のように内容がマージされていることが確認できました。

$ git log
commit aac7a53fe36606826d88146e0488c92db968aace (HEAD -> main)
Merge: 69049e8 a0e5dd5
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Sat Apr 23 22:54:59 2022 +0900

    merge

commit 69049e816bc6f8fcb95e78af276965e68deb62d5
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Sat Apr 23 22:52:15 2022 +0900

    add main.js

commit a0e5dd51ee2717013117514f060f38faf317d60b (origin/main, origin/HEAD)
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Sat Apr 23 22:48:57 2022 +0900

    add loop output log

commit bad0092bbcfecf1a878ed502b458525736d97a68
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Sat Apr 23 17:36:53 2022 +0900

    add console log

commit b206e144b6e69ef3c07278f0868dbedf33843539
Author: yasuaki0206 <emailexample@gmail.com>
Date:   Tue Apr 19 16:52:38 2022 +0900

    add test.js

commit 2e7f59cdb5b234a4b804e8424c5be0e3b2159a24
Author: yasuaki0206 <103511400+emailexample@users.noreply.github.com>
Date:   Wed Apr 13 09:44:40 2022 +0900

    Initial commit

「add main.js」のコメントがあるコミットの下に、「add loop output log」というコメントが入ったリモートリポジトリの内容がマージされました。
この状態でoriginのmainブランチの対してプッシュすると、ここで変更した内容が最新になりました。

ローカルにリモートリポジトリをマージしてプッシュ

終わりに

今回はgit pullコマンドについての使い方と、実際に使用してみた時の挙動についてみていきました。

実際使用していく際は、mainブランチにどんどんコミットをプッシュしていくのではなく、新しいブランチを作成してそれぞれ並行して開発した方が良いです。
mainブランチにどんどんコミットをプッシュしてくと、間違えた修正内容などをプッシュした場合に動かなくなるからです。
mainブランチは常に動作できる状態にしておいて、他のブランチで開発したものを動作確認した後に問題なければマージするようにしていくと良いかと思います。

コメント

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