第一章 - 改変管理のデュバス

バージョン管理は「あるプロジェクト内でファイルの変更履歴を記録しておく」ことです。 Steins;GateやSteins;Gate 0をやるときに「章が分岐するところでデータをセーブしておき後からロードできるようにする」ことをやったことがあるかもしれません。この行為も一種のバージョン管理と言えます。

バージョン管理には次のような手法があります。

  • 自分のPC上でファイルを更新するたびにファイル名を変更する
  • NAS上にファイルを保存する。NAS上にはスナップショットという形で特定の変更が保存される
  • GitやSVNといったバージョン管理用のソフトウェアを使う

この中で特に手軽なのは「自分のPC上でファイルを更新するたびにファイル名を変更する」やり方です。 しかしファイル名を変更するだけのバージョン管理は問題点が三つあります。それらの問題点について一つずつ詳細に書いていきます。

ファイル名を更新していくバージョン管理の欠点

はじめに、どのファイルを更新すればいいか分からなくなることです。 たとえば未来ガジェットのアイデアをひらめいてメモしたいときに次の画像で示しているようなファイル管理方法の場合だと、岡部は「はて、どれに書き込めばよかったかな」と困るでしょう。

未来ガジェットのアイデアをあちこちに書いてしまった例

また「最終版」という名前が付いたファイルにひらめいたアイデアを書き込んだものの、実は「最新」と書かれているほうが新しかったという事が起こる可能性も大いにあります。

次に、内容を前の状態に戻せないことです。 岡部がひらめいたアイデアを「最終版」と書かれているファイルへ書き込んだ際に、それが最新ではないと分かり元のファイルの状態に戻したいと思いました。 しかし、元の状態がどんなものだったか岡部は思い出せませんでした。 その結果、残しておきたかったアイデアまで削除したり、追記したアイデアを完全に消せていなかったという事が起こりました。 この事象は岡部だけではなく、ファイル名を変更するバージョン管理をしている人全員に起こりえる事です。

Steins;Gate 0でも、かがりをラボメンたちの手に戻されてしまったレイエス教授が自らの脳にかがりの記憶をインストールしようとしましたが、直前でダルに記憶を消去されてしまい空の記憶で上書きされてしまいました。 これもレイエス教授が紅莉栖の記憶と名付けられた記憶で自らの記憶を上書きしようとしましたが、ダルに紅莉栖の記憶を削除されてしまったことにより、記憶を前の状態に戻せなくなってしまいました。

最後に、多人数での編集が不可能なことです。 岡部がひらめいたアイデアを書いたファイルをネットワーク上の共有のディレクトリに保存していたとします。 それを紅莉栖が見てあれこれ書きましたが、紅莉栖が書いている間に岡部も共有ディレクトリに保存していたファイルを開いて、新たなアイデアを書いた上で保存してしまいました。 その結果、紅莉栖が編集したところは全て消えて岡部が変更したところしか反映されていないという事になります。 おそらくこの事で二人は口喧嘩するでしょう。

Gitによるバージョン管理は何をもたらしてくれるのか

このように自分のPC上でファイルを更新するたびにファイル名を変更するやり方は、いろいろな問題を抱えています。 内容を前のものに戻せないという問題については、レイエス教授にとっては致命的な問題となります。

そこでこの書籍のテーマ「Git1」が出てきます。Gitは「分散型バージョン管理システム」と言われるもので「リポジトリ」という「ファイルのスナップショットが保管されている場所」があります。 Gitは任意のタイミングでリポジトリへ変更内容を記録していきます。

Gitなどのバージョン管理システムを使ってバージョン管理をするのはチーム開発においては必須と言えます。 チーム開発においてはβ世界線でタイムマシンができて世界が変わってしまったように、バージョン管理の状況やルールを急激に変えてしまう力をバージョン管理ソフトウェアないしGitは秘めています。

ではGitがどういった力を秘めているのか見ていきましょう。

任意のタイミングで作業内容を記録できる

Gitは任意のタイミングで手軽に作業内容を記録できます。 編集した内容がスナップショットという形で残されるため、特定のタイミングでの内容をファイル名を変えて保存するということをしなくて済みます。これにより編集すべきファイルがどれか分からなくなる問題を無くせます。 また特定の作業内容に戻りたいときでも「チェックアウト」という機能を使えば戻ることができます。

作業中はネットワーク接続がいらない

Gitは自分の手元で作業するときにはネットワークの接続が必要ありません。Gitはプッシュやプルといったリモートリポジトリへ作業内容を送受信するときのみネットワーク接続が必要です。 そのため普段の作業でおこなうことが多い、作業内容の記録 (コミット) や世界線移動 (ブランチ移動) などを高速におこなえます。

SVNは他の人とリポジトリを共有する場合、手元にはリポジトリの完全なコピーがなく、ネットワークのリポジトリにのみ完全な作業内容が記録されています。 自分のPC上にリポジトリを持たないため、その分ハードディスクやSSDの容量が増えるというメリットはあります。 しかしネットワーク環境が無い状況では、コミットをおこなうことや今までの作業内容を見るといったことができなくなるというデメリットもあります。

バージョン間の差分を見られる

最近、文筆業の皆さんにも知ってほしい「バージョン管理」というTogetterのまとめ2が話題になりました。 ここではWinMergeというソフトウェアを使ってファイル間の変更点の比較を見られることに対して作家さんの反応がまとまっています。 Gitでは変更点がスナップショットという形で残っているため、スナップショット間の差分を見られます。 GUIで見たいという場合でもWinMergeを使えます。

並行して複数の作業をおこなえる

Gitにはブランチという世界線のような概念があります。ブランチという概念のおかげで同じファイルを複数人で編集できます。 また編集した箇所が競合してしまった場合も「マージ」や「リベース」といった「自分の作業リポジトリ上のブランチにリポジトリの最新の内容を反映する機能」を使う事により、他の人が変更した点も取り込みつつ自分が編集した内容も反映できます。 なので、同じファイルを編集してしまったために、どちらかの編集内容が消えてしまうという事が少なくなります。これで岡部と紅莉栖も喧嘩しなくなるでしょう。

自分のPC上にあるリポジトリでいろいろ試せる

Gitは手軽に自分のPC上でリポジトリを作ったりブランチやタグを簡単に作れたりします。 たとえば、まゆりやるかが役に立ちたいと思って岡部や紅莉栖からGitの使い方を教えてもらうとします。 そのとき岡部や紅莉栖は実際にGitの機能を試しながら教えるということができます。

1. Gitの読み方は「ギット」です。これはGit FAQ (英語) https://git.wiki.kernel.org/index.php/GitFaq#Why_the_.27Git.27_name.3F を元に判断しました。
2. https://togetter.com/li/1294503