未来エンジニア養成所Blog

プログラミングを皆に楽しんでもらうための情報をお届けします。

【Git&GitHub】リモートから取得(フェッチ編)(git fetchコマンド)

title


リモートから取得しよう(フェッチ編)

今回はリモート(GitHub)から情報を取得するやり方について解説します。

今回はフェッチについてです。


リモートから情報を取得するのには2種類のやり方があります。

フェッチとプルです。

プルについては次回で解説します。


フェッチのコマンドは

$ git fetch <リモート名>

です。

具体的には

$ git fetch origin

というように入力します。


フェッチというのはどういうことかというと、「取ってくる」という意味になります。


ではイメージで押さえておきましょう。


フェッチ


「git fetch」を使うとリモートリポジトリからローカルリポジトリに情報を落としてきます。

ここで注意して欲しいのは「git fetch」ではローカルリポジトリに情報を取得してくるだけで、ワークツリーにはその情報が反映されないと言う事です。


では、ローカルリポジトリのどこに保存されているのでしょうか。


「git fetch」をすると「remotes/リモート名/ブランチ名」というリモートブランチと呼ばれているところに保存されます。

このブランチというのは別の回で改めて解説をします。

今回はローカルリポジトリの中でもリモート専用の場所に情報を取得してきていると押さえておいてください。


ローカルリポジトリに取得した内容を、自分の手元のワークツリーにも反映させたい場合にはどうすれば良いかというと、「git merge」というコマンドを使ってリモートの情報を自分のワークツリーの方にマージ(統合)させていきます。

この「git merge」に関してもブランチの回で解説します。


実際にやってみよう

では実際に作業をしてみましょう。


まずはGitHubを開きます。

「Repositories」から「git_tutorial」を選びます。


今回はリモートリポジトリの内容を取ってくるために、まずリモートリポジトリの情報を更新しておきます。

普段開発している時は複数人で開発しているので、リモートリポジトリの内容を更新する時は、別の人のブランチからプッシュがあってGitHubの情報を更新することが基本的なやり方です。

今回は一人でやっているので、リモートリポジトリの情報を更新するためにGitHub上で直接ファイルの編集をしてしまいます。


「git_tutorial」から「Create new file」を押して新規ファイルを作成していきます。


Create new file


今回は「home.html」というファイルを作成します。

ファイルの中身は「<p>home</p>」と書いておきます。


ファイル作成


「Commit directly to the main branch.」にチェックして、この内容で「Commit new file」でコミットします。


Commit new file


これで新しいファイルが作成されて、それがコミットされました。


ではターミナルに移動して「git fetch」で情報を取得してみましょう。


「git_tutorial」を開いたら、「git fetch origin」と入力します。

$ git fetch origin
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 689 bytes | 137.00 KiB/s, done.
From github.com:piketa/git_tutorial
   61073d5..bd0605c  main       -> origin/main


これで情報が取得できました。


実際に先ほどGitHubの情報がどこに保存されているのかというと、「git branch -a」と入力します。「-a」というのはAllの略になります。

「git branch」の全部の情報を表示すると言うことです。

$ git branch -a
* main
  remotes/bak/main
  remotes/origin/main


すると、今いるブランチには「*」が付いています。

今は「main」ブランチにいるので、そこに「*」が付いています。

それとは別に「remotes」というブランチが2つできています。

今情報を取得してきたのは「origin」の方ですので、「remotes/origin/main」の方に先ほどの変更が反映されています。


実際にそのファイルの中身を確認してみます。

「git checkout remotes/origin/main」と入力します。

これは「remotes/origin/main」へ自分のワークツリーの内容を切り替えるということをしています。

$ git checkout remotes/origin/main
Note: switching to 'remotes/origin/main'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at bd0605c Create home.html


ワークツリーの情報がどうなっているかというと、「ls」で確認すると「home.html」というのが追加されています。

$ ls
home.html   index.html  secret.txt


この「home.html」の中身は「cat home.html」で確認します。

これでファイルの中身が出力されます。

$ cat home.html
<p>home</p>


すると「<p>home</p>」というのが記載されている事がわかります。

このように「git fetch」コマンドをすると、「remotes」というリモートブランチへ情報が格納されてそこへ情報を取得する事ができました。


では、元の状態に戻します。


「git checkout main」と入力します。

$ git checkout main
Previous HEAD position was bd0605c Create home.html
Switched to branch 'main'
Your branch is up to date with 'bak/main'.


これでも元のワークツリーの状態へ戻ります。


「ls」で確認しておきます。

$ ls
index.html  secret.txt


このように「home.html」がなく、元々の情報に戻っています。


最後に取得してきたリモートリポジトリの情報をワークツリーへ取り込んでみましょう。

「git merge origin/main」と入力します。

これで「origin」リポジトリの「main」ブランチの情報を自分のワークツリーにマージするという意味になります。

$ git merge origin/main
Updating 61073d5..bd0605c
Fast-forward
 home.html | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 home.html


これでリモートの情報をマージすることができました。

「ls」で確認しておきます。

$ ls
home.html   index.html  secret.txt


「home.html」がワークツリーに反映されていることが確認できました。


このようにフェッチを使った場合、まず「git fetch」でローカルリポジトリに情報を取得してきて、その情報をワークツリーに反映させたい場合は「git merge」コマンドを使います。


参考図書



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work