C86(2014/8/16(日) 西地区"な"ブロック-11b)にて頒布した「Gitの使い方を、Steins;Gateの世界観を通して説明する」本、「Steins;Git」のHTML版です。

C87やそれ以外のイベントでの頒布は現在検討中です。

この書籍のハッシュタグは #SteinsGit です。

リポジトリは o2project/steins-git です。


この書籍はSteins;Gateのネタバレを含んでいます。

当サイトはニトロプラスの許可の上でニトロプラスの著作素材を引用しております。これらは他への転載を禁じます。


はじめに

Gitのロゴ

本書は「Gitの使い方を、Steins;Gateの世界観を通して説明する」ことを目的にして執筆しました。

本書の目標としては「Steins;Gateのアニメを全話見た人や、ゲームで全てのエンディングを見た人で、Gitに触れたことがない、もしくは触り始めたばかりという人が、Gitの使い方を知るきっかけになる」ということです。

そのため、Gitの全ての機能の説明をしません。自分が普段使うことが多い機能を中心に書いています。

謝辞

@kyo_ago[1]の下記のツイートにより、本書を書こうと思いました[2]

結局「シュタゲで覚えるgit」って誰も書かなかったんですか? 2013年12月19日[3]

@kyo_agoには#SteinsGit[4]というTwitterのハッシュタグを通じていろいろと助言をいただいたり、@watilde[5]と一緒にレビュー会というのを開いていただきました。

Gitter[6]というチャットサービス上では、yosiwo[7]さんに構成について助言をもらいました。

また、@GeckoTang[8]には誤字の指摘をいただきました。

その他にも「シュタゲで分かるGit」をテーマにした「Steins;Git」という薄い本をC86(コミックマーケット86)で頒布します[9]という記事を公開した際に、期待する声や欲しいという声をあげてくださった皆さんには、執筆を頑張る気力をもらいました

そして忘れてはいけないのが、今回進捗管理だったり、イラスト発注だったり、印刷業者への確認だったり、レビューだったり、さまざまな作業をしてくれたfruitsnoodle[10]と、表紙と各章のイラストを描いてくれたGiantRobot[11]さんです。

本当にありがとうございます。

本書の構成

本書は全三章とあとがきから成り立っています。

  1. 第一章では、バージョン管理とは何かということから説明し、その中でGitがどんな特徴を持っているかについて説明します。

  2. 第二章では、バージョン管理システムの中でも、なぜGitを使うのかというのを利点を提示して説明します。

  3. 第三章では、Gitで自分がよく使う機能について説明します。

  4. あとがきでは、Gitをラボメンで使うなど、複数人で使う場合に、その助けとなるサービスを紹介します。また、本書を書くにあたって参照したサイトや書籍を紹介します。

1. 第一章 - バージョン管理とはなにか

Gitについて触れる前に、バージョン管理システムについて説明します。

バージョン管理システムは、あるプロジェクト内でファイルの変更履歴などを記録しておくシステムとなります。ここでいう変更履歴とは「いつ、なにが、誰によって変更された」を指し示します。ゲームのセーブデータみたいだなと思った人はだいたい合っています。

バージョン管理システムには種類がいくつかあります。まずはGitを解説する前に、バージョン管理システムについて解説していきます。

1.1. もっとも手軽なバージョン管理

もっとも手軽かつ、よく使われるバージョン管理の手法として「ファイル名を変更する」があります。

Steins;Gateで例えると、以下の画像のように「各章のフォーントリガーがキーになるところでデータをセーブしておく」という手法を使ったことがあるという人はいると思います。

Steins;Gateロード画面

この、ファイル名を変更するバージョン管理の利点として「手軽である」ということです。

ファイルを選択した状態で、Windowsであれば F2 、Macであれば Enter を押すことで、ファイル名の編集ができます。なので、パソコンを初めて起動した直後から、このバージョン管理がおこなえます。

しかし、ファイル名を変更するバージョン管理には、問題点が思いつく限りでも三つあります。それらの問題点について一つずつ詳細に書いていきます。

1.1.1. どのファイルを更新すればいいのか分からなくなる

例えば、未来ガジェットのアイデアをひらめいてメモしたいとき、以下のファイル管理方法の場合だと岡部は「はて…どれに書き込めばよかったかな」と困るでしょう。

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

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

1.1.2. 内容を前のものに戻しづらい、または戻せない

上記で「最終版」と書かれているファイルにひらめいたアイデアを書き込んだときに、それが間違いだと分かり、元のファイルの状態に戻したいとします。しかし、元の状態がどんなものだったか思い出せず、削除しすぎて編集前に書かれていた内容も削除してしまったり、また、追記した内容を完全に消せていなかったりということがあると思います。

これをSteins;Gateのゲームに例えると、データをセーブする場所を間違えて、消したくないセーブデータが消えたという経験がある人もいると思います。

実際に自分は、ラボメンの個別エンディングを見るために残しておいたデータに、誤って別のデータを上書きしてしまい、再度やり直したということがありました。地味につらかったです。

1.1.3. 多人数での編集がほぼ不可能

例えば、岡部がひらめいたアイデアを書いたファイルを、ネットワーク上の共有のフォルダに保存していたとします。それを紅莉栖が見て、あれこれ書いて保存したと思ったら、岡部がまた新たなアイデアを同じファイルに書いて保存してしまい、結果、紅莉栖が編集した点が全て消え、元に戻せなくなります。おそらくこのことで二人は口喧嘩することになるでしょう。

1.2. 分散型バージョン管理システム「Git」について

このように、ファイル名を変更するというバージョン管理では、多人数でファイルを編集したいときに困ることになります。

また、内容を前のものに戻しづらかったり、戻せないということが往々にして起きるため、例えば誤ったファイルに上書きしてしまったときに、再度やり直し…ということがおきます。

そこで、この書籍のテーマであるGitが登場します。Gitはバージョン管理システムの中でも「分散型バージョン管理システム」といわれるものです。

1.2.1. Gitの概要

Gitは分散型バージョン管理システムの一つです。分散型バージョン管理システムにはGit以外にも「Mercurial」「Bazaar」などがありますが、この書籍では特に触れません。

Gitは「リポジトリ」という「ファイルのスナップショット[12]が保管されている場所」があります。スナップショットを保存する方法ですが、Gitには「コミット[13]」という、スナップショットを任意のタイミングで保存する機能があります。それによって、自分がおこなった作業を記録することができます。

この「コミット」ですが、Steins;Gateで例えるとゲームシステムになるのですが「セーブ」といえます。そして「セーブデータ」が「リポジトリ」です。ただし、Gitの場合はセーブデータの任意の場所に戻ることができます。それは「特定のエンディングに進もうとしてセーブしておいたデータに誤って別のデータをセーブしてしまっても戻せる」ということを意味します。

また、他人と作業内容を共有する場合は、他の人も見られる場所に共有のリポジトリを用意しておき、そこへ自分の作業内容を送信します。作業内容の送信をすることを「プッシュ[14]」といいます。

1.2.2. Gitの利点

Gitの概要でも書きましたが、作業した内容を作業前の状態に戻したいといったときでも「チェックアウト[15]」という機能を使えば、手軽に戻すことができます。またこれにより、ファイルに日付などを追加してコピーしてから編集ということをしなくて済むので、編集すべきファイルがどれなのか分からないというのが無くなります。

また、多人数での編集も「プル[16]」という「自分のPC上のリポジトリにネットワーク上にあるリポジトリの最新の内容を反映する」機能を使うことより、他の人が変更した点も自分の作業したファイルに取り込めます。

そのため、同じファイルを編集したためにどちらかの編集内容が消える…ということが少なくなります。これで岡部と紅莉栖も喧嘩しなくなるでしょう。

2. 第二章 - なぜGitを使うのか

バージョン管理システムには、分散型バージョン管理システムといわれるGitなど以外にも、集中型バージョン管理システムといわれるSVNなどがあります。

その集中型バージョン管理システムより、なぜ分散型バージョン管理システムのGitを使ったほうがいいのか、そのメリットを解説していきます。

2.1. ネットワーク接続がいらない

Gitはネットワーク上にあるリポジトリを使わなかったり、ネットワーク上にあるリポジトリを使っていたとしても、自分の手元で作業履歴を記録するぶんにはネットワークの接続は必要ありません。これは作業内容の記録(コミット)や世界線移動(ブランチ[17]移動)という、作業をする上で多くやることが高速にできるということです。

SVNを他の人と共有する形で使っていた場合、手元にリポジトリがなく、ネットワーク上にのみリポジトリがあります。そのため、ネットワークに接続できない環境では作業内容の記録や作業内容の履歴を見るといったことができなくなります。

これは、自分のPC上にリポジトリを持たないぶん、自分のPCのハードディスクやSSDに記録できることが増えることになるというメリットがありますが、一方で、ネットワークに接続できる環境がないとコミットや今までおこなった作業内容の履歴を見ることができません。

一方で、Gitでネットワークの接続が必要なときは、共有するためのリポジトリに作業内容を送るときや、逆に他の人の作業内容を受け取るときのみとなります。それ以外はネットワークの接続は必要ありません。自分のPC上で作業した内容も、ネットワークに接続をした後にネットワーク上のリポジトリに送ることで、他の人(ラボメンなど)に共有されます。

そのため、岡部はいついかなる場所でも未来ガジェットのアイデアを記録することができます。

2.2. 流行っている

SVNに比べ、Gitは流行っています。流行っているということは、それだけ皆が使いノウハウもでてきやすい状況にあるということです。といっても、言葉だけでは流行っているというのが説得力がないので、流行っていることを示すデータをいくつか紹介します。なお、これから出てくるスクリーンショットは2014年8月3日に撮られたものです。

まずはじめに、Googleトレンドで日本におけるGit、SVN、Subversion(SVNの正式名称)の人気度の動向を調べた結果です。[18]

ここではGitが登場した2005年4月から、2014年7月までのグラフを掲載していますが、2013年あたりからSVNとGitの人気度が逆転し、Gitはなお右肩上がりになっています。今後もこの傾向は変わらないと思います。

Googleトレンド

次にQiita[19]という、プログラミングやソフトウェア開発のときに使うツールなどの情報を投稿するサイトがあるのですが、そこでSVNとSubversionを検索した結果[20][21]が以下の通りになります。

QiitaでSVNを検索した結果

次に、Gitを検索した結果[22]です。SVNと比べ、まさにケタ違いの投稿数とフォロワー数(タグの新着の投稿を追っている人達)となります。

QiitaでGitを検索した結果

次にStack Overflow[23]という、プログラミングやソフトウェア開発のときに使うツールなどで分からないところを聞く掲示板のようなサイトがあるのですが、そこでタグ検索[24]でSVNを検索した結果が以下の通りになります。

Stack OverflowでSVNを検索した結果

次に、Gitを検索した結果です。SVNに比べ、タグが付けられた数が2倍以上となっています。

Stack OverflowでGitを検索した結果

以上のことから、SVNはGitに比べて流行っていると言えます。

2.3. ローカルリポジトリでいろいろと試せる

SVNは、リポジトリが共有のリポジトリしかないため、SVNの機能を気軽に試せる環境とは言えないです。

Gitは、自分のPC上にリポジトリを作れるので、そこでGitの機能を気軽に試すことができます。また、共有のリポジトリから「クローン[25]」して、自分のPC上に共有のリポジトリのコピーを作った際に、自分のPC上のリポジトリ上でテストした結果、どうにもならなくなってしまった状態になってしまっても、ふたたび共有のリポジトリを手元にクローンすれば何もなかったかのように元通りになります。

そのため、例えばまゆりや、るかが何か役に立ちたいと思って、岡部や紅莉栖からGitの使いかたを教えてもらうとなったときに、実際にGitの機能を試しながら教えてもらうことができます。

3. 第三章 - Gitの使いかた

ここまでGitとはなにか、なぜGitを使うのかについて説明してきました。もしかしたら、そろそろGitの使いかたを知りたいという人もいるでしょう。

この章では、Gitの使いかたとしてSourceTree[26]というソフトウェアを用いて、いろんな操作方法を書いていきます。

3.1. SourceTreeのインストールと設定

Gitを使うには、まずSourceTreeというソフトウェアをダウンロードします。

ダウンロードは以下のURLからおこなえます。SourceTreeはWindowsとMac OS Xに対応しています。

SourceTreeを例えるのであれば「作業履歴が積み重なった世界線を観測でき、かつ世界線改変や世界線収束などができるもの」。つまり、リーディングシュタイナー・ダイバージェンスメーター・タイムマシンをあわせもったものという感じです。ちなみに、Gitを扱えるソフトウェアの中では一番見やすいソフトウェアだと個人的に思っています。

SourceTreeのダウンロードが終わったら、次にインストールと設定をおこないます。WindowsとMac OS Xそれぞれ説明が分かりやすいページがあるので、そのページを紹介しておきます。

3.2. Gitによるバージョン管理を始める

任意のフォルダでGitによるバージョン管理ができるようにします。例えるならば、未来ガジェット研究所でタイムリープマシンが作られた状態にするものです。

SourceTreeを起動すると、以下のようなボタンがあると思います。これらのボタンのうち、一番左のボタンを押します。

SourceTreeのボタン

ボタンを押すと、いくつか選択肢が出てきますが、その内「リポジトリを作成」というのを選択します。すると、リポジトリ保存先などが表示されるので、任意のフォルダを選択します。

リポジトリ名を決めている状態

作成ボタンを押すと、空のリポジトリができます。これでタイムリープマシンが作られた状態になります。ただし、まだ何も作業内容がないので、過去に戻ったり改変したりということはできません。

リポジトリが作られた状態

3.3. すでにあるリモートリポジトリを使ってバージョン管理を始める

すでにあるリモートリポジトリを使ってGitによるバージョン管理を始められるようにします。具体的には、リモートリポジトリの完全なコピーを自分のPC上に作ります。

その前にリモートリポジトリについて、少し説明をします。リモートリポジトリとは、自分のPC上のリポジトリ以外にあるリポジトリのことをいいます。「自分のPC上のリポジトリ以外」ですが「インターネット上や誰かのPC上にあるリポジトリ」のことをいいます。

他の章で「ネットワーク上のリポジトリ」という言葉がでてきてましたが、これは「リモートリポジトリ」と同じ意味です。

このリモートリポジトリから自分のPC上にコピーを作るのがこれから説明する手順です。この手順をおこなうことにより、最初から他の人(例えばラボメンなど)と共同でタイムリープマシンを使って作業をおこなえる体制が整います。

では試しに、すでにあるリポジトリの複製を自分のPC上に作りましょう。SourceTreeを起動すると、以下のようなボタンがあると思います。これらのボタンのうち、一番左のボタンを押します。

SourceTreeのボタン

押した後「リポジトリをクローン」を押すと以下のような画面になります。「ソースパス / URL」の部分に git@github.com:o2project/steins-gate.git を入力して「クローン」を押すと「steins-gate」というリモートリポジトリの完全なコピーが、自分のPC上に作られます。

リポジトリを取得しようとしている状態

3.4. 作業内容を記録する

作業内容をリポジトリに記録します。例えるならば、セーブをするようなものです。

新規に作ったファイルの場合、最初は以下のように表示されています。

変更したファイルにチェックを付ける前

ここでチェックを付けると「ステージングエリア」と一般的に言われるところに移動します。

変更したファイルにチェックを付けた後

この状態で画面の下部にあるコミットメッセージというところに任意のメッセージを入力します。

コミットメッセージを入力する前

これで「コミット」ボタンを押すと、作業したファイルがリポジトリに記録されます。2回目以降は画面上部にある「コミット」ボタンを押すとコミットメッセージを入力する画面になります。

コミットした後

ちなみに、上記の図で「ラベル」のところに「HEAD」という文字がありますが、これは「今どのブランチにいるかを判別する情報」です。つまりダイバージェンスメーターのようなものです。

3.5. 作業内容を無かったことにする

作業内容をリポジトリに登録する前に無かったことにします。

ダルにメールをした後、岡部は秋葉原UPXで紅莉栖のタイムマシン理論についての講義を受けましたが、そこでのディスカッションで紅莉栖に完全に論破されてしまいました。

そんな論破されたということを無かったことにしたいところですが、Gitであれば無かったことにできます。方法としては、変更を無かったことにしたい対象のファイルを右クリックで選択し「リセット(Windowsの場合は破棄)」を選択します。

作業内容をなかったことにする

変更を本当に破棄していいかという画面がでてくるので「OK」を押します。

作業内容をなかったことにするか確認がされる

これで、紅莉栖に論破されたということが無かったことになりました。

論破されたことを無かったことにした後

3.6. ブランチの一覧を見たり、ブランチを作ったりする

ブランチの一覧表示をおこなったり、新たにブランチを作ったりします。この「ブランチ」という言葉ですが、シュタゲで例えるならば「世界線」となります。「HEAD」という「自分が今どのブランチ(世界線)にいるのか分かるファイル」があり、それはさながらダイバージェンスメーターと言えるでしょう。

例えば、現在のブランチが「秋葉原が電気街となり、フェイリスのお父さんが生きている世界線」だとします。その世界線で鈴羽を引き止めるために、岡部がDメールを送信しました。その場合、作業履歴は以下のようになります。

新たなブランチを作る前

ここから「鈴羽を引き止めるためにDメールを送った後の世界線」に移動します。SourceTreeの上部にある「ブランチ」を押すと、ブランチ名を入力する画面が表示されます。ここで新規ブランチのところに任意の名前を入力します。

ブランチ名を決めているところ

「ブランチを作成」を押すとブランチができた状態になり、かつ作ったブランチ(鈴羽を引き止めた世界線)に移動している状態です。世界線変動を起こした状態といえます。

ブランチを作った後

3.7. ブランチを切りかえる

現在のブランチから別のブランチへ移動します。例えるならば、Dメールを送った結果世界線変動が起こった状態を任意のタイミングでおこせるものです。

前の節でも書きましたが、Gitのブランチは「世界線」です。Steins;GateではDメールによる世界線変動は世界の状況に影響を及ぼしてましたが、Gitでは副作用なしに世界線移動ができます。

切りかえ方としては簡単で、左側にあるブランチのところから、ブランチ名をダブルクリックすることにより、ブランチを切りかえることができます。以下の図では「鈴羽を引き止めた世界線」から「萌郁がIBN5100を手に入れた世界線」に移動しています。

ブランチを移動した後

3.8. 変更をリセットする

作業した内容を無かったことにします。例えるならば、タイムリープのようなものです。

鈴羽を引き止めた世界線でいくつか作業をした結果、作業履歴が以下のようになりました。最新の作業履歴は「SERNの襲撃によりまゆりが死んでしまった…」となっています。

鈴羽を引き止めた世界線でいくつか作業した後の状態

ここで最新の作業履歴である「SERNの襲撃によりまゆりが死んでしまった…」という作業を無かったことにし、紅莉栖がタイムリープマシンを完成させたところにタイムリープします。タイムリープするためには、戻したい作業履歴の1つ前の作業履歴を右クリックで選択し「このコミットまで "ブランチ名" を元に戻す」を選択します。

git resetをおこなおうとしている状態

これで、下記の図のように作業履歴から「SERNの襲撃によりまゆりが死んでしまった…」というのが消えました。

git resetをした後の状態

3.9. 作業履歴を改変する

作業履歴を改変するコマンドです。

例として、電話レンジ(仮)を改造してタイムリープマシンができた後、萌郁やラウンダー達の襲撃により、まゆりが殺されてしまった後の作業履歴を示します。下記の図では「ラウンダーが追ってきて、まゆりが刺されて死んだ」ことが最新の履歴となっています。

まゆりが何度も死んでしまったときの作業履歴

3.9.1. コミットメッセージを変更する

では初めに、コミットメッセージを変更します。先ほどの作業履歴のうち、最新の作業履歴が「ラウンダー追ってきて」と、間に「が」が足りないメッセージになってしまっているので修正します。直したい対象の1つ前の作業履歴を右クリックで選択し「"コミット番号" の子を対話形式でリベース」を選択します。

対話形式でリベースを選択している状態

すると、対象となる作業履歴が表示されるので、コミットメッセージを直したい作業履歴を選び、下部の「Edit message」を押します。すると、下記の図のようにコミットメッセージを編集する画面が表示されます。

コミットメッセージを編集している状態

任意のコミットメッセージを書いた後「OK」ボタンを押すとコミットメッセージが修正されます。

コミットメッセージを編集し終えた状態

3.9.2. 複数の作業履歴を一つにまとめる

次に、まゆりが死んだと書かれた複数の履歴を一つにまとめます。直したい対象の1つ前の作業履歴を右クリックで選択し「"コミット番号" の子を対話形式でリベース」を選択します。

git rebase squashするべく親となるコミットを選択している状態

今回は4つの作業履歴を対象としました。ここから作業履歴をまとめるには「Squash with previous」を3回押します。「まとめる作業履歴の数 - 1回、Squash with previousを押す」と覚えるといいかもしれません。

git rebase squashしようとしている状態

その後、まとめた作業履歴のコミットメッセージを編集するために「Edit message」を押します。

コミットをまとめた後コミットメッセージを編集している状態

これで、作業履歴がまとめられました。

git rebase squashした状態

3.10. リモートリポジトリに作業内容を送る

自分がおこなった作業内容を、リモートリポジトリに送信するコマンドです。

今まで岡部は、まゆりを助けるために何度もタイムリープをし奮闘してきましたが、そのことは他のラボメンは知りません。奮闘していることを知らないままタイムリープマシンを壊そうとしても、紅莉栖に止められるのはしかたないことです。

なので、他のラボメン(今回の場合だと紅莉栖)に今まで岡部がしてきた作業内容を伝える必要があります。その手段がこれからおこなうことです。

まずは、画面上部の「プッシュ」を押します。初期設定では現在のブランチのみが選択されているので、その状態で「OK」を押します。この例では、全てのブランチをプッシュしていますが、普段使う分には現在のブランチのみプッシュしたほうが良いです。

git push前

プッシュが終わり、作業履歴に「origin/ブランチ名」という文字が表示されるようになりました。これで作業内容をリモートリポジトリに送ることができ、紅莉栖にも今までおこなってきたことが伝わりました。なお「origin」というのは、リモートリポジトリのことを指しています。

git push後

3.11. リモートリポジトリの変更内容を自分のPC上のリポジトリに取り込む

他の人がおこなった変更をリモートリポジトリから取得し、自分のPC上のリポジトリに取り込むコマンドとなります。

リモートリポジトリでは、岡部以外にもラボメンが作業しています。この例だと、紅莉栖が、岡部の様子がおかしいのでタイムリープしてきたかどうか聞いていたり、マイフォークが欲しいということを言ったということを記録していたりします。

その場合、自分のPC上のリポジトリ(鈴羽を引き止めた世界線)に比べ、リモートリポジトリ(origin/鈴羽を引き止めた世界線)が2つ進んでいます。

紅莉栖が作業している

ここで、画面上部の「プル」を押します。たいていの場合は表示された画面内の「OK」を押せば大丈夫です。

pullしてくるブランチを選んでいる状態

「OK」を押すことにより、リモートリポジトリと自分のPC上の作業履歴が同期されます。

自分のPC上のリポジトリとリモートリポジトリの同期をとった

3.12. 別のブランチでの作業内容を取り込む

別ブランチの作業内容を現在のブランチに取り込みます。例えるならば、世界線を収束させるコマンドです。

鈴羽を引き止めた世界線で作業をした結果、鈴羽がタイムトラベルに失敗し「失敗した失敗した失敗した失敗した失敗した」と何度も書いた手紙を書き残し自殺してしまいました。その結果、岡部は天王寺裕吾からその鈴羽が書いた手紙を受け取ることになります。

鈴羽を引き止めた世界線でいくつか作業をした例

そんなできごとを無かったことにするため、世界線を変動させ、鈴羽を引き止めないようにします。そのためにまず「秋葉原から萌えが消えた世界線」のブランチへ移動します。

秋葉原から萌えが消えた世界線に移動した

移動した結果、Dメールを送った状態が最新の状態となっています。ここから「鈴羽を引き止めた世界線」でおこなってきた作業を「秋葉原から萌えが消えた世界線」に統合します。方法としては、統合したいブランチを右クリックして「"統合するブランチ名" を "統合させたいブランチ名" へマージ」を選択します。

マージ対象のブランチを選択している状態

選択すると、確認メッセージが表示されるので「確認する」を押します。

マージする際の確認メッセージ

すると「秋葉原から萌えが消えた世界線」に「鈴羽を引き止めた世界線」でおこなってきた作業履歴が統合された状態になります。

マージした後の状態

ただし、まだコミットはしていない状態なのでコミットをします。ここではコミットメッセージを「尾行は中止前のメールはSERNの罠というメールを送信した」としています。

マージした際のコミットメッセージを書いている状態

コミットが完了しました。このようにDメールを送るように、ブランチ同士を統合することができます。

マージが完了した状態

あとがき

GitHubとBitbucketについて

「リモートリポジトリ」というキーワードが書籍中に何度か出てきました。このリモートリポジトリですが、例えばラボメンと共同で何か作業する(タイムリープマシンを作るなど)ときは必須になってきます。ですが、サーバーを用意してGitを設定して…という手順をおこなうのは面倒なものです。

なので、Gitの仕組みを使って、自分達が作ったプログラムコードやデザインデータなどを共有できるサービスがいくつか出てきました。それがこれから紹介するGitHub[27]とBitbucket[28]になります。 

ちなみに、この書籍もGitHubで管理されています。[29]

GitHubとBitbucket共通の仕組み

GitHubとBitbucketどちらにも、IssuesやFork、Pull Requestsという仕組みがあります。それらの仕組みについて説明します。

Issues

リポジトリにある物のバグやマイルストーン(目標)などを管理するものです。バグトラッキングシステムといわれるものです。

例えば、リポジトリにあるコードが何か予期しない動きをしたときなどにバグ報告をしたり、新しい機能を追加するときにマイルストーン管理をおこなうことができます。

Steins;Gateで言うならば、鈴羽がタイムマシンが壊れていることに気づき、そのことをIssuesに追加し、ダルが対応するという感じです。

Fork

GitHubやBitbucket上で公開されているリポジトリを自分のリポジトリとして複製する機能です。公開されているリポジトリについては、全てForkができます。

リポジトリに対して何か変更を加えたい、例えば、機能を追加したいなどや、説明書に誤字を見つけたので修正したいといったときに、Forkをして、自分の手元で変更を加えます。

Pull Requests

Forkした後にリポジトリに対し独自に変更を加えたものを、Fork元のリポジトリに取り込んでもらうように希望する機能です。

Gitは自分が管理しているリポジトリ以外に何か変更を加えたい場合、変更できる権利が必要になってきます。しかし、むやみやたらに変更できる権利を与えてしまうと、変な変更が加えられてしまう可能性があります。

このPull Requestsは、元のリポジトリを変更する権利を与えないかわりに、Fork元のリポジトリに自分が変更を加えたものを取り込んでもらうように希望することで、変更を取り込む作業をFork元のリポジトリを変更できる権利を持っている人達に委ねることができます。

その利点としては、変更できる権利をむやみやたらに与えなくて済むのと、Fork先のリポジトリで変更した点を取り込む前に確認できるので、リポジトリに変な変更が加えられてしまうのを防げるという点にあります。

参考にした資料

本書を書くにあたって、参考にした資料の一覧となります。本書を読み、よりGitについて知りたいと感じたときには以下のサイトや書籍を見てみるといいでしょう。

Webサイト

  • Gitチュートリアルとトレーニング| Atlassian[30]

  • イラストでわかる!git入門の入門 : アシアルブログ[31]

  • Git - Book[32]

  • 初心者でも分かる!git rebaseの使い方を解説します | 株式会社LIG[33]

  • 「そもそもGitって何?」、「GitとGitHubは何が違うの?」にシンプルに答えるよ - Six Apart ブログ[34]

書籍

  • シュタインズ・ゲート公式資料集[35]

  • 入門git[36]

  • 開発効率をUPする Git逆引き入門[37]

  • GitHub実践入門 Pull Requestによる開発の変革[38]

作者

  • 執筆: kubosho_[39]

  • アシスタント: fruitsnoodle[40]

  • 表紙・各章のイラスト: GiantRobot[41]

  • 発行所: 日光企画

Gitのロゴについて

  • Git Logo by Jason Long is licensed under the Creative Commons Attribution 3.0 Unported License.


1. https://twitter.com/kyo_ago/
2. ちなみに「Steins;Git」という言葉をたどると、@ruedapが2011年6月29日にしたツイートが最初かと思われます https://twitter.com/ruedap/status/82250750268420096
3. https://twitter.com/kyo_ago/status/413586733008044032
4. https://twitter.com/search?f=realtime&q=%23SteinsGit
5. https://twitter.com/watilde
6. https://gitter.im/o2project/steins-git
7. https://github.com/yosiwo
8. https://twitter.com/GeckoTang
9. http://blog.o2p.jp/2014/07/23/c86-steins-git.html
10. https://github.com/fruitsnoodle
11. pixivID:1223059
12. ソースコードなどを任意のタイミングで抜き出したもの。詳しくは http://e-words.jp/w/E382B9E3838AE38383E38397E382B7E383A7E38383E38388.html を参照してください。
13. 第三章の「作業内容を記録する」で解説しています。
14. 第三章の「リモートリポジトリに作業内容を送る」で解説しています。
15. 第三章の「作業内容を無かったことにする」で解説しています。
16. 第三章の「リモートリポジトリの変更内容を自分のPC上のリポジトリに取り込む」で解説しています。
17. 第三章の「ブランチの一覧を見たり、ブランチを作ったりする」で解説しています。
18. http://www.google.com/trends/explore#q=Git%2C%20SVN%2C%20Subversion&geo=JP&date=4%2F2005%20112m
19. http://qiita.com/
20. http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=svn
21. http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=subversion
22. http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=git
23. http://stackoverflow.com/
24. http://stackoverflow.com/tags
25. 第三章の「すでにあるリモートリポジトリを使ってバージョン管理を始める」で解説しています。
26. https://www.atlassian.com/ja/software/sourcetree/overview
27. https://github.com/
28. https://www.atlassian.com/ja/software/bitbucket/overview
29. https://github.com/o2project/steins-git
30. https://www.atlassian.com/ja/git/tutorial
31. http://blog.asial.co.jp/894
32. http://git-scm.com/book/ja/
33. http://liginc.co.jp/web/tool/79390
34. http://blog.sixapart.jp/2014-03/mttips-02-what-is-git.html
35. http://www.amazon.co.jp/dp/4047263745
36. http://www.amazon.co.jp/dp/427406767X
37. http://www.amazon.co.jp/dp/4863541465
38. http://www.amazon.co.jp/dp/477416366X/
39. https://github.com/kubosho
40. https://github.com/fruitsnoodle
41. pixivID:1223059