gitの使い方 - ターミナルでGitHubの新規リポジトリと紐付ける方法

# はじめに
自分で初めてgitでプロジェクト管理をする機会があったので、自分のメモを含めて、方法を忘れないため記事を書いてみました
今回はターミナルでの操作をメインに書いているので、ターミナルは難しくて嫌いな人は『Sourcetree』で調べてみてください
[GitHubで管理するためのSourcetreeの最低限の使い方](https://haniwaman.com/sourcetree/)の記事を参考にしてみてください

# gitとは
webサイト・アプリなどを複数人で協力して開発するときに便利なバージョン管理システム
簡単に説明すると、複数人で協力しながらサービス開発をする時に、Gitを使うと1つのサービスを作る時に別々のPCで作業しても、履歴や差分（変更の差）などが表示させたりできるので、別々に作業したものを結合（くっつける）する時に問題を起こしにくくできる
もちろん、1人で開発するときも履歴が残るので、間違えたと思ったら、戻りたい履歴に戻れるので便利です、実際に使ってみて便利さを実感してください

# 用語
- リポジトリ
    - ファイルやディレクトリの履歴を管理している場所
- ローカルリポジトリ
    - 自分のPC内で作業するために作成したリポジトリ
- リモートリポジトリ
    - 専用のサーバに配置して複数人で共有するためのリポジトリ
    - githubやgitlabなどのサービスが有名
- コミット
    - 変更点をリポジトリに記録することと認識したら、一旦大丈夫だと思います
    - ゲームのセーブをイメージするとわかりやすいと思います
- インデックス
    - リポジトリにコミットする準備をするための場所の認識で、一旦OKだと思います
- ブランチ
    - 履歴の流れを分岐して記録していくためのもの
    - 分岐したブランチは他のブランチの影響を受けないので、同じリポジトリ中で複数の変更を同時に進めていくことができる
- Masterブランチ
    - gitでリポジトリを作成した時に最初に自動で作成される大元のブランチ
    - チーム開発の時は、ここでの作業は基本NG
- マージ
    - ブランチを統合（別々のブランチをくっつけること）
- コンフリクト
    - 同じ箇所を別々のブランチでそれぞれ変更させている時にマージをすると、gitがどっちが正しいかわからなくてエラーになること

# オススメのターミナル
今回はターミナルでgitを操作する方法を書いてるので、個人的に僕が好きなターミナル 『[iterm2](https://www.iterm2.com/)』を紹介します
設定でいじれば、好きなショートカットコマンドを入力すると現在のデスクトップ上にフルスクリーンでターミナルを表示・非表示ができるので好きです（見た目がカッコイイのもイイw）
※iterm2の設定方法は[この記事がオススメです](https://qiita.com/ruwatana/items/8d9c174250061721ad11)

# 実際の流れ
### 1. 作業ディレクトリを作成する
事前に作業ディレクトリを1つ作成して、自分のサービス開発を少しだけ作成する
※簡単で大丈夫です：例えば作業ディレクトリの中にindex.htmlだけ作成してみてください

### 2. GitHubでレポジトリを1つ作成する
[GitHub](https://github.co.jp/)でアカウントを作成してリポジトリを1つ作成する：[参考記事](https://proengineer.internous.co.jp/content/columnfeature/7103)
※参考記事ページで作成している「README」ファイルを作成しなくて大丈夫です
※最近GitHubは、無料個人アカウントでも他の人に見られないPrivateリポジトリが作成できます
※GitHub以外にGitLabなど他のバージョン管理のサービスもあります

### 3. ローカルリポジトリとGitHubのリモートリポジトリを紐付ける
ターミナルで、作成したローカルの作業ディレクトリまで移動したら、ターミナルで下のコマンドを順番に入力するだけで簡単にGitHubのリモートリポジトリと紐付けれます

```
// ルートディレクトリでgitのリポジトリを作成（これがローカルリポジトリになる）
$ git init

// ルートディレクトリの中身を全てインデックスに登録する
$ git add .

// インデックスに登録された内容をリポジトリに記録するコミットを実行
// ""の中はコミットの時にメッセージを書く
$ git commit -m "first commit"

// ローカルリポジトリとリモートリポジトリを紐付ける操作
// URLはGitHubで作成したリモートリポジトリのURL
// GitHub内にある緑色のボタンをクリックするとURLが表示されるので確認してください
$ git remote add origin URL

// ローカルリポジトリの内容をリモートリポジトリにアップロードして同じ状態にする
$ git push -u origin master
```

### 4. リモートリポジトリの自分のローカルにクローンする
2でリモートリポジトリにプロジェクトが作成できたので、複数人で作業するときは、リモートリポジトリをクローン（コピーのイメージでOK）することで同じリモートリポジトリを共有して開発できます
あとはそれぞれローカルリポジトリで作業すればOKです

```
// リモートリポジトリをクローンする方法
// URLはGitHub内にある緑色のボタンをクリックすると表示される
$ git clone URL
```

# ローカルリポジトリとリモートリポジトリを紐付けた後
ローカルリポジトリとリモートリポジトリを紐付けたら、あとはローカルリポジトリでカタカタ開発をして、リモートリポジトリに共有するだけです
それが1人で開発するのか複数で開発するかで流れが少し違うなと思っているので、補足的な感じで少しがけ書きます
あくまでも僕個人が経験したやり方ですので、これが絶対正しいと思わないで欲しいです

### 1人で開発する場合
1人で開発する時に、僕はブランチを分けなくてもイイと思っているので、下の手順を都度実行するだけ大丈夫かと思います
リモートリポジトリに共有する時はキリがイイとこでこまめに共有するのをオススメします

```
// インデックスい登録したいファイルを選択する
// ディレクトリの中にある時はルートディレクトリからの相対パスで指定する
// 全てのファイルをインデックスに登録したい時はファイル名の代わりにピリオドを入力
$ git add ファイル名

// インデックスに登録された内容をリポジトリに記録する
$ git commit -m "コメント内容"

// リモートリポジトリにコミット内容を共有する
$ git push
```

### 複数人で共同開発する時の流れ
当たり前ですけど、複数人で開発している時は、自分がローカルで作業している途中でも他の人がタスクが完了するたびに開発内容をリモートリポジトリに共有していきます
なので、自分のローカルリポジトリとリモートリポジトリに差がでる可能性が含まれて、それを考慮しないとリモートリポジトリがコンフリクトの状態になってしまうので、自分のローカルリポジトリでコンフリクトを修正してからリモートリポジトリに共有することを意識したら、まずはOKだと思います
具体的には下の手順で作業したら大丈夫かと思います

#### 1. 開発作業前のgit手順
開発をする前に、自分が開発するブランチを作成して移動をした上でカタカタ開発をしましょう
絶対にmasterブランチでは開発をしないことだけ守りましょう！

```
// ローカルリポジトリのmasterブランチに最新のリモートリポジトリのmasterブランチを共有する
// 上手く動かなかったら2込めの方法を試してください
$ git pull
$ git pull origin master

// 新しいブランチを作る
$ git branch 新しいブランチ名

// ブランチを移動する
$ git checkout 移動したいブランチ名
```

#### 2. 開発作業後のgit手順
カタカタ開発をしたら、あとはリモートリポジトリに共有するだけですが、事前にコンフリクトがないかを自分のリモートリポジトリで確認をすることを忘れないようにしましょう
下の手順を完了したら、後はGitHub上でプルリクを送るだけ：[プルリク方法のわかりやすい記事](https://backlog.com/ja/git-tutorial/pull-request/06/)

```
// インデックスい登録したいファイルを選択する
// ディレクトリの中にある時はルートディレクトリからの相対パスで指定する
// 複数人開発ではオススメしないですけど、全てのファイルをインデックスに登録したい時はファイル名の代わりにピリオドを入力
$ git add ファイル名

// インデックスに登録された内容をリポジトリに記録する
$ git commit -m "コメント内容"

// ローカルリポジトリの作業ブランチに最新のリモートリポジトリのmasterブランチを共有する
// これを実行した時にコンフリクトが起きてたら、コンフリクトしているファイルを修正しましょう
// コンフリクトしているファイル名はターミナルに表示されるのでコンフリクト場所はすぐわかります
// コンフリクトを修正したら、ここまでの『add, commit, pull』を再度実行してコンフリクトが無いか確認する
// コンフリクトが起きなくなったタイミングで次のステップに行く
$ git pull origin master

// リモートリポジトリの『ブランチ名』ブランチにローカルリポジトリの『ブランチ名』ブランチコミット内容を共有する
$ git push origin ブランチ名
```

# その他、知っておくと便利なgitのコマンド
上の流れでは出てこなかったけど、個人的によく使ったと思うコマンドをまとめました

```
// 新しいブランチを作る・ブランチを移動するを1回で実行する方法です
// 新しいブランチを作成しつつ、そのブランチに移動する時に使います
$ git checkout -b 新しいブランチ名

// ローカルリポジトリで自分の現在の状況を確認する方法
// 例えば、ファイルの追加や修正、インデックス登録など、現在どのような状態かを確認できる
$ git status

// コミットの履歴を表示する方法
$ git log
```

# オススメのgit系の資料ページ
[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)
[Gitコマンド一覧のチートシート](https://qiita.com/kozzy/items/b42ba59a8bac190a16ab)