最近は subversion も使いますが、git を使うことも多くなってきました。モジュールの配布なども git のものが多くなってきて、そろそろ git を使えるようになっておかないとまずい気が・・。ってことでちょっと勉強してみたのでまとめてみます。

そもそも「 subversion と git は何が違うの?」っていう話ですが、主な違いは以下の通りです。【参考】に挙げたサイトが分かり易いと思います。

subversion
・単一リポジトリ(リポジトリは一つだけ)
・commit したら即反映
・add するのは新規にファイルを追加するときだけ
・リビジョン番号は数字
・考えるのは『ローカル( checkout した場所)』と『リポジトリ』の2つだけ

git
・分散リポジトリ(マスターリポジトリは一つ。でも個人リポジトリを自由に作れる)
・commit しても個人リポジトリにしか反映されない( push するとマスターリポジトリに反映)
・commit 前には毎回 add する必要あり
・リビジョン番号はハッシュ値
・考えるのは『ローカル』と『インデックス』と『個人リポジトリ』と『マスターリポジトリ』の4つ

【参考】
分散バージョン管理システムGit入門
アリスとボブになりきってgitをちゃんと理解したい! - ザリガニが見ていた...。

git は subversion と比べるとちょっと複雑です。。。でも利点もあるので頑張って使いこなすべし!・・ということで、初めて git を使う人がよく分からなさそうなところを説明してみます。

↑で、git では commit 前に毎回 add する必要あり、と書きました。これがどういうことかというと、git add すると、ローカルの状態がインデックスに記録されます。その後、git commit することでインデックスの状態を個人リポジトリへと記録します。だから毎回addしないといけないわけです。

------------  add   ----------------  commit  ------------------
| ローカル | -----> | インデックス |  ----->  | 個人リポジトリ |
------------        ----------------          ------------------

そもそも git にはコマンドが多いんですよね。。それが git 導入の一番の壁になる気がします。(´Д⊂)
ので、よく使う3タイプのコマンドだけでも頑張って説明してみます!!

差分を見る

差分を見るには以下の3種類があります。慣れないと分かりづらいですが、とても重要です。diff を制する者は git を制する!!

# インデックスに記録した状態とローカルとの diff
git diff

# 個人リポジトリの最新の commit とローカルとの diff
git diff HEAD

# 個人リポジトリの最新の commit とインデックスに記録した状態との diff
git diff --cached

つまりこういうことです!!
gitのdiffをまとめた図

インデックスに記録する

git add -p 超便利ですよ〜。

# 現在のディレクトリ以下の全てのファイルを git 管理下に
git add .

# 指定したファイルを git 管理下に or インデックスに記録する
git add PATH

# git管理下で、かつインデックスと比べて変更があるファイル全てをインデックスに記録
git add -u

# 変更箇所が複数のときに、どの変更を次のコミットに含めるか選択出来る
git add -p

個人リポジトリにcommitする

subversion の感覚で普通に git commit PATH ってすると通常の git の動きと違うので戸惑います(はまりました..orz)。特に git add -p したときに git commit PATH すると、commit しないように選んだ変更まで commit されてしまうのでこれはとても危険です。

git commit PATH を使うのは、「このファイルだけ特別にインデックスを無視して commit する」みたいなときくらいでしょうか?基本、コミットする際には事前に add して、コミット時にはファイルの PATH を指定しないっていう決まり事を守っておいた方が幸せになれそうです。

# インデックスの状態をそのまま commit
git commit

# 指定したファイルを、インデックスを無視してそもまま commit
git commit PATH

# commit のログメッセージを書くときに、git diff --cached が一緒に出力
git commit -v

取り消し

複雑です。。subversion とは同じ名前でも効果が全く違うので要注意です。

# git add の取り消し 
git reset PATH 
 
# 直前のコミットを無かったことにする
git reset HEAD^

# 直前のコミットを無かったことにして、ファイルの変更自体も取り消す
git reset --hard HEAD^

# 指定したファイルを、インデックスの状態に戻す
git checkout PATH 
 
# 指定したファイルを、個人リポジトリの最新 commit 時の状態に戻す 
git checkout HEAD PATH 
 
# 過去の commit を打ち消す commit を作る 
git revert REVISION


で、「結局 git のどこがいいの?」ってことなんですが、僕はこの2つが素晴らしいと思います。

1. commit log が汚くなるとか気にせず、気軽に commit 出来る

commit してもそれは個人リポジトリに反映するだけ(マスターリポジトリには何の変更もありません)なので、気軽に commit 出来ます。そして、本当に必要なものだけ push してマスターリポジトリに反映させることが出来ます。マスターリポジトリには綺麗な履歴だけが残ります。

2. 特定の変更だけを選んで commit、が簡単に出来る

git add -p することで、add 時に、「どの変更を commit するか?」を選択することが出来ます。あるファイルを修正していて、この部分は commit したいけどこの部分は commit したくない、なんていうときにとても便利です。

ってことで、駆け足でしたが簡単にまとめてみました。他にもいっぱいコマンドがあるけど、とりあえずはこのくらいのコマンドを知っていれば何とかなりそうです。とにかく git は(学習コストは高いけど)便利ですよー。ヾ(o゚ω゚o)ノ゙ 是非使ってみてください。
このエントリーをはてなブックマークに追加