Railsエンジニアとして入社前に知りたかったコマンドたち(シチュエーション付き)


この記事は [DeNA 21 新卒 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/dena-21-shinsotsu) の3日目の記事です。

### はじめに

この記事はふと、コマンドだけのまとめではなくもっと具体的なシチュエーションが想像できる記事を書いてみたら面白いんじゃないかと思い書くことにしたものです:writing_hand:

また自分がRails開発を経験した中で役に立ったと感じた知識にも触れ、メモ欄にはその解説を加えてみました。

**ザックリ評価基準( 個人的 )**

- 超重要☆☆☆☆☆
- 重要　☆☆☆☆
- 普通　☆☆☆

### 目次

|index  |タイトル( ※リンクになってます )  |
|---|---|
|1  |[`$ tail -F devlopment.logs`](#1-tail--f-devlopmentlogs)  |
|2  |[`$ git checkout -b <ブランチ名>`](#2-git-checkout--b-ブランチ名-)  |
|3  |[`$ git push --set-upstream origin <ブランチ名>`](#3-git-push---set-upstream-origin-ブランチ名-)  |
|4  |[`$ rails db:migrate`](#4--rails-dbmigrate) |
|5  |[`$ bundle install`](#5--bundle-install)|


# 1.　`$ tail -F devlopment.logs`　☆☆☆☆☆

> わい:boy:「すいません、、ここで何で落ちてしまっているのか分からず..orz」
> 上司:man_tone1:「ログの方は確認しましたか？」
> わい:boy:「(...ん？ログってどうやって見るんだ?)」

### 使い方

> `tail`コマンドを実行したことでログが監視される様子↓

![qiita1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/9236749c-1591-0ba0-f75d-64061d206204.gif)


### メモ・注意点

<details><summary>`development.log` の役割</summary>
Ruby on Railsでは開発環境で動作させている場合ログが `log` 配下の `development.log` に溜まっていきます(最初これ知った時驚いた)
また詳しいロガーに仕様や設定に関してはRailsガイドを参考にするともっと詳しく知れたりします。
参考: [Rails アプリケーションのデバッグ 2.1 ロガーについて](https://railsguides.jp/debugging_rails_applications.html#%E3%83%AD%E3%82%AC%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
![スクリーンショット_2020-12-01_3_47_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/92499ab9-29ce-5d96-50c8-193e277bb042.png)

</details>

<details><summary>`tail` コマンド</summary>
`tail` コマンドはLinuxコマンドのうちの1つでオプションに `-F` もしくは `-f` を付けることで **指定ファイルの追記を監視する** ことができます。
オプションの`f`の大文字小文字の違いに関してだと以下の記事だとこちらがおすすめだったりします
参考: [tailコマンドのオプション「f」と「F」](https://qiita.com/sakito/items/7f65e16f10b3d754f307)
また注意点として　`tail` コマンドを用いる際にちゃんとディレクトリが `log` 配下に位置していることを忘れずに！
ルートディレクトリから誤ってコマンドを実行すると存在しないと怒られてしまいますゆえ
アプリのルートディレクトリから叩くことにして `tail -f log/devlopment.logs` としても良いかも知れません
</details>

# 2.　`$ git checkout -b <ブランチ名>` ☆☆☆
> 上司:man_tone1:「現在の状態を知りたいのでWIPでいいので適当なタイミングでPR作ってもらえますか?」
> わい:boy:「はい！(あれPRってどうやって作るんだっけ?)」

### 使い方

> まずPRを作る前に新しくブランチを作り、切り替えた様子

![画面収録-2020-12-01-4.52.48.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/b08956f7-5a11-5332-93a2-1aeca0453335.gif)

### メモ・注意点

<details><summary>WIP とか PR とかの用語</summary>
ここで上司役が言っていた WIP とは Work In Progress の略称で **作業途中である状態** を指す用語として良く聞く単語だったりします。
またGithub の [Pull Request](https://backlog.com/ja/git-tutorial/pull-request/01/) をPR(ぴーあーる)と呼ばれたりするのも複数社で観測したのでシチュエーションに載せてみました。
またそのまま :man_tone1:「プルリクエストを作ってください」 とも良く聞きます。

<details><summary>時代はもう `git switch -c <ブランチ名>` ？:thinking:</summary>
実はGitのブランチの切り替え方法に関しては Git 2.23 から実験的に `git checkout -b <ブランチ名>` から `git switch -c <ブランチ名>` にしたらどうか言う[提案](https://github.blog/2019-08-16-highlights-from-git-2-23/)がされました。
参考： [【Git】あなたが知らない新コマンドswitch/restoreの世界にご招待](https://qiita.com/rebi/items/5a23f8cf904271bb5452)
確かにブランチを切り替える際に `switch` するのと `checkout` するのとでは `switch` の方が直感的で分かりやすいですよね。( 後そもそも `checkout` 役割多すぎ問題..
またおまけで`switch` ver. も載せておきます
![画面収録-2020-12-01-4.30.18.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/e8cd8389-cc6c-d29d-c739-cbb003f690ac.gif)

# 3.　`$ git push --set-upstream origin <ブランチ名>` ☆☆☆
> わい:boy:「(おし、とりあえずブランチは切れたっと。あれ、でも`add`して`commit`したのになんでpushできないんだ)」
> 幻聴:angel:「エラーログをちゃんと読みなさい」
> わい:boy:「( ﾟДﾟ)ﾊｯ!?(今、何か聞こえた!?)」

### 使い方

![画面収録-2020-12-01-5.49.00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/e1964efc-48ff-39b8-d32c-6ccab1b94e72.gif)


### メモ・注意点

<details><summary>ブランチを切り替えた後の最初のPush</summary>
個人開発ではもしかしたら全て1つのブランチ( masterブランチとか )で作業していることがありますよね？( 特にGit初めたてとかしてました← )
その場合はとりあえず
1. `git add <file_name>`
2. `git commit -m <commit_name>`
3. `git push`
をすることでGitを使いこなしているつもりなっていたりしました。
しかし、ブランチを切り替えた際の挙動はちょっと違ったりします。
実際には `$ git push --set-upstream origin <ブランチ名>` のコマンドでさっきまではmasterに向けて届けてたかも知れないけど、今度は切り替えた先のブランチに届けますよっと宣言しています。
![スクリーンショット_2020-12-01_5_38_35-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/a6d0cedd-5fbd-c358-7455-ca8dcc7e27fe.png)
また、おまけで`push`が成功した後ブラウザ上でPRを作成する様子を載せておこうと思います(ほんとに初めここ分からなかったなぁ..)
![画面収録-2020-12-01-6.01.37_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/bc53c0d9-10d8-3c9e-b1d3-9346c9d523f0.gif)



# 4. `$ rails db:migrate`　☆☆☆☆☆
> わい:boy:「すいません、追加された差分を`git pull`して更新したあとエラーが..」
> 上司:man_tone1:「もしかして`migrate`してないんじゃないんですか?」
> わい:boy:「あ。。(それだ！)」

### 使い方

![HOGEEEE.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/32273390-c238-c387-c941-93481c5c220e.gif)


### メモ・注意点

<details><summary>差分を追加した際にマイグレーションファイルが追加されているとき</summary>
差分を拾ってきてそれでマイグレーションのエラーを引き起こすことは複数人で開発をしていると良く起きたりします。
初め自分は`git pull`してきて平気なときもあれば、なぜかこうやって `ActiveRecord::PendingMigrationError` になってしまうときがあるなと、同じことをしているのになぜこう言ったことが起こるのか分かっていませんでした。
しかしよく観察してみるとマイグレーションを要求されることは**そう言った変更を行ったときのみ要求される**ものだと気付き、それから更新した際にマイグレーションファイルが追加や削除、変更されている場合には自分の開発環境も揃えてあげる必要があるんだと知っていきました。


# 5. `$ bundle install`　☆☆☆☆☆
> わい:boy:「すいません、たしかにマイグレーションエラーは消えたのですが、、」
> 上司:man_tone1:「もしかして次は`bundile install`してないとか言わないですよね?」
> わい:boy:「( ﾟДﾟ)ﾊｯ!?。。(やばいそれだ!!)」

### 使い方

![HUGAAA.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/b9d88f58-8c01-bf8e-6041-1f0a20d4028d.gif)


### メモ・注意点

<details><summary>ブランチ切り替えにおけるgemのアップデートが必要な場合</summary>
複数人でのチーム開発を行っている際には他のエンジニアの方が新しい gem を導入するケースは当然あります。
その場合、手元の自分の環境でも同じ最新状態に揃えるためにGemfileならびにGemfile.lockを更新する必要があります。
</details>

## おわりに
Railsでの開発と言うのは一言で言うのはあまりにも広く、開発組織によって様々な使われ方がされると思います。モノリシックに作って一旦VueやReactは入れずに作るんだ！ってところもあれば、RailsにはAPIサーバーとしての役割を持ってもらって、フロントはフロントで頑張りますってところも当然あるかと。
また、Webサービスを作る手段として良く知られている気がしますがRailsをゲーム開発に用いることもあります。
そして最近はDockerの利用も主流になってきて、初学者からするとdockerのコマンドとRailsのコマンドを合わせて利用する場面もありすぐに理解が追いつかず詰まりどころが多くなった印象もありました。

今回はそう言ったところで何かRails開発に慣れていく手助けができればと思い書いてみました

## 宣伝

この記事を読んで「面白かった」「学びがあった」と思っていただけた方、よろしければ Twitter や facebook、はてなブックマークにてコメントをお願いします！
また [DeNA 公式 Twitter アカウント @DeNAxTech](https://twitter.com/DeNAxTech) では、 Blog記事だけでなく色々な勉強会での登壇資料も発信してます。ぜひフォローして下さい！
<a href="https://twitter.com/DeNAxTech?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-size="large" data-lang="ja" data-show-count="false">Follow @DeNAxTech</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>