事を進めてゆくうちにファイルの追加や削除もあるかもしれないけれど、とりあえず今はプロジェクトに必要と思われるファイル一式はこれなんだ!と。2回目以降は「こんな機能追加したよ」とか「このバグ潰した」とか「リファクタリングしたよ」とか「typo...」とか、ひとつひとつの出来事単位でコミットしていけばいい。とある機能を追加したら三つぐらいファイルが更新されたとかね。追加機能のソースファイルが新たに発生して、メインコードのファイルが更新されて、該当機能に関する記述がマニュアルに書き加えられて。イベント単位でコミットするからみんな同時にファイルが更新されないと不整合が起きるんだ。そんな感じで履歴管理をするのがバージョン管理システム。リファクタリングとかtypoとかはファイル一本づつになるかもしれない。何かしらのミスがあって当該のコミットを取り消したら一気に元に戻るからね。キャンセルしたいリファクタリングは5本あるファイルのうちのひとつだけなんだ!なんて時、目も当てられない。以上を踏まえて、あらためてGitの運用方法をメモしておきます。ローカルで一人で使うのが、一番単純な運用。プロジェクトファイル群の保管場所を作るよ必要なファイルを置いておくディレクトリ内で最初の儀式をおこないます。/user/home/project/.git/これでプロジェクトを管理する場所ができました。そのディレクトリ内に設定ファイル群を収めた.gitディレクトリが作られたとか、そんなことは知らなくてもGitは使えます。initしたディレクトリ内に必要なファイルを放り込みます。何ならディレクトリを掘ったっていい。ファイルやディレクトリを置いただけではGitは自動認識してくれない。Gitに必要なファイルを知らせるにはaddコマンドを使う。[filename]ファイルはひとつづつaddしてもいいし、スペースで区切って複数一気にaddしてもいい。ワイルドカードも使える。ディレクトリ指定もできる。管理したいものはすべてaddだ。この作業をステージングなんて言うみたいだけど、そんなのはどうでもいい。コミットしよう対象ファイルが決まったらcommitだ。この時、イベントの内容をメモできる。メモしなくちゃいけない。commitコマンドの後に続く-mオプションが「メモするよ!」って意味。おめでとう!これがプロジェクト管理の始まりだ!あとはaddしてcommitの繰り返しさて、開発は細かい改善の繰り返し。うまく行ったり行かなかったり。Gitでバージョン管理をしていれば失敗してもすぐに元に戻せる。バージョン間の変更がすごく多岐に渡っていると何日分も後戻りしちゃうかもしれない。細かくcommitしていく。すると「あ、しくじった!」って時にすぐなかったことにできる。やってプロジェクトを進めていくんだ。プロジェクトに歴史ありこれ、実際に今作ってる最中のWebアプリ。ホントに細かすぎない?ってくらいコミットしてる。メイン画面高さ指定を1箇所に集約。...とまぁ、このようにコミットの歴史を見るのがlogコマンド。最初の行にあるcommitに続く文字列をチェックサムっていうんだけど、各コミット固有の番号と思っていればいい。続いてAuthorとDate、そしてコミット時につけたメモ。これらを頼りに「あの日に戻りたい...」とか当たりをつける。こんな感じで開発を続けていると「あ、失敗した!」って思う時が来る。さっきのlogコマンドほど詳細な情報が要らないときは–onelineオプションだ。commit頭の7桁は先ほどのハッシュ。メモさえ表示されていればどのコミットかを特定できる。特定できるようにメモするべき。3番目のコミット27d82d7に対する4番目のコミット70da21fが「あの時に戻る」ってやつ。機能追加したのだけれどちょっとうまくできなかったのでrevertコマンドで2番目のコミットa747d10に戻している。27d82d74b38e1ddc2eb013942d5688f21d78e1dbここではハッシュ値をフルに指定しているけど–onelineオプションで表示される7桁分だけで問題なく特定できる。revertって「元に戻す」って意味。元には戻すけど直前のコミットをなかったことにするわけじゃない。27d82d7の履歴は残ってる。70sa21fとa747d10は全く同じ内容。失敗した変更内容の全てがダメなわけじゃないからメモ的に残しておけるのも便利だし、チームで開発しているときなんか、履歴を完全に消してしまうと各人の間で不整合が生じてしまうので履歴としては残しておくのが正解らしい。ステージングに失敗したら。コミットの取り消しは前述の通り。コミット前にaddするファイルを間違えたら?そんな時はresetコマンド。[filename]addしたファイルを個別に取り消す時はファイル名を指定する。全取り消しならresetだけでいい。このコマンドはあくまでaddのキャンセルだけなので、ファイルそのものに加えた変更は残ってる。addした後に編集の内容を少し直したいとか、二つに分けるべきコミットなので一部のコミットを後回しにするとかいう時に使う。HEADとかは今は気にしなくていい。resetには他にも色々オプションがあるけれどaddの取り消しはこれだけ知っていればいい。編集をなかったことにするさて、まだaddもしていない状態。ファイルの編集をしたけれど途中で気が変わったんだかなんだか、とにかくこれまでの編集内容をなかったことにしたければcheckoutコマンド。[filename]これで指定したファイルに対する編集内容は全て取り消されて最後にコミットした状態に戻る。全てのファイルを元に戻したければファイル名の指定の代わりに.(ピリオド)を指定すればいい。addしてたっけ?今ファイルを編集しただけなのかaddしていたのか。そもそもadd対象になる編集済みのファイルはどれだっけ?なんて時はstatusコマンド。track)こんな感じでadd対象となる編集済みまたは新規作成ファイルや、ここにはないけれどadd済みのファイルリストが表示される。変更内容を知りたい先ほど出てきたrevertコマンドでも使ったハッシュ値。これを使うと各コミット間の差分を表示できる。使うのはdiffコマンド。"<ul>";このように、比較したいコミット同士ハッシュ値を指定すると差分を表示してくれる。それぞれのコミットは隣り合ったものでもいいし、数コミット離れたもの同士でもいい。ハッシュ値を省略すると、指定したハッシュ値と最新のコミットとの比較になる。Gitはバイナリファイルも管理できるけれど、テキストファイルならこんな風に差分を取ることができるので変更内容がよくわかる。これぞGitによるバージョン管理の醍醐味!というわけで長くなってしまったけれど、Gitの基本的な使い方をあらためてまとめてみました。