Railsチュートリアル 第1章 - Gitによるバージョン管理

# リポジトリの作成とステージング

`git init`コマンドで、Gitリポジトリを新規作成します。

```:zsh
>>> pwd
~/docker/rails_tutorial_test/hello_app

>>> git init
```

`git add -A`コマンドで、新規作成したGitリポジトリにプロジェクトのファイルを追加します。

```:zsh
>>> pwd
~/docker/rails_tutorial_test/hello_app

>>> git add -A
```

以上の操作は、この項目に至る以前の段階で既に行っていました。既にローカルのGitリポジトリは存在する状態です。

# ステージングの状態確認とコミット

`git status`コマンドで、ステージングの状態を表示することができます。

```:zsh
>>> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   Gemfile.lock

no changes added to commit (use "git add" and/or "git commit -a")
```

以上のメッセージが表示されました。というわけで、`Gemfile.lock`をコミットしてみます。

ステージング済みの変更をコミットするためには、`git commit`コマンドを使います。`-m`オプションのあとに二重引用符付きでコミットメッセージを入力することにより、コミットメッセージも同時に設定することができます。

```:zsh
>>> git commit -m "Automatic changes"
...略
```

改めて`git status`を実行します。

```:zsh
>>> git status
On branch master
nothing to commit, working tree clean
```

「コミット対象となる変更はない」と表示されるようになりました。

なお、私自身としては、Git関係の操作について、Visual Studio Codeの機能で行うようにしています。

# `git log`コマンドによるコミットメッセージの履歴の参照

`git log`コマンドで、コミットメッセージの履歴を参照できます。表示内容から、最新2件の履歴を抜粋してみました。

```:zsh
>>> git log
commit 676fb27c499bb8f326be7509a6617cd0884281ad (HEAD -> master)
Author: ...略
Date:   Wed Jul 24 19:52:52 2019 +0900

    Automatic changes

commit 0fd05fbc47f992b4005048eafaed5d87d28b62e7
Author: ...略
Date:   Tue Jul 23 14:39:52 2019 +0900

    Change 'application#hello' -> 'application#goodbye'

...略
```

`git log`コマンドは、`less`コマンドをインターフェースとして使用しています。1画面に収まりきらないログの場合は、`q`キーを押せば`git log`を終了することができます。

# ローカルリポジトリを元として、GitHubにリモートリポジトリを構築する

```:zsh
>>> git remote add origin git@github.com:{GitHubのユーザ名}/hello_app.git
```

ローカルリポジトリに対応するリモートリポジトリを問題なく追加できた場合、`git remote`は特にメッセージを返しません。

```:zsh
>>> pwd
~/docker/rails_tutorial_test/hello_app

>>> git push -u origin --all
ERROR: Repository not found.
fatal: Could not read from remote repository.
```

あれ？`git push`ができないですね。原因は何でしょう。

…先にWebブラウザでGitHubにアクセスし、リモートリポジトリの受け皿を作成しなければならないのだったのですね。というわけで、WebブラウザでGitHubにアクセスし、`hello_app`という名前のリモートリポジトリを作成します。その上で改めて`git push`コマンドを実行します。

```:zsh
>>> git push -u origin --all                                                                                              
Enumerating objects: 118, done.
...略
Branch 'master' set up to track remote branch 'master' from 'origin'.
```

正常に`git push`できたようです。WebブラウザでGitHubの`hello_app`リポジトリにアクセスしたときにも、ローカルと同じディレクトリツリーが見えます。

# ブランチ`modify-README`の作成と、`modify-README`上での作業

```:zsh
>>> git checkout -b modify-README
Switched to a new branch 'modify-README'

>>> git branch
  master
* modify-README
```

Visual Studio Code上でも、トピックブランチが`modify-README`となっているのが見えます。

<img width="373" alt="スクリーンショット 2019-07-29 13.25.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323778/b925193e-0162-b915-7f41-9103dbb80a0b.png">

`README.md`の内容を変更してみましょう。

```diff:README.md
-# README
+# Ruby on Rails Tutorial
 
-This README would normally document whatever steps are necessary to get the
-application up and running.
+## "hello, world!"
 
-Things you may want to cover:
-
-* Ruby version
-
-* System dependencies
-
-* Configuration
-
-* Database creation
-
-* Database initialization
-
-* How to run the test suite
-
-* Services (job queues, cache servers, search engines, etc.)
-
-* Deployment instructions
-
-* ...
+This is the first application for the
+[*Ruby on Rails Tutorial*](https://railstutorial.jp/)
+by [Michael Hartl](http://www.michaelhartl.com/). Hello, world!
```

以上の変更内容を保存した時点で、`git status`コマンドを実行してみましょう。

```:zsh
>>>  git status
On branch modify-README
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <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`が変更されたものの、まだステージングされていない」というメッセージが表示されました。ここから「`git add -A`コマンドを使って明示的にステージング→`git commit`コマンドを使ってコミット」という手順を実行してもいいのですが、今回は`git commit -a`コマンドを使い、暗黙的なステージングから直接コミットしてみましょう。

```:zsh
>>> git commit -a -m "Improve the README file"
[modify-README c6cc6ad] Improve the README file
 1 file changed, 5 insertions(+), 22 deletions(-)
```

正常にコミットできたようです。

# ブランチ`modify-README`での作業内容を`master`にマージする

```:zsh
>>> git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

>>> git merge modify-README
Updating 676fb27..c26e68a
Fast-forward
 README.md | 27 +++++----------------------
 1 file changed, 5 insertions(+), 22 deletions(-)
```

`git checkout master`コマンドのところで、Railsチュートリアルに記載のない`Your branch is up to date with 'origin/master'.`というメッセージが表示されています。これは、大雑把に言って「ローカルの`master`ブランチとリモートの`origin/master`ブランチの進度は一致している」という意味のメッセージです。

メッセージを見るに、マージは正常に完了したようです。

# ブランチ`modify-README`の削除

ブランチ`modify-README`の内容は`master`にマージされましたので、不要になったブランチ`modify-README`は削除しましょう。

```:zsh
>>> git branch -d modify-README
Deleted branch modify-README (was c26e68a).
```

メッセージを見るに、問題なく`modify-README`ブランチを削除できたようですね。

```:zsh
>>> git branch
* master
```

確かにブランチは`master`しかありません。

# ローカルリポジトリの変更内容を、リモートリポジトリに`git push`する

この時点での`git status`の実行内容です。

```:zsh
>>> git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
```

先程`Your branch is up to date with 'origin/master'.`であったところが、`Your branch is ahead of 'origin/master' by 1 commit.`に変わっています。大雑把に言って、「ローカルの`master`ブランチが、リモートの`origin/master`ブランチより1コミットだけ先を進んでいる」という意味です。この場合、`git push`コマンドにより、ローカルリポジトリの内容でリモートリポジトリを更新します。

```:zsh
>>> git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
```:zsh
>>> git push
Enumerating objects: 5, done.
...略
   676fb27..c26e68a  master -> master
```

正常にプッシュできたようです。

```:zsh
>>> git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
```

`Your branch is up to date with 'origin/master'.`となっていますね。

# 参考文献

* [【書籍】わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉 - Amazon.co.jp](https://www.amazon.co.jp/%E3%82%8F%E3%81%8B%E3%81%B0%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E5%AD%A6%E3%81%B6-Git%E4%BD%BF%E3%81%84%E6%96%B9%E5%85%A5%E9%96%80%E3%80%88GitHub%E3%80%81Bitbucket%E3%80%81SourceTree%E3%80%89-%E6%B9%8A%E5%B7%9D-%E3%81%82%E3%81%84/dp/4863542178)