もし、異世界転生モノのチートスキルが「Gitコマンド」だったら【その１】

![car_truck.png](https://qiita-image-store.s3.amazonaws.com/0/74851/364a3c30-5041-fc09-32b2-28b9764ea4ca.png)


# この記事のゴール

以下についてざっくり理解することができる（かもしれません）。

* commitとはなにか
* checkoutとはなにか

# 本編

## 僕「好きです。付き合ってください！」

帰り道、僕は勇気をふりしぼって先輩にそう伝えた。

先輩はちょっと驚いた顔をした。

そのまま笑って、何かをつぶやく。

ーー僕は、横から突然やってきた**暴走トラック**に跳ねられたので、何も聞けなかった。


## 気がつくと、森の中にいた。

僕「ここは一体…？」

**薄暗い森の中**。

僕「そうか、僕、あの時…」

死んだのだ。

頭に霞がかかったかのようだ。思考がまとまらない。

しかし、僕はここが異世界なのだと、**何故か瞬時に分かった**。

周りを見渡すと、少しはなれたところに男が立っている。

フラフラとしたおぼつかない足取り。虚ろな瞳。痩けた頬。

明らかに憔悴しきっている。

男は虚空をしばらく見つめていた。

……そして振り絞るような声で、こうつぶやいた。

```
git checkout 5d417427edb1af2687f0d388fe7c8b04cfd559b7
```

とたん、男はまばゆい光に包まれ、消えた。

## ？？？「また、行ったのね」

背後から女性の声がした。

女性「こりない人」

そういってため息を付いた。身なりは**「よくある女神的な」**格好をしている。

その人は整った顔をしている。しかし女神とは程遠いやさぐれた表情をしていた。

女性「あら。あなたいつ来たの？」

僕「さっき…」

僕「あの、先程の、男性は？」

女性「ああ。あれね」

女性「あれは、*ターニングコミット*に*checkout*したのよ」

僕「ターニングコミット？」

ターニングコミット。checkout。どちらも聞いたことない言葉。

呆けた僕の顔を一瞥し、女性は続けた。

## 女性「人生は選択に満ちているわ」

女性「そして、選択のたびに人は、コミットするの」

![Untitled(13).png](https://qiita-image-store.s3.amazonaws.com/0/74851/36e78f0b-2711-a32a-9dc8-1fb32b9cb348.png)


女性「今の自分は、今までの自分のコミットの積み重ねで出来てる」

女性「その中でも、今後の選択に大きな影響を与えるコミットがあるの」

女性「それが、ターニングコミット。つまり、*『人生における重要な選択の時』*」

![Untitled(13) (1).png](https://qiita-image-store.s3.amazonaws.com/0/74851/16f089f1-57f1-245f-34b0-67805807ce9d.png)

女性「そして、この世界はね」

女性「選択に失敗した人たちのための、救済の世界」

女性「ターニングコミットに戻って、やり直すことができるの」

僕「やり直す。。。」

女性「まずはターニングコミットにcheckoutして、*ブランチ*を切る」

![Untitled(13) (2).png](https://qiita-image-store.s3.amazonaws.com/0/74851/5566c750-a5cc-eb8f-0e36-4a7705cab2b7.png)


女性「ブランチでしばらくコミットして、うまくいったらあなたの本当の人生に戻れる」

女性「つまり、*マージ*できるの」

![Untitled(13) (3).png](https://qiita-image-store.s3.amazonaws.com/0/74851/fc893b61-ba5d-d405-aacd-516a8741c46d.png)


女性は僕の方に体を向けた。

手には小さな羊皮紙。そしてこう続けた。

## 女性「あなたのターニングコミットはいつ？」

羊皮紙を僕に手渡した。

女性「強く、強く念じるのよ」

僕は思い出す。

やり直したかった。行きたかった。

僕が死なない世界。僕が先輩の答えを聞ける世界。

あの日の放課後、あの時あの場所にいかなければ、僕は。

きっと、先輩の答えを聞けていただろう。

目をギュッとつぶって念じる。

## チリチリという音。羊皮紙の焼け焦げる匂い。

女性「……出たわね」

目を開けると、羊皮紙には焼け焦げた文字。

```
9e417427edc1cd2687f0d311fe7c8b04cfd559b7
```

女性「これがあなたの、**ターニングコミットハッシュ**よ」

女性「大事になさい」

## 女性「良いマージができることを祈っているわ」

そういって女性は森の奥に消えていった。


やり直せる……。

やり直せるんだ。

羊皮紙を握りしめる。

僕は、震える声で、つぶやいた。

```
git checkout 9e417427edc1cd2687f0d311fe7c8b04cfd559b7
```

（つづく）

# 解説

## コミットとはなにか

コミットとは「セーブデータ」です。

![thumbnail](http://image.slidesharecdn.com/whatiscommit-170717040412/95/slide-4-1024.jpg)

（イメージ）

ただし、普通のRPGのセーブデータとは大きく異なる点があります。

**「上書き保存か」「上書き保存でないか」**

**「以前のデータに戻れないか」「戻れるか」**

という点です。

### saveの場合

![thumbnail](http://image.slidesharecdn.com/whatiscommit-170717040412/95/slide-7-1024.jpg)

同じデータに保存しようとすると、上書き保存することになるので、

上書き保存したあとは前のデータに戻ることができません。

### commitの場合

それに対し、commitは上書き保存ではなく、

**写真をとるようなイメージです。**

![thumbnail](http://image.slidesharecdn.com/whatiscommit-170717040412/95/slide-12-1024.jpg)

上図のように、冒険の書v0.1がすでにコミットされている状態だとします。

冒険の書0.2のファイルをコミット（写真をとる）すると、

![thumbnail](http://image.slidesharecdn.com/whatiscommit-170717040412/95/slide-13-1024.jpg)

冒険の書v0.2の写真がコミットとしてのこります。

重要なのは、

冒険の書v0.1のデータも残っているということです。

残っているので、**あとから冒険の書v0.1に戻ることができます**。

このような仕組みにより、

今までコミットしたところに戻ることができるのです。

### まとめた図

![thumbnail](http://image.slidesharecdn.com/whatiscommit-170717040412/95/slide-16-1024.jpg)

戻れるか、戻れないかというところが特に重要になります。



## どうやってターニングコミットに戻っているのか

先程少し触れたように、

Gitでバージョン管理すると、今までcommitしたすべての地点へ戻ることができます。

その時に使うコマンドが

```
git checkout コミットハッシュ
```

です。

コミットハッシュは、git logしたときに出てくる

```
commit 5d417427edb1af2687f0d388fe7c8b04cfd559b7
```

これです。コミットに対して一意に生成されます。


「僕」はコミットハッシュに「ターニングコミットハッシュ」を用いて、

自身のターニングポイントに戻ろうとしているわけです。


## git checkoutとブランチの切り替えについて

ここで気になってくるのが、

```
git checkout develop
```
とか

```
git checkout master
```
とか、

ブランチの切り替えにも「checkout」が使われるという点です。

**「git checkout ブランチ名」は、ブランチの移動である。**

これは半分合っていて、半分間違っています。

あくまでも、

**「git checkout は特定コミットへの移動」**

なのです。

以下の図を見てみましょう。

![thumbnail](http://image.slidesharecdn.com/whatiscommit-170717040412/95/slide-33-1024.jpg)

例えば、上記の図のようにコミットが並んでいて、

現在C5コミットにいるとします。

実は、developブランチは枝そのものではなく、

**C7コミットについた別名**です。

C7コミットの別名ですので、

```
git checkout C7
```

```
git checkout develop
```

のどちらでも、コミットの移動をすることができるのです。

![thumbnail](http://image.slidesharecdn.com/whatiscommit-170717040412/95/slide-34-1024.jpg)

ブランチは

**「その枝の最新コミットの別名」**

なのです。


## commitについてもう少し詳しく

手前味噌で恐縮ですが、以前作ったスライド資料をご参考にしていただければと思います。

[![thumbnail](http://image.slidesharecdn.com/whatiscommit-170717040412/95/slide-4-1024.jpg)](https://www.slideshare.net/carotene4035/what-is-commit)

[commitとsaveを比較してみる](https://www.slideshare.net/carotene4035/what-is-commit)


# まとめ1

* Gitでバージョン管理すると、commitした時点に戻れる

* 呪文は「git checkout」

* branchはその枝の最新commitの別名

# まとめ2

あなたの「ターニングコミット」はいつですか？