こんにちは、斉藤です。
皆様はソースコードの管理(バージョン管理)をどのようにしてますか?
今回は"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を使い始めたらやっておきたい便利な設定いろいろ