Version管理のことはじめ

# 1.はじめに
システム開発を行う上で欠かすことのできない事柄の一つにVersion管理があります。
GitやSubversion、Mercurialといった様々なツールが存在し、開発におけるVersion管理をサポートしてくれています。
この**「Version管理」という事柄**について理解する、もしくは新人さんや初心者の方に対して説明する、ということが意外と大変である。という経験をした方は、意外に多いのではないでしょうか？  

『変更を打ち消してしまっている。:sweat_drops:』 
『全然Commitしてくれない。:sweat_drops:』
『個人の作業履歴の羅列になってしまっている。:sweat_drops:』 

ツールの使い方を「教わっただけ・教えただけ」では、Version管理が上手くいかないことも多いのではないかと思います。(体験談・失敗談)
そういった「教える側の初心者」「教わる側の初心者」の方たちに対して、**『Version管理ってそもそも何だろう?』**というところから理解を深めて、GitやSubversionなどのツールを使う前の**『心構え』『準備』**に本稿を役立てもらえればと幸いです。

# 2.本稿の対象者
- [x] :hand:Version管理をしたことのない初心者や新人の方:hand:
- [x] :hand:GitやSubversionの指導を任せらせた指導者の方:hand:
- [x] :hand:Version管理くらいはやっておきたいと考える未経験の方:hand:

# 3.Version管理って何?
まずは「Versionを管理する。」という行為はどういったものなのか？というところです。
>バージョン管理システムの最も基本的な機能は、ファイルの作成日時、変更日時、変更点などの履歴を保管することである。  
> ー [Wikipedia - バージョン管理システム -](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)  

　
> あなたが(1個または1群の)ファイルに対して行った変更の履歴を、追跡管理するのかバージョン管理である。もっと規模の大きい、会社などの組織にとっても、バージョン管理は必要不可欠な業務だ。つまり、ソフトウェアの様々な版を追跡管理するのがバージョン管理である。  
> ー [独習Git](https://www.amazon.co.jp/gp/product/4798144614/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=devwall-22&creative=1211&linkCode=as2&creativeASIN=4798144614&linkId=4040f513686843e502f4d47dd7128997) - Chapter2 Gitとバージョン管理の概要 ~ 2.1 バージョン管理の諸概念 ~ -

上2つの引用から言葉を借りて言うと「Versionを管理する。」という行為は、 
**ファイルおよびソフトウェアの変更履歴を追跡可能な状態で管理する。**ということです。
この要件を満たすことだけを考えるのであれば、下のようなフォルダで変更履歴を追跡管理している場合も『Version管理』と言えます。
![folder-vmgn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198150/c8f1262f-6c80-9e9f-38fe-286e2728af7f.png)
ただし、このようにフォルダ管理していくことはいろいろと不都合や手間が大きいので、実際にはGitやSubversion、Mercurialといったツールを使って、Version管理をしています。

これらのVersion管理ツールは主たる機能として、『変更履歴の追跡管理』を備えているため、簡単な設定とコマンドを叩くだけで、手作業でやっていた管理を何十倍にも簡略化して、Version管理を実施することができます。

# 4.Version管理はどうして必要か？
次にVersion管理のメリットから必要性を考えていきます。
### :large_blue_circle: 保守性が高まる
Version管理を行うことで得られるメリットの１つは『保守性が高まる』という点です。すでにリリース済みのソフトウェアに対して、メンテナンスの必要性が発生した場合、Versionが判明していれば限定的にメンテナンスを行うことができます。

### :large_blue_circle: 安定した機能(価値)提供
ソフトウェアにバグはつきものです。どれだけ完璧だと思っていても、人間が完璧ではない以上バグは生まれてしまいます。ある特定のアップデートでバグが発生してしまった際に、Versionが管理されていれば、 <span style="color: red;">**過去の動作していたVersionに戻すことができます。もしくは動作していたVersionを配信することができます。**</span> 仮にVersionを戻すことができなければ、ソフトウェアは本来の価値を失ってしまいます。ビジネスの場面では、大きな信頼損失に繋がってしまいます。

### :large_blue_circle: 開発効率の向上
開発をしているとある特定のVersionに対して、「試験的に機能を追加を行う」ということが度々発生します。そういった場合にVersionが管理されていれば、現在機能を提供しているソフトウェアのVersionを保持したまま、次の「機能追加」「改修」にむけた開発を行うことができます。


# 5.Version管理の難しさ
[4.Version管理はどうして必要か？](#4.Version管理はどうして必要か？)で、『Version管理』の必要性も理解できて、「さぁ、Version管理をはじめよう:exclamation:」と思った方もいるかも知れません。(もしいるので、あれば本当にうれしいです!) 
[3.Version管理って何?](#3.Version管理って何?)で説明した行為を『Version管理』とするならば、「とりあえず、変更の履歴をフォルダで保存しておこう。」「Version管理ツールがいろいろとやってくれるなら、そっちを使おう。」など十人十色でいろいろな人がいるかと思います。確かに個人であればフォルダ管理でもよいでしょう。GitやSubversionを使ったとしても、履歴を保存するということのみに着目すれば、覚えるコマンドも3~4つで済んでしまうことでしょう。
しかし、ここで『Version管理なんて余裕だ！』と学習の手を止めてしまうのは時期尚早です。チーム開発になった瞬間に状況が一変してしまうかも知れません。**Version管理の難しさは個人では分からない部分が多くあります。**まだ、チーム開発をしたことがない人はこれからの『心構え』として。今個人でVersion管理をしていて、これからチーム開発をしていくという方は『振り返りの機会』として、これから紹介する「難しさ」に目を向けてみてください。

### :red_circle: 特定多数・不特定多数に対する配慮
個人開発とチーム開発の最も異なる点は、言わずもがな自分以外の『他人』がいるという点です。
1人で開発している場合はフォルダやファイル毎でVersionを管理していても、恐らく**編集者はあなた自身だけ**なので、比較的容易でかつ、ある程度の信頼性がある管理ができます。
しかし、1人,2人と編集者が増えると複数のファイルを各々で編集するようになるため、**各ファイルの最新の状態が分からなくなったり、同一ファイルに対する変更が競合する**などの問題が生じやすくなってしまいます。Version管理ツールはそれらの問題を解決する仕組みや機能を提供してくれています。
(※じゃあ、Version管理ツールを使えば問題なし！かというと必ずしもそうではありません。何事にも限度はあります。)


### :red_circle: 使用ツールに対する知識・経験不足
ツールを使うことで『Version管理』を簡単かつ安全に行う環境を整えることができます。しかし、ツールを使えば全てが解決するわけではありません。
『Version管理』を行う中で生まれてきた多くのニーズに対応するため、Version管理ツールは様々な機能や特性を備えています。『Version管理』をするための詳細な部分はツールが肩代わりしてくれますが、それを**ツールに指示するのはあくまで人です。**どれだけツールが素晴らしくても、それを**人が状況に応じて適切に扱えなければ意味がありません。**また、いくらコマンドが簡単だからといっても、『Aの状況ではこのコマンドでいいけど、Bの状況ではコマンド』など、コマンドの使い方は状況に応じて左右される場合があります。
個人で使っているうちは『履歴の保存』程度の意味に覚えていたコマンドも、それを**使うためのシチュエーションを意識する必要**出てきてしまいます。



### :red_circle: 履歴管理に対する個々人の認識齟齬
『変更履歴を追跡可能な状態で管理する』ことがVersion管理といいましたが、そもそも『変更履歴』に対する認識が個々人で違うと『管理し辛さ』を感じてしまいます。ツールを使うことで履歴に関する事柄（『変更日時』『変更内容』、場合によっては『変更理由』など）に関しては比較的容易に統一・管理することができます。 
しかし、**『どれくらい変更内容を1つの履歴とするか?』(Gitに例えると1コミットの粒度)**など、個々人に裁量がある部分は意外と多く残っています。個々人の認識が極端に違う場合には、管理が難しくなってしまいます


### :red_circle: プロジェクトの特性や運用から生じる複雑さ
個々人の裁量以外にも『Version管理』に大きな影響を与えるものとして、『プロジェクトの特性』や『運用』が挙げられます。
>複数の会社で開発請け負ってしまっているため、会社毎にリポジトリが存在していて、共有リポジトリにPushしようとすると競合してしまう。

これは一例ですが、このように自分たちではどうにもしようがない問題も発生することがあります。
>運用部の人達はVersion管理ツールの使い方が良く分からないんで、リリース対象物は別途フォルダでVersion管理してください。

開発チームと運用チームが違う場合には、こういった問題が発生するかもしれません。
このような問題を解決していくためには、『自分たちのチーム』という集団の垣根を越えて、他の集団に対して働きかけが必要になります。

### :red_circle: コミュニケーション不足
チーム開発において、コミュニケーションは最も大切な要素と言っても過言ではありません。
『Version管理』を安全かつ、円滑に行っていくために、ツールを導入しました。ルールも明文化しました。リポジトリもチームで共有できています。

これで問題なし:exclamation::exclamation:開発に没頭できる:exclamation:

確かに開発に集中できる、効率的な環境は整っていることでしょう。
しかし、自分勝手に開発を進めたり、相手の言葉を無視しては折角のツール、ルールが無駄になってしまいます。

> Slackに書いたので、読んだと思っていました。このVersionではなくで、別のVersionにマージして欲しかったです。

コミュニケーションの問題は**ほんの少しの気遣い**、**少ない声かけ**で解決できる問題も多くあります。

>明確なVersionを指定せずに分かったつもりで話をしていたが、自分が想定していたVersionとは違うものに改修が加わっていた。

言葉だけではお互いに分かったつもりになってしまうこともあります。
文字だけ。言葉だけ。に偏るのではなく、文字と言葉を適切に使うことで、円滑なコミュニケーションは生まれていきます。


# 6.さいごに
最後までお読みいただきありがとうございました。
「Version管理」をはじめる前の『心構え』『準備』が少しでもできましたでしょうか?
これからVersion管理をはじめていく方の、一助になれば幸いです。

# 7.参考・引用資料
- [こわくないgit](https://www.slideshare.net/kotas/git-15276118?qid=77cd431f-8ae9-4c07-9e22-3575aa34703d&v=&b=&from_search=1)
- [独習Git](https://www.amazon.co.jp/gp/product/4798144614/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=devwall-22&creative=1211&linkCode=as2&creativeASIN=4798144614&linkId=4040f513686843e502f4d47dd7128997)
- [チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)](https://www.amazon.co.jp/gp/product/4774164283/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=devwall-22&creative=1211&linkCode=as2&creativeASIN=4774164283&linkId=0e6eaadaa6539dca5101e8a6dbb0a9fe)