Ruby on Rails チュートリアル 第1章で学んだMVCモデルとGit

MVCモデルとは
--
Model View Controller の略。それぞれ以下の役割がある。
<ul>
 <li>Model : データベースから引っ張ってきたデータを表化する
 <li>View : HTMLをWebページとして表示する
 <li>Controller モデル&ビューとクライアント側のブラウザに表示する部分の仲介役。クライアントがサーバーにリクエストする際の処理を担っている。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1592334/0c6d544f-236d-39f1-8e18-722832dbc065.png)

ブラウザがRailsアプリと通信する際、一般的にWebサーバーにリクエスト（request）を送信し、これはリクエストを処理する役割を担っているRailsのコントローラ（controller）に渡される。コントローラは、場合によってはすぐにビュー（view）を生成してHTMLをブラウザに送り返す。動的なサイトでは、一般にコントローラは（ユーザーなどの）サイトの要素を表しており、データベースとの通信を担当しているRubyのオブジェクトであるモデル（model） と対話する。モデルを呼び出した後、コントローラは、ビューを描画（レンダリング）し、完成したWebページをHTMLとしてブラウザに返す。

Git まじ便利！
-
扱い手順は以下のステップで行う。
① Gitを導入するためにシステムセットアップを行う。
~~~
$ git config --global user.name "Your Name"
$ git config --global user.email your.email@example.com
~~~

②登録するアプリのルートディレクトリに移動後、`Git init`でリポジトリの初期化を行う。
~~~terminal
$ cd ~/environment/hello_app    # ディレクトリに移動済みの場合は不要
$ git init
 Reinitialized existing Git repository in     
/home/ubuntu/environment/hello_app/.git/
~~~
※リポジトリが「再初期化された（Reinitialized）」というメッセージが出る。

③プロジェクトファイルを **リポジトリ**(ソースコードを保存する場所)に追加
 ~~~
$ git add -A
~~~
-Aを打つことにより、現在のディレクトリにあるほぼ全てのファイルが追加される。
ただし、`.gitignore`に書かれているパターンにマッチするファイルは追加されない。

また、安全のためaddコマンド後はいきなりコミット（保存）しないよう、**Staging** と言う一種のコミット待ち状態になる。
ステージングの状態を知るには
~~~
$ git status
~~~
を打つ。

④ ステージングにあるファイルをリポジトリにコミット（保存）する
~~~
$ git commit -m "ここにコミットメッセージを書く"
~~~
ちなみに、`git log`コマンドでこれまでのコミットメッセージの履歴を確認することができる。

Gitのメリット
-
例えば以下のコマンドでディレクトリを削除してしまった場合
~~~console
$ ls app/controllers/
application_controller.rb  concerns/
$ rm -rf app/controllers/
$ ls app/controllers/
ls: app/controllers/: No such file or directory
~~~
現在の状態を確認してみる
~~~console
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    app/controllers/application_controller.rb
        deleted:    app/controllers/concerns/.keep

no changes added to commit (use "git add" and/or "git commit -a")~
~~~
ファイルがいくつか消えちゃったけど、**まだコミットされてない** から簡単に元に戻せる！
~~~console
$ git restore .   #保存前に戻す
$ git status
On branch main
nothing to commit, working tree clean
$ ls app/controllers/
application_controller.rb  concerns/
~~~
削除してしまったディレクトリやファイルが、無事に復旧！

### Gitのブランチ（Branch）

**ブランチ** とは基本的にはコード全体のコピーで、元のコードにいつでも戻れる状態を維持しながら、新しくコードを追加したり変更したいときに便利。通常、大元のコードがあるリポジトリは **main**ブランチと呼ばれ、ブランチを新たに作りたいときは`switch`と`-c`オプションで作成する。新たに作成されたブランチを **トピックブランチ**と呼ぶ。
~~~console
$ git switch -c modify-README #新しいブランチを作成して同時にブランチを切り替える--①
Switched to a new branch 'modify-README'
$ git branch     #今どこにいるか確認できる
  main
* modify-README 
~~~
`modify-README`ブランチに「*」が付いているので、現在は`modify-README`ブランチにいることが分かる。
`modify-README`ブランチで行った変更は`main`ブランチに影響しないため、たとえば試行錯誤を繰り返してコードがめちゃくちゃになってしまっても`main`ブランチに戻れればいつでも元の状態に戻るし、もしもう一度書き直したい場合は`modify-README`ブランチごと削除することもできる。

トピックブランチを作ったら好きに編集する。

### コミット（Commit）する。

変更が終わったら、`git status`コマンドで現在の状態を確認する。
 ~~~console
$ git status
On branch modify-README
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
~~~
README.mdの変更が確認されている。
この変更をリポジトリに追加する。
 ~~~console
$ git commit -a -m "improe the README file"
[modify-README ea72c6c] improe the README file
 1 file changed, 4 insertions(+), 23 deletions(-)
~~~
このコマンドでは-a(リポジトリ追加)と-m(コミット)を一緒に行っている。便利！
ただし、このコマンドでは一回でコミットまでしちゃってるので打つときは注意が必要。

### Gitのマージ（Merge）
ファイルの変更をコミットし終えたら、mainブランチにこの変更をマージ（merge）する。
~~~console
$ git switch main  #mainに切り替え
Switched to branch 'main'

$ git merge modify-README #編集したトピックブランチをマージ
Updating b981e57..015008c
Fast-forward
 README.md | 27 +++++----------------------
 1 file changed, 5 insertions(+), 22 deletions(-)
~~~
変更をマージした後は、`git branch -d`を実行してトピックブランチを削除しても良い。

### Push（プッシュ）
READMEファイルの更新が終わったので、プッシュ（push）コマンドでGitHubに変更をアップロードする。
~~~console
$ git push
~~~

参考
--
[Ruby on Rails チュートリアル](https://railstutorial.jp/)