この時代にSVN入門

# この時代にSVN入門

皆さん、テーマからお分かりの通り、 __「今の時代にSVNに入門する記事なんて需要がない」__ とお思いのことでしょう。  

__「今更SVNに入門するくらいならGitやれよ」__
……返す言葉もございません。  

ただ、私は気付いてしまったのです。  

・・・そう！レガシー環境を守り続けるガーディアン達( ~~__老害じゃないよ、決して!!断じて違う!!__~~ )が今も稼働しているのです！！

そして、配属された新人たちは過去記事(最新でも2015年とかのレベル)を読み漁って頑張ってSVNに入門しているのです。

この記事は、時代の流れはGitだし、自分もGit大好きだけど、~~可愛そうな~~ 新社会人のためにもわかりやすく__SVNの概念__を説明するよ♫
あくまで概念レベルなので具体的な手順が知りたい方は他の記事へどうぞ♫

# SVNとは

## __Sub__ __VersioN__ ・・・ソース管理システムのこと

~~毎回思うけど、省略の仕方無理やりすぎるよね~~

- Sub(接頭語)
    - 潜在的な、代わりの
- Version(名詞)
    - バージョン

<u>__本来のバージョン以外の隠れた(Sub)__</u> + <u>__バージョン(Version)__</u> って意味ですね。  
リリースされているバージョン以外を管理するツール(※)ですので、 __過去のバージョン__ も __将来リリース予定のバージョン__ も管理しようというツールです。  
※結果的に過去分をすべて管理するのでリリース済みのバージョンも管理していることにはなってるよ♫ 
ただ、本当に管理すべきは目に見えないソースってことです。
→ だってリリース済みは本番で元気にしてますからね( __本番環境で死んだときが問題ってわけです__ )

# 単語・概念の理解

IT業界って色んな単語・概念が出てきて困惑しますよね。
理解できなくても操作できればいいや、って指導が多い気がします。
ちゃんと理解してから進んだほうが後から楽になれる気がします。
~~(↑私の指導者が原因かもしれない・・・)~~

- 単語・概念のリスト
    - リポジトリ(repository)
        - トランク(trunk)
        - ブランチ(branch)
        - タグ(tag)
    - 操作系
        - チェックアウト(checkout)
        - コミット(commit)
        - 更新(update)
        - 競合(conflict)
        - マージ(merge)
        - リバート(revert)

~~どの教本やサイトを読んでも、updateとconflictだけ日本語なの違和感に感じるの私だけなんだろうか・・・。~~

## リポジトリとは

- repository(名詞)
    - 貯蔵庫
    - 倉庫
    - 宝庫

<u>__大切なモノを保存する場所__</u>って意味ですね。
プログラマにとって一番大切なもの、それは __ソースコード__ に違いありません。
(ビルド後のバイナリデータ(例exe、dllなどなど)なんて、 __もとのソースコードさえあれば__ 簡単に復元できますからね※1)
※1. この記事では省きますが、「無視リストの設定」に話が繋がります

リポジトリには以下の３つがあり、それぞれ用途によって使い分けるのが通例(マナー)です。
__※マナーなだけなので、 ~~オソマツな~~ 型破りな使い方をしている案件もあると思いますが、目をつぶりましょう。「郷に入っては郷に従え」です。__ 
~~大体そういう使い方してる現場は、「面倒だから」「そういう慣習だから」「前からこうだったから」とかいって自分の技術不足や勉強不足を棚に挙げていやがるんだ！！~~

## トランク(trunk)
- trunk(名詞)
    - 幹(木の幹)

![tree_simple.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264107/8e096667-c560-1da7-e0c5-114324d0161c.png)

リポジトリの __大事な幹の部分__
つまり、 __リリース済みのソース(当然過去分を含む)が眠っている場所__ です。
(ちなみにリポジトリは貯蔵庫って意味ですが、基本的に __木__ をイメージしてください。 __ソースが成長する様子を木に見立てているんです__ )

したがって、<u>__トランク上で開発なんてしちゃいけません！！メッ！！__</u>
__(※筆者はトランク上で開発しているプロジェクトを幾度となく見ています。はっきり言って意味がわかりません。怖くてできないよ・・・？普通)__

## ブランチ(branch)
- branch(名詞)
    - 小枝、枝

![branch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264107/03229574-4a34-a711-b2a5-e1c9935157eb.png)

リポジトリの __枝葉の部分__
つまり、 __上に向かって伸び続けて将来幹になるかもしれない部分__ です。

したがって、開発は原則としてブランチ上で行います。
__将来幹になるかも__ と書いたのは、 ~~暴風雨によって折れる~~ お客様からの要望のいかんによっては開発を取りやめることも多いからです。

### タグ(tag)
- tag(名詞)
    - 付箋、名詞

木の幹に __「身長の高さ」を刻んだこと__ ありません？あれです。
<u>__何歳のときにどんなだったかを記録しておくための目印__</u> だと思ってください。

したがって、 __リリース済みのトランクをいつ、どの状態でリリースしたよ__ という目印をつけておくものです。
<u>__完全に記録用に作るもの__</u> ですので、ここで作業なんかしちゃいけません。

# 操作系の単語・概念
ここからは操作になるので、一旦木のイメージは終わりです。
実際にどうやって使うのかを単語の理解とともにしていきましょう

## チェックアウト(checkout)
- check out(動詞)
    - 点検、検査をする
    - 本の貸出手続きをする

![shinsa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264107/5ea44ca0-d6f0-7a3c-0d46-8718fc9c5ee8.png)

意味合い的には、 __点検、検査__ です。
リポジトリから __お宝を取り出して ~~弄り倒すぞ！！~~ 問題がないか確認する__ ということです。

実際の操作としては、 __リモート(SVNサーバ上)に存在するソースをローカル(自分のPC)に持ってくることです。__
基本的にチェックアウトするのはブランチのみです
__※トランク弄っちゃ駄目、絶対！！__ ~~と言いつつ画像がトランクなの良くないですね・・・~~

## コミット(commit)
- commit(動詞)
    - ~~__結果にコミット！__~~ 言いたかっただけ
    - 完遂する
    - 責任を伴う約束をする

![yubikiri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264107/6a0796d2-b702-2ad7-8981-986d67b32eb3.png)

__「結果にコミット」とは死ぬ気の本気で結果を達成するぜ！！__ という熱い意味だったんですね。

つまり、 __この修正は本当に大丈夫な奴でリリースしても大丈夫だよって約束すること__ です。
(※往々にして大丈夫ではないことの方が多い)

具体的には、__リモート上に修正点をアップロードすること__です。
コミットをコツコツ積み重ねることでブランチを伸ばしていきます。圧倒的成長です。
ただし、__あくまでも熱い約束__ですのでこれが幹になるかはわかりません。

__途中で問題ありとされたコミットは取り消されることもあります。__
でも、それで良いんです。取り消されることを下手に怖がっても仕方ありません。ぎゃーぎゃー騒ぐやつは気にしないようにしましょう♫
__取り消されるよりも途中経過が残らないことの方がよっぽど問題なので。__ どうせ取り消しのログが少し増えるだけです。

## 更新(update)
- update(動詞)
    - 最新化する
    - 更新する

![future.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264107/e968d862-7d8b-8bfb-4500-9dc602662907.png)


```up to date```と言えば想像できるでしょうか？
__過去から未来(上)に向かって線が伸びている様子をイメージ__すると分かりやすいですね。

SVNを利用するということは、__他のメンバーも同時に開発し、コミットしているということ__です。
知らないうちに自分のソースは他のメンバーの加えた修正が入っていない古いソースになっているかもしれない・・・。

__・・・そこで！！更新を行うわけです！！__

つまり、__リモート上の最新の状態をローカルにダウンロードすること__です。
これを頻繁に行っていないと、以下のような惨事を招きます。※
(※実際には、後から説明する__マージ__によって解決できます。ここがバージョン管理ツールの強みです！！)

- 例)
    - 2019/03/30
        - hoge.txtの内容(リモート)
            - ```hello world```
    - 2019/04/01 Aさんが```hoge.txt```をローカルで編集
        - hoge.txtの内容(ローカル)
            - ```Hello Hoge```
    - 2019/04/02 Bさんが```hoge.txt```をローカルで編集し、コミットまで行う
        - hoge.txtの内容(ローカルとリモートが一致！！)
            - ```hello huga```
    - 2019/04/03 Aさんがやっと```hoge.txt```をコミット
        - hoge.txtの内容(リモート)
            - ```Hello Hoge```
            - あれ？？？Bさんのやった修正はどこへ消えた・・・？？？ 

もしかしたら、```hello huga & Hoge``` にしないといけなかったかもしれないし、```Hello HugaHoge```にしないといけなかったかもしれません。(~~どうしてプログラマってヤツは、どいつもこいつも```hugahuga```、```hogehoge```言うのが好きなんだ~~)
いずれにしても、これは問題です。

このように祖先は同じでも派生の順序がおかしい状態を__競合(conflict)__ と呼びます。
簡単に言うと__一緒に操作しちゃったから、どっちが正しいのか分からない状態__です。

最後にコミットした方が正しいかと言われてもそうではないし、先手必勝ってわけでもないでしょう。
こうならないためにも、__頻繁に更新を行うこと__や__コミュニケーションを取り合うこと__は大切です。

とはいえ、どうしても競合は発生してしまうものです。仕方ないのです、そういうものです。
__だからバージョン管理ツールがあるんです！！__

## マージ(merge)
- merge(動詞)
    - 混ぜる
    - 合流する
    - 併合する

__複数の存在を混ぜて一つの正しい姿にしてあげるということ__です。
さきほどの競合が発生している場合は、マージを行って正しい姿にしてあげましょう！

![tsukemono_nukaduke_mazeru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264107/14de177c-26ec-c699-a455-1bed9627b3b2.png)

しかし、__マージは競合が発生したときに行うだけではありません！！__

__ブランチをトランクに反映することもマージと呼びます！！__ややこしいね！
この段階ではブランチもリリース済みになっていることが多いです。

なぜマージと呼ぶかといえば、__複数の開発が同時に走っている場合は他の案件(ブランチ)が先にリリースされてる！！__なんてことはよくあることです。(大概、後からリリースする開発者が頑張ってマージをする羽目になる)

当然ながら、__複数の案件で同じファイルへの修正があって競合している__なんてこともよくあります。

ちなみにもともと__２つのものを１つにするって意味__ですので、__競合していなくてもマージです。__

## リバート(revert)
- revert(動詞)
    - 元に戻す
 
![food_alpha_mai_gohan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264107/101a3d7c-5d3e-9829-5603-f442fc982261.png)

※アルファ化米とは、水を入れることにより元の形状に戻せる保存食のこと(from いらすとや)
~~__なんでこんな画像おいてるんや・・・__~~ __ありがとう、いらすとや！！__

これは言うまでもなく、__ブランチを特定のバージョンまでリセットすること__です。
元に戻すとは言え、実際には__昔の状態で上書きをする__だけですので、__一度間違えて修正した履歴は残ります。__
履歴を残すためのツールですので、前述した通りリバートしても気にしないでいきましょう！！

特にこの記事を読んでいる人は新人さんたちのはずですので、__失敗は成長の源__です。
どんどん失敗して成長していきましょう！！

# 終わり
最後まで読んでくださり、ありがとうございました。
~~やっぱりGitにしたいよね？~~