コラム

寺井諒の連載コラム「一$入魂」第四回「自分なりのPHP開発環境を構築しよう(中編・Git)」

皆さん、こんにちは。最近めっきり寒くなり、ストーブが手放させない季節になってきました。
古い家に住んでいるので隙間風とネコドアに苦しんでいる寺井です。
今回は初心者編に混ぜるべきか悩んだGitの導入についてお話していきます。

アジェンダは以下の通り。
* バージョン管理とは?
* Gitの良いところ悪いところ
* Gitを実際に使ってみよう!

バージョン管理とは?
Gitのお話をする前に皆さんはこういった状況に出くわしたことがないでしょうか?
あるプロジェクトを引き継いだ際、FTPの設定情報だけを渡され実際にログインしてみると.bakファイルや_20161010_index.phpといった
誰か変更かけたんだかわからないファイルが大量に存在している状態に…
実際のところ2016年現在でもこういった状況に出会うことはまだあります。そして手を加える手間がなく来年以降にも引き継がれていくわけです。
そして時間が経つにつれて自分が変更したファイルも.bakというファイル名に変わり意味がわからなくなっていく。
小規模なプロジェクトなら「めんどくさいなー」で済みますが規模が大きくなると手をいれる人も増えるため死活問題です。
無駄なコストとサーバ容量だけがただ膨らんでいきます…

そういったものを解消するものとして1995年にCVSや2000年にSubversionといった集中型バージョン管理システムが登場しました。
サーバにあるファイルと自分のファイルが連動しておりサーバに存在するファイルが中心(中央リポジトリ)となり、変更履歴が残るようになります。
しかしネットワークにつながっていないと管理機能を使えないのが少々不便でした。
これによって無用なファイルがだいぶ減りましたが如何せんweb黎明期時代だったので使っているところは使っているし使っていない所は一度も見かけたことがないレベルでした。

そしてGitが誕生するわけですが誕生自体は2005年ですのでまだ比較的新しい技術になります。
Subversion等が中心ファイルに対して変更をかける集中型と呼ばれているのに対し、Gitは分散型バージョン管理システムと呼ばれています。
集中型やら分散型やら文字だけで見ると意味がわからないので図を見てください。

分散型は自分のローカルスペースにあるローカルリポジトリとサーバ上に存在するリモートリポジトリという二種類のリポジトリがあり、
ローカルリポジトリは使用する人それぞれに存在するので複数、リモートリポジトリは基本的には一つという形になります。
こちらは変更履歴をローカルリポジトリに書き残すことが出来るので常時ネットワーク上にいる必要がないのも特徴です。

バージョン管理がスタンダード化した理由にウォーターフォール型開発からアジャイル開発へシフトするプロジェクトが増えたのも理由にあると個人的には思っています。
分散型・集中型どちらを使うかは人それぞれですが、こと「バージョン管理」に関してはやらない理由はありません。

Gitの良いところ悪いところ
さて、そんな使って嬉しいやって楽しいバージョン管理ですが今回はGitを取り上げたいと思います。
Subversionの説明をしろとは言わないでください。僕自身が二回しか使ってなくて何も語れません…
ある勉強会でGitを使用しているかという挙手をお願いしたところ九割は挙手されていたと思います。
それだけプログラマ周りでは認知されているので今からバージョン管理を使うならGitで良いかと思います。
いつか余裕が出たら他のバージョン管理システムを使ってみてください。そしてぜひ記事にして教えて下さい。

Gitのデメリットとしてまず最初に殆どの人が思い浮かぶであろうことが学習コストです。
初期インストールをしてリモートリポジトリをローカルリポジトリに落とし込んでー…とこの辺までは比較的ラクです。
しかしこの先addしてpushしてコンフリクトしたから直して…と細かい使い方をしていくに連れて難易度は上がっていきます。
ターミナル上で触ることは将来的には絶対に覚えたほうがいいですが、まず使ってみたいという方は
[GitHub Desktop](https://desktop.github.com/)
みんな大好きGUI!で触りましょう。
学習コストを比較する際にSubversion等の学習コストに対してーというのをよく聞きますが、どっちにしろ0からスタートするのであれば
コスト5が10になるくらいなのであんまり変わらないと思っています。学習せずに使えるようになればそれは良いですけど世知辛い世の中です。

メリットとしてはgitだけではなくバージョン管理全体の話もありますが、
* Windowsで言う復元ポイントにすぐに戻せて最新の状態にもすぐ戻せる
* 変更履歴が明確に残る[**誰が、いつ、何を**変更したか]
* ブランチ(枝わけ)が簡単にできる
* **GitHub**が使える!!!
などがあります。
Gitの普及はGitHubによるところも大きいと思いますし、最近ではwindowsアプリをGitHubからダウンロードさせるところもあり、
プログラマ以外でも見かけることが増えてる用に感じます。
アカウントを作りちょっとデキる人っぽくなりましょう。

Gitを実際に使ってみよう
Gitを使うにあたってインターネット上には様々な導入記事・活用記事があります。
ですので自分が理解しやすい記事をーなんて言ってしまうともうこの記事の意味がなくなってしまうので今回Myおすすめをお教えします。
[githug](https://github.com/Gazler/githug)
gitを使う上で必要な操作を問題のように解いていくものだと思っていただければ。
rubyがインストールされている必要がありますが `$ gem install githug` だけでインストールされ準備が完了します。
あとはgithugと打てば
“`
% githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
No githug directory found, do you wish to create one? [yn]  y
Welcome to Githug!

Name: init
Level: 1
Difficulty: *

A new directory, `git_hug`, has been created; initialize an empty repository in it.
“`
このようにゲーム(上記リポジトリにもゲームと書いてある)の準備が整います。
コマンドとしては
`githug`のあとに`play hint reset levels`だけで進みます。
“`
#1: init
#2: config
#3: add
#4: commit
#5: clone
#6: clone_to_folder
#7: ignore
#8: include
#9: status
#10: number_of_files_committed
#11: rm
#12: rm_cached
#13: stash
#14: rename
#15: restructure
#16: log
#17: tag
#18: push_tags
#19: commit_amend
#20: commit_in_future
#21: reset
#22: reset_soft
#23: checkout_file
#24: remote
#25: remote_url
#26: pull
#27: remote_add
#28: push
#29: diff
#30: blame
#31: branch
#32: checkout
#33: checkout_tag
#34: checkout_tag_over_branch
#35: branch_at
#36: delete_branch
#37: push_branch
#38: merge
#39: fetch
#40: rebase
#41: rebase_onto
#42: repack
#43: cherry-pick
#44: grep
#45: rename_commit
#46: squash
#47: merge_squash
#48: reorder
#49: bisect
#50: stage_lines
#51: find_old_branch
#52: revert
#53: restore
#54: conflict
#55: submodule
#56: contribute
“`
これはlevelsを打てば出てくるレベル一覧ですが頻繁に使わないコマンドまでカバーしてくれているので初めての方でも復習する方でも使えると思います。
あとは日本語がいい!という方は
[猿でもわかるGit入門](http://www.backlog.jp/git-guide/)
こちらもgitといえば必ず話に出てくる参考サイトになると思います。
ただコマンド系は読むだけでは絶対に身につかないので上のgithugと
[LearnGitBranching](http://k.swd.cc/learnGitBranching-ja/)
実際のgitブランチ機能の理解としてこちらを実際に触ってもらえると理解が深まると思います。

まとめ
* バージョン管理自体は20年近く前から、gitは11年前くらいと比較的新しい技術
* バージョン管理はまた今度…ではなく今やろう。
* 遊んで覚えよう!(あんまりゲームっぽくないけど…)

僕自身もPHPを使う会社に入って3年くらいはバージョン管理?何それ?状態でずっと過ごしていました。
勉強会やらカンファレンスやら行ってたのにです。
その理由として業務に迫られなかったし学習コストが…という逃げを打っていました。
実際なくても業務自体やれなくはないですが、長い目で見ると作業スピードはかなり変わります。
前のバージョンに戻したいときなど特に…
ですのでまだ触ったこと無い方は是非一歩前に進んでもらいたいと思っています!
次回はなににしようかな?Testあたりかな・・?

関連記事一覧