【備忘録】Githubへプッシュするまでに使用するコマンドまとめ

#はじめに
gitのコマンドについて、自分の理解度を確認する意味も含めて、まとめたいと思います。
git初心者のため、内容に誤りや補足事項等ございましたら、お気軽にご指摘お願いします。

#リポジトリ作成からコミットするまで
###1. リポジトリを初期化する
リポジトリ(repository)とは、ソースコードや変更履歴、コメントなどを一括して保管する場所のこと。
リポジトリには、自分のPC上に作る「ローカルリポジトリ」と、GithubなどのWebサービス上に作る「リモートリポジトリ」がある。
まず、ローカルリポジトリを初期化(initialize)する。
必ずとも実行が必須ではないが、実行する癖をつけておくと良い。

```
$git init
```
###2. プロジェクトのファイルをステージングエリアに追加する。
ファイルに何かしらの変更を加えたら、まずはそのファイルをステージングエリアへ追加する。
ステージングエリアとは、リポジトリにコミットするファイルを、一時的に置いておくためのエリアのこと。
基本的に、git addするときは常に`-A`オプションをつけるようにする。
`-A : untracked状態のファイルをすべてステージングエリアに追加するオプション`

ただし、`.gitignore`に記載されているパターンにファイル名がマッチする場合、
そのファイルは追加されない。

```
$git add -A
```

###3.　ステージングエリアのファイルをローカルリポジトリに反映させる（コミットする）
変更したファイルを一旦ステージングエリアに追加後、自身のローカルリポジトリに変更を反映させる。
`-m`フラグを使うと、コミットメッセージをコマンドラインで直接指定できる。

```
$git commit -m "コメント”
```

###4.　リモートレポジトリ(github)に変更を反映させる
自身のローカルリポジトリの変更を、リモートリポジトリへ反映させる。

最初のコマンドは、GithubをリポジトリのoriginとしてGitの設定ファイルに追加するためのもの。
実行する前に、予めGithubでリポジトリを作成しておく必要があり、
リポジトリを作成した後、最初の１回のみ、このコマンドを実行する必要がある。


次のコマンドで、ローカルのリポジトリをリモートのoriginにプッシュしている。
２回目以降は、`git push`でコミットできる。

```
git remote add origin https://github.com/<Githubのアカウント名>/<リポジトリ名>.git
git push -u origin master
```
以上がローカルリポジトリを作成してから、リモートリポジトリにプッシュするまでの一連の流れとなる。
２回目以降は、`git add -A`から始めればよい。


#branchを作成してからプッシュするまで
###1. branch(ブランチ)を作成する
branchとは、元のリポジトリのコピーを作成し、元のファイルを変更せず、プログラムの編集や追加を行うことができる機能のこと。
ここでは、ローカルリポジトリの`masterブランチ`から`testブランチ`を作成し、
リモートリポジトリにプッシュするまでをやってみる。

方法1では、最初のコマンドで指定の名前のブランチを作成する。その後、指定したブランチに移動する。
方法２では、`git checkout -b ブランチ名`を用いることで、新しくブランチを作成し、そのブランチへ移動することを同時に行う。

```
方法１
$git branch test
$git checkout test
方法２
$git checkout -b test
```

###2. 全てのローカルブランチを一覧表示する
現在のローカルリポジトリの全てのブランチを表示させる。
*がついているブランチが、現在使用中のブランチであることを表します。

```
$git branch
* test
  master
```
ブランチが切り替わっていることを確認したので、作業を実施する。
今回は、testブランチでREADME.mdを変更してみました。

###3. ブランチの状態を確認する
変更が加えられたファイルを表示する。

```
$git status
On branch test
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")
```

###4. 変更点を確認する
編集した箇所と直前にコミットした内容の差分を表示する。

```
$git diff
diff --git a/README.md b/README.md
index 7f6ced6..c20cc1c 100644
--- a/README.md
+++ b/README.md
~途中省略~
（END）
```
###5. 変更点をローカルリポジトリにコミットする
変更に問題なければ、コミットする。
その際、`git add -A`＆`git commit -m "コメント"`でコミットしても良いが、
`git commit`には、現存する全てのファイルの変更点を一括でコミットする`-a`オプションがある。
今回はこれを使って、コミットしてみる。
ただし、最後にコミットした後に新しくファイルを追加した場合は、
`git add`でバージョン管理下に置く必要がある。

```
$git commit -a -m "Improve the README file"
```

###6. リモートリポジトリにプッシュする
コミットした内容を、Githubへプッシュする。
共同開発の場合、masterを不用意に変更しない方がいいため、
リモートリポジトリの`testブランチ`へプッシュします。

```
$git push origin test
```
以上がローカルリポジトリでブランチを作成し、リモートリポジトリにプッシュするまで一連の流れになる。


#リモートリポジトリのmasterへプッシュするまで
###1. リモートリポジトとローカルリポジトリを同期する
共同開発している場合、リモートリポジトリが共通で使われるため、
自分が作業中に他の人がリモートリポジトリのmasterブランチを更新している可能性がある。
そのため、リモートリポジトリのmasterブランチとローカルリポジトリのmasterブランチを同期し、
ローカルリポジトリのmasterを最新の状態にしておく必要がある。

方法１では、`git fetch`でリモートリポジトリのmasterブランチの最新状態を取得して、
`git merge`で取得した状態をローカルリポジトリのmasterブランチに反映させる。
なお、方法２の`git pull`は、`git fetch`と`git merge`を同時に行ってくれるが、
予期せぬ動作をする可能性もあるため、初心者は分けて行うのが良いかも。

```
$git checkout master
方法1
$git fetch origin master
$git merge origin/master
方法２
$git pull origin master
```
（追記）ここで`git merge`でローカルリポジトリのmasterを更新した場合、commitする。
commitし忘れると、エラーが発生してmergeに失敗する。

```
E325: ATTENTION
Found a swap file by the name　...
```

###2. ブランチで変更した内容を、masterに反映させる
ブランチで変更した内容をmasterブランチにmergeする。

```
$git merge test
```

###3. ブランチを削除する
mergeした後、ブランチが不要になった場合には、ブランチを削除する。削除が必須ではない。
また、ブランチの変更を保存せず、ブランチごと削除するには、`git branch -D ブランチ名`を用いる。

```
$git branch -d test
```

###4. リモートリポジトリへプッシュする
ローカルリポジトリのmasterブランチの内容をリモートブランチにプッシュする。

```
$git push
```
以上、リモートリポジトリのmasterへプッシュするまでの一連の流れになります。

#参考
[Ruby on Rails チュートリアル](https://railstutorial.jp/)
[https://qiita.com/yukibe/items/9ef9d54f2e7d53cfb51c](https://qiita.com/yukibe/items/9ef9d54f2e7d53cfb51c)
[https://git-scm.com/book/ja/v2](https://git-scm.com/book/ja/v2)