あなたの環境はどうですか？バージョン管理システムあれこれ

# はじめに

前の現場もそうだし、今の現場でも「え、これってローカル/オリジナルツールじゃないの！？」って思うものに多々出くわしたので覚書。
その現場しか知らない方が「この環境のこれが全てじゃないんだ！」と思うきっかけになったら幸いです。

# バージョン管理ツール、こんなにあります

Wikipediaから抜粋しました。めっちゃありますね。
太字について今回触れます。(出来る限り触れたいんですが、ほとんど知らず(-_-;))

- フリーソフトウェア（オープンソース）

| 名前 | 概要|
|:--|:--|
|Bazaar |- 分散型。Pythonで実装している。|
|CVS |- 集中型。C言語で実装している。|
|GNU CSSC |- SCCSのクローン。もうほとんど使われていない。|
|Darcs |- 分散型。Haskellで実装している。|
|**Git** |- 分散型。C言語、シェルスクリプト、Perlなどで実装している。元々はLinuxのコード管理のために作られた。|
|Mercurial |- 分散型。Python、C言語で実装している。|
|Monotone |- 分散型。C++で実装している。|
|RCS |- Revision Control System。C言語で実装している。|
|**Subversion** |- 集中型。CVSの改良版という位置づけ。C言語で実装している。|
|Veracity |- 分散型。C言語とJavascriptで実装している。Apache License。|

- プロプライエタリ(私有ソフトウェア)

| 名前 | 概要|
|:--|:--|
|AccuRev |- ストリームという概念を使用した、プロセス指向の構成管理ツール。バグトラッキングシステムを内蔵する。分散開発、並列開発など様々な開発プロセスをストリームで表現できる。|
|Alienbrain |- デジタルアセットマネージメントシステム。バージョン管理機能に加え、構成管理、ステータス管理などの機能がある。任天堂にて使用され、有名になった。バイナリデータ、CGデータを問わず履歴を自動で保存できる。|
|BitKeeper |- かつてLinuxカーネルの開発に使われ有名になった。|
|Rational ClearCase|
|Code Co|-op|
|**Perforce Helix**|- 集中型。2015.1で分散型に対応。ロック方式。Perforce Softwareが開発した。マージ機能もあり。|
|Plastic SCM |- 分散型。ロックにも対応。セマンティックマージなどの特徴を持つ。|
|SCCS (Source Code Control System) |- ソースコード管理システム。AT&Tが開発した、RCS登場以前唯一のバージョン管理システム。|
|SourceHaven|
|StarTeam|
|Visual SourceSafe |- Microsoft Visual Studioとセットで使われることの多いバージョン管理システム。|
|Team Foundation Server |- バージョン管理機能に加え、作業管理機能、タスク管理機能、自動ビルド、レポート生成の機能もある、Microsoftのソフトウェア開発プロジェクト管理サーバー製品。|
|Qangaroo |- Web上でExcelライクなインターフェースを有するシンプルで直感的な作業を可能とするクラウド型テスト管理ツール|
|SOS |- Cliosoft 社が開発する、半導体設計をターゲットにした集中型バージョン管理システム。|

# Git

Gitは分散型のバージョン管理ツールです。リポジトリを履歴含め丸ごとコピーしてきて、各自が履歴を更新してmasterに反映していくというスタイル。
履歴で管理するので構造を覚える手間がある分merge/conflict発生時の対処が楽だったりします。
Gitを扱うツールって沢山あるんですよね。ベースはコマンドラインなので、地味にwindowsで使うと苦労したりします。

## 素のGit

これも案外OSによって環境や使い勝手が違ったりするんですよね。

### Linux

`git help`でインストールされているか+使い方が確認できます。無かったら`apt-get install git`とかでインストールしてください。

```shell:
$ git help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:
以下略
```

### Mac

手元にMac PCが無いので動作確認してませんが、ターミナルでgit --versionと打てば、ないならインストールされるそうです。
https://tracpath.com/bootcamp/git-install-to-mac.html

### Windows

まずはGit for windowsをインストールしてください。
https://gitforwindows.org/

注意点として、**WindowsのGitはデフォルトインストールすると勝手に改行コードをCRLFに変換します**。インストール時の問いかけで` Checkout as-is`みたいな項目にチェックを入れましょう。
"as-is"がそのままの意味なので、checkoutもcommitも"as-is"なものを選ぶと改行コード変換を回避できます。
(gitを広めようとしたあの時にまんまとハマって、普及が遅れましたよWindowsさん！)

詳細は以下で！
https://qiita.com/yokoh9/items/1ec8099696ade0c1f36e

そしてWindowsと言ったらUI。コマンドベースのGitではなくUIツールもインストールしたいですね。
私が触ったことがあるのは[TotoiseGit](https://tracpath.com/bootcamp/learning_tortoisegit.html)です。亀のイラストがかわいいツール。
![](https://tracpath.com/bootcamp/wp-content/themes/_btcp/images/tgit14.png)

これ以外にも私は使ったことがないですが、[SourceTree](https://www.sourcetreeapp.com/)や[Gitkraken](https://www.gitkraken.com/)といった視覚的なツールがあるそうです。
~~TotoiseGit使うならこっちを触ってみたかった~~

## Gitリポジトリ

さあGitを使えるようになりました、じゃあコード管理はどうする？ってなった時に、色々な手段があるんですよね。
結構この手段を=Gitと捉えている人がいるんじゃないかなと思います。

### 素で立てる

gitは分散型のバージョン管理システムなので(?)、実はいつでもどこでもリポジトリを作ることが出来ます。
やり方は簡単。

1. リポジトリを作る
    1. フォルダ内でgit initを実行
    2. 好きにcommit
    3. bareリポジトリ(みんなで共有する前提のリポジトリ)なら、git init --bareでOK
2. 作ったリポジトリをcloneする。
    1. git clone 1で作ったディレクトリのパス
3. リポジトリにpushする。

これだけ。リモート環境のgitリポジトリをclone出来るのも、リモート先のリポジトリがsshやhttpでアクセスできるようになっているからなんですよね。
なので同じ理屈でアクセス可能なローカルパスを指定してもcloneが出来るというわけです。

これを知ってると、例えば手元でちょっとしたツールを何案か作りたい⇒git initでリポジトリ作って何案かのブランチを作っておくとかすればいいからめっちゃ作業が楽になります。
と、手順は書きましたが実際作るのは面倒ですよね。というわけでgitの管理サービスを紹介します。

### [Github](https://github.com/)


<img width="300" alt="middle_normal.png" src="https://github.githubassets.com/images/modules/logos_page/GitHub-Logo.png"><img width="300" alt="middle_normal.png" src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png"><img width="300" alt="middle_normal.png" src="https://github.githubassets.com/images/modules/logos_page/Octocat.png">

多分一番よく聞くGitリポジトリ管理サービス。自前のユーザーアカウントを作っておけば、クラウド上に自由にリポジトリを作成することが出来ます。
合わせてprojectを作成してissueやwiki等を管理できるので、実際にチーム開発を行う際にも便利。

### [Gitlab](https://about.gitlab.com/)

<img width="500" alt="middle_normal.png" src="https://about.gitlab.com/images/press/logo/svg/gitlab-logo-gray-rgb.svg">

たぬきのアイコンがチャーミングな、githubの機能を継承したサービス。Web版とローカル環境で構築するためのセットがあります。Web版は当然クラウド上にリポジトリを管理しています。
また、Githubの後発な分「プロジェクト」に視点を置いた機能が充実しており、チーム開発が活きる構成となっています。
Githubとの比較は以前に[こちら](https://qiita.com/developer-kikikaikai/items/3fd1277a9a5778000638)にまとめました。
会社でどれでもいいから自由に使っていいと言われたら、真っ先にこれを選ぶかな。

### [Bitbucket](https://bitbucket.org/)

<img width="300" alt="Bitbucket@2x-blue (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/252277/ca457847-9638-7e17-b297-a9521004bbbf.png">

こちらもGithub, Gitlabと同様クラウド上でgitリポジトリを管理するためのツール。
少しだけ触ったことがあるけど、不便はないな～ + slackとなんか連動出来るらしいな～、ええやんくらいの印象。

### [Gerrit Code Review](https://www.gerritcodereview.com/)

<img width="444" alt="Bitbucket@2x-blue (1).png" src="http://www.gerritforge.com/images/content/slide1.png">


今の現場で初遭遇したツール(現場の皆さんGit = Gerritで話をするから違和感が凄い)

Gitの仕組みを利用して、いい感じにコードレビューをしようというツールです。
開発者がgit pushする先は実はmasterじゃない別ブランチで、codeレビュー等管理者が取り決めた条件を満たすまではmasterへ反映するsubmitボタンが押せないという仕様。
仕様上取り決めたフローを流さない限りは本線へのpushが出来ないようになっています。ざっくりイメージはこんな感じかな。
<img width="700" alt="gerrit.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/252277/ba3ee8b7-6019-df59-ef7d-6e347784c2e8.jpeg">
(2はaccept codeすね)

実際にブラウザ上で見える画面はこんな感じです。
![](https://review.openstack.org/Documentation/images/intro-quick-review-line-comment.jpg)
([Gerrit Code Review - A Quick Introductionより](https://review.openstack.org/Documentation/intro-quick.html))

これは「Gitを利用したレビューツール」ですが、多分この現場だけしか経験ない方としてはこれは「管理ツール」の中の一部だと思うのでここで紹介させていただきました。

# Subversion

マスターのファイルをみんなで更新する形の集中型バージョン管理システムです。当然他の人が同時に更新してもおかしなことにならないような作りになっています。
svn、今どれくらい利用されているんですかね？wordやexcel等のバイナリ管理は分散型は向かない(絶対差分が出るので)ので、設計書だけsvnって環境もあるかと思います。
こちらもWindowsとそれ以外で違う印象です。

### Linux

svnコマンドで使用できます。Ubuntuならapt install subversionでインストール
使い方は省略。

### Mac

詳細不明。[こちら](https://qiita.com/ituki_b/items/6f4d9237dc7d768c20c4)を参照ください

### Windows

<img width="600" alt="Bitbucket@2x-blue (1).png" src="https://tortoisesvn.net/assets/img/tortoisesvn_logo_hor468x64.5e0587de.svg">

かわいい亀さんの大元(だと思う)。
以下を参考にしてインストールしてください。
https://qiita.com/takecho123/items/7d1d97ca6871453378d3

- repositoryで常にサーバー側の最新状況が見える。編集はサーバーに影響なく出来る
- diffで修正内容が確認出来る
- 同時編集はlockをかけることで回避できる
- 変更履歴が確認できる

といった、共有フォルダで作業していては中々回避出来ない問題が解決できます。(バージョン管理システム共通だと思いますが)

# Perforce Helix
<img width="600" alt="Bitbucket@2x-blue (1).png" src="https://upload.wikimedia.org/wikipedia/en/thumb/8/80/Perforce-Software-Logo.png/220px-Perforce-Software-Logo.png">

svnと同じ集中型の有償システムです。
前職のやめ際に一瞬名前だけ聞きました。何それ？と思っていたんですが、ヒアリングしてみるとちら…ほら…くらいのレベルで名前を聞いたのでまあまあ利用されているのかもしれません。

有償だけあって機能は高度になっており、編集中のファイルを保留という形でサーバーに保管しておくことが出来ます。
別の人が編集中のファイルを確認しながら作業出来るってことですかね。それは集中型ならではの運用方法かもしれませんね。
(詳しくは知らないので、詳細ご存知の方補足をお願いします。)

# その他の管理方法

ついでなので、バージョン管理？そんなものいらねえやい！というこだわりを持つ方々をご紹介


## 共有フォルダのzipコードをダウンロード

それは地獄絵図。まだ更新がかからないだけましだけど、マージ時に地獄
以前出くわした際は[こんな感じ](https://qiita.com/developer-kikikaikai/items/9b70f7bc81adfca8a7e7)でgit化を試みたけど、利用者数人だったな

## 共有フォルダを直接編集

場所によっては世紀末、無法地帯

## 手マージ

エクセルとかや無負えないものはありますよね。
でも「ツールでマージしてくれるらしいね。でも信用できないから絶対手マージしろよ！」という地獄のような新人教育を見たことがあるので、自分は分別の付く大人でありたいです。