Help us understand the problem. What is going on with this article?

この時代にSVN入門

この時代にSVN入門

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

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

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

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

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

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

SVNとは

Sub VersioN ・・・ソース管理システムのこと

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

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

本来のバージョン以外の隠れた(Sub) + バージョン(Version) って意味ですね。

リリースされているバージョン以外を管理するツール(※)ですので、 過去のバージョン将来リリース予定のバージョン も管理しようというツールです。

※結果的に過去分をすべて管理するのでリリース済みのバージョンも管理していることにはなってるよ♫
ただ、本当に管理すべきは目に見えないソースってことです。
→ だってリリース済みは本番で元気にしてますからね( 本番環境で死んだときが問題ってわけです )

単語・概念の理解

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

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

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

リポジトリとは

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

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

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

トランク(trunk)

  • trunk(名詞)
    • 幹(木の幹)

tree_simple.png

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

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

ブランチ(branch)

  • branch(名詞)
    • 小枝、枝

branch.png

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

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

タグ(tag)

  • tag(名詞)
    • 付箋、名詞

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

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

操作系の単語・概念

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

チェックアウト(checkout)

  • check out(動詞)
    • 点検、検査をする
    • 本の貸出手続きをする

shinsa.png

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

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

コミット(commit)

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

yubikiri.png

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

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

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

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

更新(update)

  • update(動詞)
    • 最新化する
    • 更新する

future.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にしないといけなかったかもしれません。(どうしてプログラマってヤツは、どいつもこいつもhugahugahogehoge言うのが好きなんだ)
いずれにしても、これは問題です。

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

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

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

マージ(merge)

  • merge(動詞)
    • 混ぜる
    • 合流する
    • 併合する

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

tsukemono_nukaduke_mazeru.png

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

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

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

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

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

リバート(revert)

  • revert(動詞)
    • 元に戻す

food_alpha_mai_gohan.png

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

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

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

終わり

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away