【Git】git fetchしたデータはどこにある？fetchによるデータ取得と取得後のコミット履歴を確認する方法

`git fetch`の処理が何をしているかについて。

`git fetch`を実行したら、何かしらがダウンロードされたのに、git logしても何も変更されていない、、取得したデータはどこにあるんだ！？となったので、データのありかや、確認方法について確認してみた。

##目次

1. [git fetchとは？](#git-fetchとは)
2. [引数・オプションなしの場合](#引数オプションなしの場合)
3. [git fetchの実例](#git-fetchの実例)
4. [git fetchで取得してきたデータを確認する方法](#git-fetchで取得してきたデータを確認する方法)
    5. [コミット履歴の確認](#コミット履歴の確認)
    6. [ファイルの差分を確認](#ファイルの差分を確認)
6. [リモートレポジトリとブランチを指定する](#リモートレポジトリとブランチを指定する)
7. [git fetch --allとは？](#git-fetch---allとは)


##git fetchとは？
`git fetch`とは、**他のレポジトリから情報を取得**するコマンド。

通常はgithubのリモートレポジトリからコミットを取得してくる目的で使う。

git pullだと、リモートレポジトリからコミットの情報を取得して、差分があればマージまでしてしまうが、git fetchは情報の取得までで止まる。


https://git-scm.com/docs/git-fetch


###引数・オプションなしの場合
単に`git fetch`を実行した場合は、リモートレポジトリoriginの現在のブランチのデータを取得し更新する。

```
$ git fetch 
```

 ↓　同じ

```:masterブランチの場合
$ git fetch origin
```

ローカル側で**更新されるのは`remotes/origin/master`ブランチ**（リモート追跡ブランチと呼ぶ）。

リモート追跡ブランチの一覧は`git branch -a`で確認できる。


<br>
**▼注意点**
現在のブランチや、コマンドを実行したブランチの情報が更新されるわけではない。ローカルのリモート追跡ブランチのログが更新される。



###git fetchの実例
git fetchをすると登録してある、originで追跡しているすべてのレポジトリの内容を確認して、差分を取得してくる。

submoduleがある場合は、submoduleの情報も更新する。

```
$ git fetch

remote: Enumerating objects: 107, done.
remote: Counting objects: 100% (107/107), done.
remote: Compressing objects: 100% (52/52), done.
remote: Total 108 (delta 70), reused 84 (delta 53), pack-reused 1
Receiving objects: 100% (108/108), 30.28 KiB | 6.05 MiB/s, done.
Resolving deltas: 100% (70/70), completed with 19 local objects.
From github.com:test/app
   27c38b55..9c3de210  master     -> origin/master
   ea99240d..1108db61  aaa     -> origin/aaa
   d1f87062..27c38b55  bbb     -> origin/bbb
   4cad4e31..3c14bc6a  ccc      -> origin/ccc
Fetching submodule app-sub
From github.com:test/app
   a9e55dd..7975898  master     -> origin/master
 + fd77a0d...5213eea xxx      -> origin/xxx  (forced update)
```


##git fetchで取得してきたデータを確認する方法
###コミット履歴の確認
git fetchで更新されるのはリモート追跡ブランチ（origin/ブランチ）。このブランチのログを表示すればいい。

```
$ git log origin/ブランチ名 
```

`--oneline`や`--graph`をつけると見やすくなる。


**▼実例**

```
$ git log origin/master --oneline --graph

*   9c3de210 (origin/master) Merge branch 'master' of github.test/app
|\  
| *   d44f7bb3 Merge pull request #1144 from aaa
| |\  
| | * d31b7483 (origin/aaa) [F]CSV download category 
| |/  
| *   9d164354 (origin/xxx) Merge pull request #114
| |\  
```



<br>
###ファイルの差分を確認
現在のブランチとの差分を確認する場合は、

```
$ git diff origin/branch名
```



<br>
##リモートレポジトリとブランチを指定する
取得したいブランチを指定することもできる。

・`git fetch <リモートレポジトリ名> <ブランチ名>`

**※レポジトリとブランチ名の間にスラッシュは入らない**

```
$ git fetch origin master
From github.com:test/app
 * branch              master     -> FETCH_HEAD
```

<br>
**▼スラッシュがあるとエラーになる**

```:エラー
$ git fetch origin/master
fatal: 'origin/master' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

`origin/master`というレポジトリを探すため、そんなのはないとエラーが出る。




##git fetch --allとは？
`--all`オプションを使うとすべてのリモートレポジトリのすべてのブランチからデータを取得してくる。

リモートレポジトリがoriginしか登録されていない場合は、`git fetch`（git fetch origin）と同じになる。


```
//originしかない
$ git remote
origin


//originのデータを取得
$ git fetch --all
Fetching origin
```