

`$ git checkout`した時の挙動について私の見解が合っているかご教示ください。

以前に編集したAブランチを、別の人が編集し、さらに再び私が編集することになったのですが、

[code]

    $ git fetch
    $ git checkout A-brunch
    
[/code]

とした時に、  
「あれ？マージしてないのになんかローカルに反映されてる？？」  
と混乱したので調べて自分が行き着いた見解です。

## 見解

  1. ブランチとはコミットの連なりではなく、最新のコミットを示しているもの。
  2. まず`fetch`をしているのでリモートの最新状況を表すものがローカルに存在している。
  3. 2のあとで`checkout`しているので最新のAブランチ、つまり最新のコミットに切り替わった。
  4. Aブランチが最新なので、HEADもそこにあるし、ローカルも最新になっている。

以上が調べて出した答えだったのですが、これで合っているでしょうか？  
そしてもしこれが正解であれば、gitはcheckoutするときに追跡ブランチの中もみて  
整合性を保って最新コミットに移動してくれるということでしょうか？  
よろしくお願いいたします。


CC BY-SA 4.0
2020-03-24T05:57:43.883
64069
2020-03-24T23:55:17.090
2020-03-24T06:07:47.957
3060
38340
question
git
git checkout の挙動について。


> ブランチとはコミットの連なりではなく、最新のコミットを示しているもの。

認識のとおりです。公式ではポインタという表現をしています。  
[Git-ブランチ機能-ブランチとは](https://git-
scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%81%AF)

> まずfetchをしているのでリモートの最新状況を表すものがローカルに存在している。

こちらも認識の通りローカルにリモートの状態を保持する、  
リモート追跡ブランチというものが存在します。  
[Git-ブランチ機能-リモートブランチ](https://git-
scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81)

> 2のあとでcheckoutしているので最新のAブランチ、つまり最新のコミットに切り替わった。  
>  Aブランチが最新なので、HEADもそこにあるし、ローカルも最新になっている。

最新のコミットに切り替わるのは`$ git checkout branch`のコマンドに隠れたショートカットがあります。  
通常はそのブランチに切り替えるだけの機能なのですが。

もし、ローカルにその名前のブランチが存在せず、リモート追跡ブランチに同じ名前のブランチが存在している場合、

[code]

    $ git checkout -b branch --track origin/branch
    
[/code]

のショートカット機能が発動します。  
そのため、質問者さんが確認されているように、すでにリモートに存在するコミットのHEADであるブランチが作られることになります。

参考  
[Git-git-checkout](https://git-scm.com/docs/git-checkout)

ぜひ公式のサイト（英語も含んじゃいますが）を確認しつつ学んでみてください。


CC BY-SA 4.0
2020-03-24T06:33:26.193
64070
2020-03-24T23:55:17.090
2020-03-24T23:55:17.090
22665
22665
64069
answer