リモートから取得しよう(フェッチ編)
今回はリモート(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」を押して新規ファイルを作成していきます。
今回は「home.html」というファイルを作成します。
ファイルの中身は「<p>home</p>」と書いておきます。
「Commit directly to the main branch.」にチェックして、この内容で「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」コマンドを使います。
参考図書
独学で挫折しそうになったら、オンラインプログラミングスクール