【RStudio】Gitに恋してバージョン管理 ～ 基礎篇 〜

# 1. 趣旨

最近になって、Rのスクリプトやプロジェクトの管理をGitで始めました。

いや～～～～～非常に便利。
僕の中ではイノベーション。
これはスクリプト書くのが楽しくなる。

ということで、<B>「Gitって何？食べられるの？」</B>という過去の僕に向けた超入門。
GitとRStudioとの連携については、意外と超初心者向けのサイトが少なかったので、需要あるといいなぁ～～～。





## 留意点

- この記事は、<B>RStudioでプロジェクト管理を行うための超最低限のこと</B> しか書いてません。Python等その他の環境での利用については全く考慮していません。
- 肌感覚での理解で書いてます。厳密・正確な文言や使用法ではないかもです。
- この記事は **僕のようなマジの初心者向け** なので、Gitがある程度分かるという人は、この記事よりもコチラの記事のほうが参考になります。<BR>[RStudioではじめるGitによるバージョン管理 - Qiita](https://qiita.com/uri/items/6b94609f156173ed43ed)

## 環境

- Windows 10 x64
- R 3.6.2
- RStudio 1.2.1335

# 2. Git × RStudioでできること

多分この記事を開いてる時点で、多少Gitやプロジェクト管理に興味がある状態のはずですが、改めて。
RStudioとGitを連携させて何ができるかと問われれば、 <B>ずばり！バージョン管理です。</B>具体的には、こんなことができます。

- スクリプトの変更履歴の保存
- プロジェクトのバックアップ・復元
- パソコン間（ノート・デスクトップ）でのプロジェクトの同期

**ね？なかなか魅力的でしょ？** かくいう僕も院生フレンズに教えてもらったのですが、慣れるとプロジェクト全体のバックアップにもなるし、スクリプトを書くのがすごーく楽しくなる。

<B>しかーし！</B> 「Gitって何だ？」という僕にとっては中々難しく、用語も沢山出てくるので、最初は全く訳のわからないままブランチ<font color="LightGray">（ほらね出てきたよ、、、）</font>を大量に切ってしまったり、いつの間にかmaster<font color="LightGray">（まーた知らないコトバが出てきたよ、、、）</font>が消えたり、それはもう散々な目に遭いました。

「愚者は経験に学び、賢者は歴史に学ぶ」なんて言いますが、愚者たる僕の経験を歴史として笑って、<B>皆さんは賢者になってください。</B>

## Git導入前のぼく
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/618862b3-1a9a-4dae-a5ac-1e727c3504d3.png" width = "250px">

今まではスクリプトを書き直すたびにファイル名を変更してバックアップを取ってましたが、こんな問題点がありました。

- どれが最終版？
- 他人が作成したコードって自分のに反映したっけ？
- このファイル、消して良いのか？
- そもそも何を修正したんだっけ？
- 前のバージョンに戻りたいんだけど、バックアップしてない・・・。

こういう問題が発生すると、僕の研究へのモチベーションが一気に下がるので、どうしてもモチベーションの維持のためにラーメン二郎を食い、結果として財布は痩せて身体は太ります。
~~スクリプトの管理もできない奴が、モチベーションと身体と金銭まで管理できるわけがない。~~

## Git導入後のぼく

![sugee.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/badca999-6fdc-845a-24c8-be6cd69bcd96.png)

**どうですよ。このデキるオトコ感。**

- 最終版がどれか分かる。
- 変更の概要をメモできる。
- 変更者・日付などは自動で記録される。
- スクリプトのどこに変更が加えられたかという変更履歴が一目でわかる。
- コードの修正等を別プロジェクトとして管理し、反映させることができる。<BR>それを視覚的にも把握できる。
- いちいちファイル名を変更していくつもファイル作ったり消したりして管理する必要もない。
- 必要であれば、過去のバージョンに遡れる。
- スタバで開くとカッコいい。（検証済）
- モテる。（要検証）

<B>さあ、僕と一緒にGitを習得する気になりましたか？</B>

# 3. Gitとは何なのか

Git自体については僕が説明するより、とても分かりやすい説明を引用させていただきます。

> Gitはテキストファイルなどのバージョン管理を行うためのソフトウェアであるとよく言われます。バージョン管理は、ファイルの変更内容や変更履歴を保持しておいて、あとから古い状態に切り戻したりできるようにするためのものです。
つまり、「あぁ……この文章、変える前の方が良かったなぁ……前の状態に戻したいなぁ……」となった時に、前の状態まで（変更がコミットされていれば）復元できるようにするためのものです。
> - [君には1時間でGitについて知ってもらう(with VSCode) - Qiita](https://qiita.com/jesus_isao/items/63557eba36819faa4ad9)

Git自体はRやRStudio専用というわけではなく、むしろプログラミング全般で使われる管理ソフトです。
もっと活用すると共同作業の管理なども可能ですが、今回はわかりやすさ重視のため想定利用者は自分自身だけとします。

あと細かい説明は省きますが、<B>GitとGitHubは別モノです！</B>
連動させることも出来ますが、設定しない限りは関係ないです。

# 4. Gitのインストール

こちらからダウンロード。
https://git-scm.com/

基本的に指示に従っておけばOKです。
途中、PATHに関するオプションを聞かれますので、真ん中の`Use Git from the Windows Command Prompt`を選択してください。
![git-install06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/627313ce-665a-9b22-9be5-11fc7bd636ad.png)
画像：https://zero-config.com/windows/install-git-win-001.html より拝借。

何かオプションなどで困ったら、こちらを参考にしてみてください。
[【初心者向け】Gitのインストール方法をわかり易く解説（画面付き）](https://eng-entrance.com/git-install)

## ユーザー情報の登録

><i>**! ATTENTION !**</i>
>**この作業は省略できません！必ずやっておいてください！**
>**省略してしまうと、ファイルのバージョン管理ができません！**

インストールが完了したら、<B>コマンドプロンプトを起動</B> して、次のように入力してください。
これらの情報はネット上ではなくローカルに保存されるので、<B>GitとGitHub等と連動させない限りユーザー名もメアドも公開されないので安心してください</B>。

ユーザー名は本名以外でもOKです。


```
git config --global user.name "ユーザー名"
git config --global user.email メールアドレス
```




なお、後々GitHub等との連携を考えている場合は、ユーザー名については公開されることがある点に留意してください。
メアドについては、公開 / 非公開の選択が可能ですが、デフォルトでは公開されます。
どうしても気になる方は、捨てアドを作って登録するという選択肢もあります。

また、GitHubと連動させていることが前提ですが、メアドの非公開化については、以下を参考にしてください。
[GitHubのメールアドレスを非公開に設定する - kina&#39;s tech memo](https://kina.qrunch.io/entries/adPYWfR4yFOKxZSV)


これで準備OKです。

# 5. RStudioと連携させよう

さあ、インストールとユーザー情報の登録が完了したらRStudioとGitを繋げましょう！
初めての方は理解のために、まずは新規プロジェクトのパターンから始めることをおすすめします。

## 新規プロジェクトの場合

`File > New Poject`で新規プロジェクトを作成します。
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/8f39b3a6-05cc-9d5f-97e7-33f413c11805.png" width = "300px">

一番上の`New Directory`を押すと`Project Type`を聞かれるので、`New Project`を選択します。
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/c692b1bb-3161-e020-6bc8-446b062da410.png" width = "550px">


`Directory name`には管理するディレクトリの名前を入力し、その親ディレクトリ（作業フォルダをどこに作成するか）を選択します。好きなように入力・選択してください。
そして、**`Create a git repository`のチェックを忘れずに！**
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/ab285ac1-df8c-b714-e1b3-82817da2d9e9.png" width = "550px">

`Create Project`を押して、黄色い丸のようになってればOKです！

![complete.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/e674a632-4678-1b13-7e62-ed3ec4028c90.png)


# 6. 「Commit」＝変更を記録する

何でもいいので、スクリプトを作成して保存しましょう。
何でもいいと言われちゃうと困っちゃう可愛い子には、~~スーを差し上げます~~雑なコードを差し上げます。

```R:iris.R
plot(iris$Petal.Length, iris$Petal.Width)
result <- lm(Sepal.Length ~ Sepal.Width, data = iris)
summary(result)
```

保存まで終わったら、右上のGitタブを開いてみましょう。こんな風になっていると思います。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/66f11686-aac5-de30-87de-41b4646cd56d.png)


この二つ並んだ`？`のアイコンは`Status`と言います。左側がGitの状態、右側がディレクトリの状態を表します。
`？`アイコンが2つ並んでいると、そのファイルがGitによる管理の対象になっていないことを意味します。
なので、Gitに「このファイルの変更を追ってください！」とお願いしましょう。

Gitでいう`Commit`とは、簡単に言うと、<B>Gitにファイルの変更を記録すること</B> をいいます。
近くに`Commit`というボタンがあるので押してみましょう。`Review Changes`ウィンドウが立ち上がります。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/b521f9e9-361a-ec9b-a521-78e87610bbcd.png)
こんな画面が出てきたら、`Staged`にチェックを入れましょう。
すると、先ほどまで`？``？`だったアイコンが`A`になりました。
`A`は`Added`の略で、変更の追跡対象を追加することを意味します。

右上の`Commit message`には、変更の記録の概要などをメモできます。
とりあえず何でもいいので書いておきましょう。日本語もOKです。

ここまで出来たら、`Commit`ボタンを押しましょう。
コマンドプロンプトっぽいのを閉じると、先ほどまで左上にあったファイルたちが消えていれば完了です。


※`Status`のアイコンの詳細な意味は[コチラ](https://qiita.com/uri/items/6b94609f156173ed43ed#%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B)を参照してください。

## スクリプトを書き換えて変更を記録してみる

先ほど作成・保存したスクリプトを、何でもいいので一部を適当に変えて上書き保存してみてください。
僕の作った例の雑コードは、線形回帰の関数`lm()`の説明変数と目的変数を入れ替えてみました。

```R:iris.R
plot(iris$Petal.Length, iris$Petal.Width)
result <- lm(Sepal.Width ~ Sepal.Length, data = iris)
summary(result)
```
上書き保存すると、`Status`の右側（ディレクトリ側）に`M`アイコンが灯りました。`M`は`Modified`の略、つまり変更が加えられたということを意味します。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/f7406283-5b3c-88b2-ab30-b384b97d9cff.png)

では、この変更をGitに記録させましょう。
先ほどのように`Commit`を押して`Review Changes`ウィンドウを開いてみましょう。
`Review Changes`ウィンドウでは、どこに変更が加えられたか、一発でわかるようになっています。赤色が変更前、緑色が変更後です。


そして同じように、チェックを入れて変更の概要を記述します。
チェックを入れると、`M`が右から左に移るのが確認できると思います。これは、「Commitする（変更を記録する）とGit側で管理しているファイルをModified（変更）しますよー」ということを意味します。<B>チェックを入れただけの段階ではまだGit側には変更は記録されず、`Commit`ボタンを押すことで初めて変更がGit側に記録されます。</B>

ちなみに、さっきからチェックを入れている`Staged`とは、対象を変更の記録をGitに反映させることを意味します。<B>「まだこのファイルの変更はGitに記録したくないんだよなー」</B>というときは、チェックを入れなければ記録されません。チェックしたファイルの変更だけがGitに反映されます。

ではでは、押してみましょう。
先ほどのようにファイル欄がクリアになったら成功です。

# 7. 変更履歴を確認したい

- いつ、どのような変更を加えたか
- 過去のバージョンを見たい・保存したい

などを知るために、`History`を確認しましょう。
先ほど開いていた`Review Changes`ウィンドウの左上にある`History`をクリックするか、RStudioのGitタブにある時計マークをクリックします。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/47623117-a873-1019-91d4-b9dc0c96631f.png)
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/03892ce7-fdb1-790e-6656-af15a43ad412.png)

`History`では、

- ファイルの過去バージョンの参照
- 変更履歴のメタデータ（日付・作成者など）の確認
- Commit messageの閲覧
- 前バージョンからの変更点の確認

などが出来ます。

ウィンドウの下半分には、選択したバージョンの、ひとつ前のバージョンからの変更点が記載されます。前バージョンから変更点がない場合は載らないので留意してください。

![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/336399e1-37ab-5ed7-676d-1d8f150e251b.png)

もしファイル数が膨大だったり内容の変更が多い場合など、スクロールして探すのが面倒な場合は、見たいファイルをクリックするとジャンプできます。`iris.R`の変更点が見たい場合は、下の画像の赤丸部分をクリックです。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/c7d48120-cab3-640e-af08-7dee8f2d7a98.png)



# 8. バージョンを戻してみよう

バージョン戻しはざっくり以下の2つあります。

- Commitを押しちゃったけど、それ以前の作業履歴まで遡りたい場合。 
- まだCommitを押してなくて、作業前の状態（直近のCommitを押した時点）まで遡りたい場合。


## 直近のCommitより過去まで遡りたい場合
<B>Commitを押しちゃったけど、やっぱりCommit押す前のほうが良かった！<B>という場合、Gitを使ってると簡単に過去のバージョンに参照できます。

戻し方は色々ありますが、ここは一番ベーシックなやり方でやってみましょう。
今回は、スクリプトファイル（`iris.R`）を`initial commit`（最初のコミット時点）まで復元しましょう。

<B>1. Historyで戻したいポイントを参照する</B>

今回は`initial commit`まで遡るので、その時点の履歴を参照しましょう。

![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/c1905b33-d2b7-4dae-76b7-05929b2ecaf6.png)

<B>2. 戻したいファイルのView fileをクリック</B>

下の画像のように、過去のバージョンを閲覧できるリンクがあるのでクリックして開きましょう。

![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/0dba8ea5-6a41-6156-e2c9-fe2d611cbe7b.png)

すると、過去の状態のものが表示されます。これを上書き保存しましょう。

![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/663f7755-8903-bc76-5630-8d9470a92030.png)

RStudioに戻ると、スクリプトに変更が加わったことによる`M`が表示されたことを確認できます。あとは、これを再度`Commit`させれば完了です。

![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/16cb0241-9839-4c1f-2e7a-13c087ca8662.png)

## Commit押す前で、直近まで遡りたい場合
例えば、<B>今日の作業、失敗だったなーーー。今日の作業はなかったことにしたいなーーー。</B>という場合。
かつ、<B>まだ失敗した作業内容をGitに記録させてない（Commitを押していない）場合<b>。

この場合は、とても簡単で手軽です。
先ほどのスクリプトを、今度はこうしてみましょう。書いたら <B>ファイルは上書き保存しますが、`Commit`はしないでください。</B>右列に`M`と表示されていればOKです。

```R:iris.R
plot(iris$Petal.Length, iris$Petal.Width)
result <- lm(Sepal.Length ~ Sepal.Width, data = iris)
summary(result)
# いらないメモ
```

この`# いらないメモ`を書く前の状態に戻したい場合、つまり、以下のような直近でCommitした時点のバージョンに戻したいということです。

```R:iris.R
plot(iris$Petal.Length, iris$Petal.Width)
result <- lm(Sepal.Length ~ Sepal.Width, data = iris)
summary(result)
```

例のごとく、`Review Changes`ウィンドウを開きましょう。

今回は`Commit`ではなく`Revert`というボタンを押してみると、「選択したファイルの変更が失われるけどいい？（超意訳）」とお尋ねが来るので、元気よく`Yes`を押しましょう。

![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/99cc2a16-b036-bb4c-51b0-2a62b7dbabf7.png)

するとあら不思議。元通りに戻りましたとさ。めでたし。

![17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/2ccc198f-4dd0-fbc3-6444-5472493f99e1.png)

# 9. まとめ

ここまでが僕的エッセンスです。

とりあえず一人で作業をする分にはここまででも十分かなーーーと思います。
これ以降はQiitaで検索するかググればなんとかなるかも。
<B>活用しよう、集合知。</B>


とりあえずブランチとかプルとかブッシュとか、そういう概念を知らなくても、RStudio上でプロジェクト管理ができましたね。
かくいう僕は、GitHubとも同期させて、自宅のデスクトップとノートPCで変更を共有させてます。
そういう使い方まで書きたかったのですが、それは機会があればまた書きます。

Enjoy!

おしまい。

## 今後追加したいコンテンツ

余力があれば、今後この辺のコンテンツを追加したいと思います。
別記事にするかもしれません。

- 既存のRプロジェクトをGitで管理する
- ブランチとは何ぞ
- GitHubとの連携
- Push・Pullとは何ぞ

なお、この辺について知りたい方は、他の方の記事にあると思いますので、是非調べてみてください。


# 10. 参考文献

- [Git でユーザー名とメールアドレスを設定する方法（全体用とプロジェクト用） | ラボラジアン](https://laboradian.com/set-git-user-and-email/)
- [GitHubのメールアドレスを非公開に設定する - kina&#39;s tech memo](https://kina.qrunch.io/entries/adPYWfR4yFOKxZSV)
- [IT苦手な人のためのWindows+gitでRStudioによるバージョン管理入門 - Analyze IT.](https://eulerdijkstra.hatenadiary.org/entry/20130327/1364392046)
- [RStudioではじめるGitによるバージョン管理 - Qiita](https://qiita.com/uri/items/6b94609f156173ed43ed)
- [Version Control with Git: Using Git from RStudio](https://rrlove.github.io/git-novice-topdown/14-supplemental-rstudio/)
- [君には1時間でGitについて知ってもらう(with VSCode) - Qiita](https://qiita.com/jesus_isao/items/63557eba36819faa4ad9)
- [【初心者向け】Gitのインストール方法をわかり易く解説（画面付き）](https://eng-entrance.com/git-install)