gitで始めるバージョン管理

こんにちは、斉藤です。

皆様はソースコードの管理(バージョン管理)をどのようにしてますか?
今回は"git"(ギット)という、バージョン管理システムについて、ご紹介をします。

* バージョン管理って?

例えば、ソースコード中に昔のコードをコメントアウトをして、残しておく。
あるいは、xxx.php.bakみたいに、昔のコードを取っておく。

そんな開発方法をやったことはありませんか?
この方法をしていると、後で見返したときに、これなんだっけ?ってことになってしまいがちです。
消すべきかどうか分からないコード、ファイルが残っているって状況は、あまり気分的に良くないですよね。

これを解決できる方法が、gitなどのバージョン管理システムです。
ソースコードの編集履歴(バージョン)を記録することによって、特定の開発履歴に戻る、最新のソースコードと比較する、といったことが可能です。

バージョン管理の良いところ


・開発履歴を残すことにより、開発履歴を呼び出す、比較できる
・編集履歴はバージョン管理システムの中に保存されるので、開発用のコメントアウトや.bakファイルが残る、といったことを回避できる
・最新の編集履歴と比較することで、今現在、ファイルが編集されている状態かどうかが分かる

* git って?

先日のblogでも、紹介されていますね!
非エンジニア出身の新米Webディレクターが覚えておくべき10の用語 その2
分散型リポジトリのバージョン管理システムです。
"分散型リポジトリのバージョン管理"という語句の説明を簡単にすると、


・サーバ上にソースコードのマスター(中央リポジトリ)がある
・開発者はそれをコピーして、自分だけの環境下(ローカルリポジトリ)で開発を行う
・ローカルリポジトリでの編集が終わったら、その差分を中央リポジトリに送る
・他の開発者は中央リポジトリから、その差分を持ってきて、同じように開発を行う

という、繰り返しによって開発を行う手法のことです。

gitの良いところ


・ローカル上に中央リポジトリがコピーされることで、一時的に中央リポジトリにアクセスできない、という場合でも、バージョン管理による開発を行うことが可能
・ローカルのみでの開発から、中央リポジトリを使った複数人での開発へ切り替えが簡単

この点で、Subversionなどの中央型バージョン管理システムと比べると、導入しやすいですね!

* 使ってみる。

実際にコマンドを追いかけながら、ローカルでのバージョン管理をやってみましょう。

管理したいフォルダに入って、git initコマンドを使います。


$ git init
$ ls -a
.  ..  .git

これで、gitによるバージョン管理が始まりました!
lsなどで、フォルダを確認すると分かるように、.gitフォルダが作られています。git管理されている状態になっています。

この時点で、git管理がどういう状態かを確認しましょう。そのためのコマンドはこちら。


$ git status
# On branch master            
#                              
# Initial commit                      
#
nothing to commit (create/copy files and use "git add" to track)  

今の状態は、一つもファイルがない状態なので、nothing to commitと書かれたメッセージが表示されています。

では、まずはファイルを作って、もう一度、状態を確認しましょう。


$ echo test > xxx.txt
$ git status
# On branch master 
# 
# Initial commit
# 
# Untracked files: 
#   (use "git add <file>..." to include in what will be committed) 
# 
#     xxx.txt 
nothing added to commit but untracked files present (use "git add" to track)

Untrackedというメッセージが確認できますね。
git管理に入っていないファイルがあるよ、というメッセージです。

これをgit addというコマンドでgit管理下に入れましょう。


$ git add xxx.txt
$ git status
# On branch master                    
#                                     
# Initial commit                      
#                                     
# Changes to be committed:            
#   (use "git rm --cached <file>..." to unstage)
# 
#       new file:   xxx.txt
#

new file: xxx.txtは、git管理に入ったという意味です。

次にこちらを編集履歴として記録しましょう。


$ git commit -m "最初のコミット"
[master (root-commit) c357e0d] 最初のコミット
Committer: katsuya <katsuya@xxx>
...
After doing this, you may fix the identity used for this commit with: 
    git commit --amend --reset-author
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 xxx.txt

これで、今の編集状態が記録されました!
このようにgit commitコマンドで記録することを"コミットする"と言います。

もう一度編集して、記録した直前の状態(commitコマンド使った直後)との差分を見てみましょう。


$ vim xxx.txt
$ git diff
diff --git a/xxx.txt b/xxx.txt
index 9daeafb..1bf0e11 100644
--- a/xxx.txt
+++ b/xxx.txt
@@ -1 +1,3 @@
-test
+git
+version
+asial

vimで、testという行を削り、git,version,asialと行を追加しました。git diffというコマンドで、その内容が確認できます。
diffでは行を追記した場合は、+...というように表示されます。逆に削った行は-...と表示されます。

この状態でもう一度コミットをし、今度は今までの編集履歴をgit logというコマンドで確認しましょう。


$ git commit -am "xxx.txtを編集"
...
$ git log -p
commit e83d667df44eb19383d942fd8201ddc7fd5939bf
Author: katsuya <katsuya@xxx>
Date:   Mon Feb xx xx:xx:xx 2012 +0900
    xxx.txtを編集
diff --git a/xxx.txt b/xxx.txt
index 9daeafb..1bf0e11 100644
--- a/xxx.txt
+++ b/xxx.txt
@@ -1 +1,3 @@
-test
+git
+version
+asial
<br/>
commit c357e0d9ed6d9807b47a3e736ff589356b9d1449
Author: katsuya <katsuya@xxx>
Date:   Mon Feb 27 xx:xx:xx 2012 +0900
    最初のコミット
diff --git a/xxx.txt b/xxx.txt
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/xxx.txt
@@ -0,0 +1 @@
+test

編集された行が履歴として残り、今までの編集履歴が確認できます。

さらに、履歴として残してある状態に戻ってみます。


$ git checkout HEAD~ xxx.txt
$ cat xxx.txt 
test

xxx.txtは一つ前のコミットした状態まで戻りました!

逆に最新の状態に戻しましょう。


$ git checkout HEAD xxx.txt
$ cat xxx.txt
git
version
asial

git checkout というコマンドで、特定のバージョンを行き来することが可能です。
わざわざ、bakファイルを残したり、前の状態に戻すような編集の手間が省けますね。

こんな風にして、開発を行えば、無駄なコメントやファイルを残さないで済む、ということが分かっていただけるでしょうか。

というわけで駆け足でご紹介しましたが、いかがだったでしょうか。
うまく使えば、強力な開発ツールになります!
使ったことのない方には、とてもおススメです!

* gitのコマンドたち(git ... と使う)


init:git管理を始める
add:編集したファイルをgitに通知する
status:ファイルの状態を見る(編集されているか、git管理に入っていないファイルがあるかなど)
commit:編集履歴を記録する
diff:編集の差分を確認する
rm:ファイルを削除し、git管理からも外す
log:編集履歴(commit)を確認する
checkout:特定の編集履歴に戻す

などなど。

* まだまだ紹介しきれていないことが・・・


・branchをつかって、開発状況(ある機能を追加したバージョン、公開用のバージョン)を取っておく
・分散型リポジトリとしてのgit管理(複数人での開発用)

などなど、まだまだ、今回ご紹介できなかった機能がたくさんあります。
興味がある人はぜひぜひ調べてみてください!

* 参考リンク

ザリガニが見ていた アリスとボブのgit管理
gitの基礎練習
gitお悩み相談室
Gitを使い始めたらやっておきたい便利な設定いろいろ