入門Git (Chapter1〜4)

今の職場がバリバリgitなことや、githubをちゃんと活用したいなという思いから、読むことにしました。

  • 同じような入門系の本として、 「入門git」というかなり似たタイトルの本もあってどちらにするか迷ったのですが、Gitの開発責任者が書いている点に惹かれてこちらを読むことにしました。
  • もう一方の本はこちら。こっちの方が使い方メインで載っていてわかりやすいという声が多いような気がします。

入門git

入門git

  • gitはバージョンによってオプションなどが変わっていたりすることがあるみたいです。自分はhomebrewで入れた「1.7.3.5」で動かしています。

Chapter 1 gitとは

  • ここではgitのような版管理を使う目的や、集中型と分散型の違いについて簡単に書かれています。

Chapter 2 gitの基本概念

  • ここではいきなり、gitがどうやって内部的にデータを保持していて管理しているかなど内部の構造について書かれています。わからないなりにも「なるほどなぁ」と思うことも多く面白いです。
  • また、理解しておく必要がある「ブランチ」や「タグ」、「ワークツリー」や「リポジトリ」についての説明も簡単に書かれています。
  • さらに、gitのような分散型の特徴であるコミットをする時の「HEAD」、「インデックス」、「ワークツリー」の関係が図を使って丁寧に説明されており、Subversionのような集中型との違いが少しわかるかと思います。また3-wayマージによるマージのルールついても書かれています。

Chapter 3 インストールと初期構成

  • ここではタイトルの通り、それぞれの環境でのgitのインストール方法が書かれています。実際にするときはネットなどで最新の情報を調べたほうがいいかと思います。

Chapter 4 独りで使う

コミットまでの流れ
  • ここからようやくgitを使った作業に入ります。下記のような流れで進んでいきます。
  • プロジェクトのディレクトリし、その中にファイルを作って、「git init」する。
  • 「git add .」・・・現在のディレクトリ以下全てのファイルの状態が記録する。
  • 「git commit -m "comment"」・・・コミットする。
  • またファイルを編集して「git diff」・・・編集した部分の差分が表示される。
    • この状態ではgitにまだリクエストしていない差分が表示される。
  • 再度「git add」して「git diff」すると差分が表示されなくなる。
  • 「git diff HEAD」とすると最新コミットとの差分が表示されるので、最新コミット後の編集内容が表示される。
  • 「git add -u」でワークツリー内でgitで管理されている全てのファイルに対して「git add」を実行することができる。
    • 新規作成されたファイルは対象とならない。
  • 「git commit」でエディタを起動してコミットする。
    • 標準的なログメッセージの形式
      • 1行目は要約、1行空けてコミットの説明を書く。
〜のバグ対応

〜を〜して、〜〜〜みたいに説明を書く。
Tips?
  • 「test~」なファイルを作成し、「git status」すると「test~」がUntracked filesに表示されるが「.gitignore」に「*~」などと書いておくと「test~」が表示されなくなります。
    • エディタのバックアップファイルなど明らかに管理する必要のないファイルを指定しておくと便利。(.swpなど)
インデックスについて
  • 最新のコミットとワークツリーの間にある記録領域。「git add」はワークツリーの内容をインデックスに記録しています。
「git status」
  • 「git status」でコミットされるファイルの状態などを確認することができます。
「git log」
  • 「git log -<数字>」で出力するコミットの数を指定できます。-pでコミットをパッチ形式で出力できます。--pretty=shortでコミットログの1行目(要約が書かれているはず)だけが出力されます。
  • 「git log 」でファイルやディレクトリに対するコミットログを見ることもできます。
  • 「git log --grep=''」でログメッセージから検索することも出来ます。
    • 「--grep」は複数指定することができ、その場合はor検索になります。and検索にする場合は、「git log --all-match --grep='foo' --grep='bar'」とすることで可能です。
    • その他、オーサーやコミッターによる検索も「git log --author='koba' --committer='koba'」というように指定することで出来ます。
「git add」
  • 「git add -p」でパッチ形式の出力を見ながらどの変更をインデックスに反映するか選べます。近い場所での変更は1つのハンクに含まれるので、その場合は「s」で分割することができるようです。
    • まとめてした変更を個別に分割してコミット出来るのは便利ですね。
「git diff」
  • 「git diff --cached」では、インデックスとデフォルトではHEADの差分を表示させることができます。
    • 上記では、「git add」していない(インデックスに反映されていないワークツリーのみでの変更)は表示されません。
「ワークツリー」
         |  - 「git diff」
「インデックス」
         |   -「git diff --cached」
  「HEAD 」
(ワークツリーとHEADのdiffは「git diff HEAD」)
「git commit」
  • 「git commit -v」でdiffを見ながらコミットコメントが書けます。
  • 「git commit 」でaddされたものの中からコミット対象を選択してコミット出来ます。
  • 「git commit -a 」でgitに管理されているファイルをコミットすることが出来ます。新規作成されているが「git add」されていないファイルは対象外。「git add -u」して「git commit」するのと同じです。
  • 「git commit --amend -a -m 'やりなおし'」とすることで、最新のコミットのログを変更したり、さらに修正を追加したりすることが出来ます。便利ですね。
    • 「git commit --amend」だけでコミットログの修正だけを行うことも出来ます。
「git show」
  • 「git show」でコミットを表示します。デフォルトはHEADで直前のコミットの内容を表示します。
「git blame」
  • 「git blame 」と指定することで、ファイル内の行がそれぞれいつコミットされたものかを見ることが出来ます。
19daef5b (koba04    2011-01-13 00:37:06 +0900  1) *これはgitのテストファイルです。
19daef5b (koba04    2011-01-13 00:37:06 +0900  2) README!!!!
d2df3c0d (koba04    2011-01-12 00:58:00 +0900  3) git init 
d2df3c0d (koba04    2011-01-12 00:58:00 +0900  4) git add .
変更を取り消す系
「git revert」
  • 「git revert 19daef5b」のようにコミットオブジェクトを指定することでコミットを取り消すことが出来ます。実行するとエディタが起動しますので取り消す理由を記入します。取り消すといっても「git revert」したログは残りますので注意!
    • 証拠を改ざんして「git revert」してもバレちゃうわけですね。
「git checkout」
  • 「git checkout 」とすることで、ワークツリーの変更をインデックスの内容で上書きすることが出来ます。つまり「git add」していない間違った変更は「git checkout 」でインデックスの状態まで戻せます。
「git reset」
  • インデックスに追加されたファイルに対して「git reset 」とすることでaddを取り消せます(インデックスに記録されたことを取り消します)。resetの後にファイル名をつけないとaddされているファイル全てに対するaddを取り消します。
  • 「git reset HEAD^」で直前のコミットをなかったことに出来ます。この場合、取り消したコミットは「git log」でも表示されなくなります。注意点としては、取り消されたコミットに対する変更はワークツリー内には残っていますので、「git checkout」するか修正して再度コミットするなど対応が必要です。
  • また「git reset --hard HEAD^」とすることで、ワークツリー内の変更も捨てることが出来ます。
    • ちなみに「HEAD^」は最新のコミットの1つ前という意味なので、1つ前のコミットに戻すという意味になります。
  • つまり「git reset --hard HEAD」とすると、ワークツリーを最新のコミットの状態に戻すことが出来ます。
  • コミットログを修正するだけやコミットに修正をさらに追加したい場合は、前述した「git commit --amend」で可能です。
「git rebase 」
  • 「git rebase -i HEAD~3」とすることで、3つ前のコミットに戻って修正することが出来ます。コマンド実行するとエディタが起動するので、編集したいコミットの「pick」を「edit」に書き換えます。すると、
Stopped at 757a908... Revert "only README"
You can amend the commit now, with

	git commit --amend

Once you are satisfied with your changes, run

	git rebase --continue

と表示されるので、修正して、「git commit --amend -a」して、「git rebase --continue」すれば残りのコミットも書き換えられます。複数editした場合はこれを繰り返します。

ここまでのまとめ

  • この本の特徴としては、git自体の使い方ももちろん説明されているのですが、実際の状況を想定した流れの中での説明になっているため、コマンドに対する詳細な説明ではなく、「こういう状況のときはこうする」などバージョン管理に対する考え方もわかる点がいいなぁと思います。
  • あるコマンドの紹介があって、その後しばらく読み進めたところで前に紹介したコマンドの別オプションの紹介などがあったりもするので、リファレンス的に使うのは難しいなと思います。
  • gitコマンドの使い方を覚える本ではなく、gitによるバージョン管理の方法を覚える本になっていると思います。


次からはいよいよ複数人で管理する場合に入っていきます!