【Git】git addとgit fetchを今更ながら理解した


エンジニアになる前の学習ではGitHub Desktopを使っていた。
そして、エンジニアになってからはSourceTreeに世話になっている。

gitコマンド及びgit概念についてなんとなくでここまで来ていたが、
Udemyのセールで購入した教材が非常に勉強になり、特に表題のコマンドについて、
これまで完全に間違った理解をしていた。

git add

ローカルのワークツリーでファイル変更した後は、
ローカルリポジトリにcommit、リモートリポジトリにpushするんでしょ、と言う理解だった。

ファイル変更後
→ commit
→ push

でも実際はステージと言う段階があって、
ワークツリーからステージへaddして、ステージからリポジトリにcommitされるのが正解だった。これが始めからGUIを使っていると抜け落ちる。

ファイル変更後
→ add
→ commit
→ push

ファイル変更後にaddすると、addしたファイルを圧縮したものが.git/objects以下に保存される。これだけではなく、圧縮ファイルと元ファイルの紐付けの為にファイルの構造と名前を保持するインデックスが.git/indexと言うバイナリファイルで管理されている。

この辺のデータ構造も理解すると、この後のcommitからpushまでの流れも理解しやすかった。

git fetch

リモートブランチをローカルブランチに引っ張って来るんでしょって理解だったが、これでは不十分だ。

よく、pushの反対はpullではなくfetchだ、と言われるのだけど、
これで勉強するまでmergeについての理解もあやふやだったと知り悲しくなった。

そもそもpullはfetchしてmergeするもの。
mergeはブランチをくっつけるイメージだったけど、取り込むと言う方が正しい。

で、fetchはリモートリポジトリから最新をローカルリポジトリに持ってくるもの。
またfetchしてきたorigin/masterとmasterは別であり、fetchしてきたリモートブランチの内容を反映するにはmergeしないといけないと言う話。

なんでもかんでもpullが危険と言うのは、masterにいる時にmergeしたくないブランチをpullしちゃったりとかそう言う事なのだけど、これは確かにコマンドラインでは起こり得るのかなと思う。(SourceTreeとか使ってたらまず起こらないと思うけど)