light log

学んだこととか

Gitの基本コマンドを勉強した

はじめに

昔に本を買ってほんの少しだけコマンドラインで試して、それから放置してた。

入門git

入門git

さらに最近はローカルでのaddやcommitにもGitHub for Macを使ったりしていて、GUI操作でお手軽にやっていた。

でも、GUI(GitHub for Mac)は確かにdiffとかは超見やすくていいんだけど、ちょっとした作業のためにわざわざターミナルを離れて専用のアプリを立ち上げたり切り替えたりするのも面倒になってきた。他の作業は基本的にCLIとエディタで完結してるので尚更。

ということで、この際ちゃんとCLIも勉強することにした。

勉強した内容

今日は基礎。addとcommit。

本をちょろっと読んだときには、作業ツリーとインデックスとリポジトリの区別がいまいちついていなかった。昔subversionを使っていたときにはなかった概念だ。この区別がついてないと、自ずとaddの意味がよくわからないことになる。

実際わかってなくて、addは新規ファイルをリポジトリに追加するものだと思ってた。でも、新規ファイルをaddしたあとにコミットする必要もあるわけで、じゃあ初めのaddはなんだったんだ?と思ってた。

未解決のまま問題を放置するのよくない。反省。

で、今日読み直してちょっと操作してみたら理解できた(たぶん)ので、まとめておく。

作業ツリー/インデックス/リポジトリの概念

まず、作業ツリーというのは単純で、バージョン管理しているプロジェクトのルートディレクトリ以下のこと。「作業ツリーへの変更」とかは普通に「プロジェクトのファイル(ディレクトリ)への変更」と読み替えて問題ない。

次にリポジトリは、バージョンを管理しているところ。これは多分subversionなどの集中型のバージョン管理システムと大きな意味では違わないと思う。

で、最後にインデックスだけど、これはステージングエリアとも呼ばれると上の本に書いてある。

ステージングエリアは、コミットする変更(新規追加も含む)を、調整する場所だという。

つまり、作業ツリーの変更をすべてそのままリポジトリに反映するわけではなくて、コミットしたい変更をいったんステージングエリアに乗せた上でコミットを行うことができる。本では「コミットを練り上げることができる」と表現されている。

この調整は、ファイル単位ではなく、修正単位に行うことができる。つまり、同じファイル内でもこの修正はコミットするけど、あの修正はコミットしない、ということができる。

普段の作業の多くの場面ではステージングエリアにいったん上げてからコミットする、というのは二度手間になるかもしれない。

でも、コミットする変更をこうして微調整できることによって、変更した内容が明快でアトミックな、良いコミットがしやすくなっているんだと思う。

コマンド

上の概念的なことがわかれば、コマンドを使うのは難しくない。し、細かい使い方はそこらじゅうに書いてあるのでここには書かない。概念についての自分の理解をまとめられてすっきりした。

簡単にまとめると、

  • addで作業ツリーの変更をステージングエリアへ追加し、
  • commitでステージングエリアの内容をリポジトリにコミットする
  • commit -a は、addとcommitをまとめたようなもので、変更をすべてコミットする
  • resetを使うと、ステージングエリアの変更を、ステージングされていない状態に戻すことができる

まとめ

subversionとかと違って、個人的なプロジェクトの管理を手元で始めるだけなら特になんの用意もいらなくてgit initするだけという手軽さだし、どの操作もとても手軽で速くて小気味良い。この素早さとか操作の小気味良さっていうのは、ターミナルでの作業との相性がいいと思う。

今日は基礎だけだけど、少しずつできることを増やしていきたい。