GitとGitHubの基礎

# 1. GitとGitHubとGitHub Desktop

### 1-1. Git とは
- アプリを時系列で、修正点を記録して、管理してくれるシステムのこと。

### 1-2. GitHub とは
- Gitの仕組みを用い、複数人での開発ができるツールのこと。
- Gitにおけるリモートリポジトリ（サーバー上のリポジトリ）の役割を担い、複数人がリモートリポジトリでプロダクトを共有して開発を行う。

### 1-3. GitHub Desktop とは
- Gitはターミナル操作するが、ターミナルでの操作の代わりができる。GitHub Desktopを使うことで、ターミナルに慣れていなくてもGitが扱えることがメリット。
- **GitHub Desktopの導入**：GitHub Desktopをダウンロードし、「Sign in to GitHub.com」から、メールアドレスとpasswordを入力し、gitHubにサインイン。GitHub Desktopのアカウント登録しておく。



# 2. GitHub Desktopの操作
## 2-1. GitHub Desktopでローカルリポジトリを扱えるように設定する方法
- GitHub Desktopの`Add an Existing Repository from your Hard Drive...`から、ローカルリポジトリを選択し、追加(Add Repository)する。
- Add Repositoryがクリックできない場合は、Git管理用の入れ物（.gitディレクトリ）がないので、git initコマンドで作成する必要がある。

```rb:ターミナル
% cd ~/projects/ローカルリポジトリ名
% git init
```

## 2-2. GitHub Desktopからリモートリポジトリを作成する方法
- GitHub Desktopでコミットメッセージ（initial commit）を入力→コミット→プッシュ を行うと、リモートリポジトリがない場合、自動的にリモートリポジトリも作ってくれる。
- その時、非公開にする必要がない場合は、`Keep this code private`のチェックは外して、Publish repositoryすると、GitHub のリモートリポジトリが作成できる。

## 2-3. GitHub Desktopからリモートリポジトリにプッシュする方法
- コミットメッセージを入力→コミット→プッシュ の順。
![Screenshot from Gyazo](https://gyazo.com/2c4d815a00324678a07919ee3c76f99f/raw)




# 3. GitHubの操作
## 3-1. [GitHub](https://github.com/)のアカウント登録
- Usename(ニックネーム)、メールアドレス、Password(15文字以上 or 8文字以上で数字を含むもの)を登録。
- Freeプランを選択し、チェックボックスにはチェックは付けずにContinue。
- アンケートページはスルー(skip this step)でok。

## 3-2. リモートリポジトリの作成方法
![Alt text](https://gyazo.com/a9f0194189bbbd03c0d3ac368cd2e082/raw)
名前はローカルリポジトリと同じ、Publicを選択し、リモートリポジトリを作成する。

## 3-3. ローカルリポジトリをリモートリポジトリに紐づける方法
```rb:ターミナル
% cd ~/projects/ローカルリポジトリ名
% git remote add origin GitHubに作成したリモートリポジトリのURL(https://github.com/GitHubのユーザー名/リモートリポジトリ名.git)

% git remote    # origin (リモートリポジトリのこと)と出れば、紐付け完了。
```

## 3-4. 他人のリモートリポジトリを自分の環境に反映する方法
- 複数での開発時、誰かがアプリをリモートリポジトリに作成し、それを共有する。ローカルリポジトリは、各人がそのリモートリポジトリをダウンロードして作成する。
- リモートリポジトリの URL を指定し、そのアプリのローカルリポジトリにダウンロードする。  
※ この時、`.git`ディレクトリも含まれており、clone 元のリモートリポジトリが指定されてるので、プッシュは、clone 元に push される。但し、他人が勝手にプッシュできないようにする仕様として、**リモートリポジトリ保有者がリモートリポジトリの Collaborators に追加**することで、プッシュが可能になる。

```rb:ターミナル
% git clone https://github.com/ユーザー名/リモートリポジトリ名.git
```

## 3-5. Github Comment Trackerの導入
- コードレビューのコメントを見落とさないためのChromeの拡張機能。
- コードレビューのコメントに対応済みかがわかりやすくなる。
- [Github Comment Trackerダウンロード](https://chrome.google.com/webstore/detail/github-comment-tracker/dkjmlcpmijiiejngafklkleghnaiabpa)




# 4. ターミナルでのGit操作
## 4-1. Gitのインストール
今回はHomebrewを使用。

```rb:ターミナル
% brew install git   # Gitのインストール
% git --version      # インストールできたかを確認
```

## 4-2. ターミナルでのGit操作
### 4-2-1. ローカルリポジトリを作成
管理したいアプリを手動でprojectsに移動し、Git管理用の入れ物（`.git`ディレクトリ）を用意する。

```rb:ターミナル
# 最初に、管理したいアプリを手動でprojectsに移動しとく

% cd ~/projects/アプリ名  #ディレクトリ移動
% pwd                   #currentディレクトリを確認
% git init   # .gitを作成するコマンド
```
#### Git管理できているか？の確認方法
そのディレクトリに`.git`という隠しディレクトリが存在しているかで判断できる。

```rb:ターミナル
% cd ~/projects/アプリ名
% ls .git    #.gitがあるかを確認
ls: .git: No such file or directory   # Git管理できていない場合
HEAD    config  hooks   objects refs  # Git管理できている場合
```

### 4-2-2. インデックスを追加する
バージョン記録したいタイミングまでの修正点を一時的に保存しておく場所(インデックス)を準備する。

```rb:ターミナル
% git status   # 現状を確認(インデックス追加できるディレクトリを確認)
```
`Untracked files：`に記載されたディレクトリがインデックス追加できるので、順番に追加していく。

```rb:ターミナル
% git add ディレクトリ名
% git status
```
`Changes to be committed:`に記載されていたら、インデックスに追加されている状態。

### 4-2-3. コミットする
インデックスに入っている変更点をバージョン記録すること。

```rb:ターミナル
% git status  #現状を確認
```
`Changes to be committed:`に記載されているものがコミット待ちの状態。
`nothing to commit`と返ってこれば、コミット待ちのものはない状態。

```rb:ターミナル
% git commit -m 'initial commit'
# 空のコミットでプルリクエスト作成する場合
% git commit --allow-empty -m 'create pull request'
```

### 4-2-4. プッシュする
ローカルリポジトリの変更点を、リモートリポジトリに反映すること。

```rb:ターミナル
% cd ~/projects/ローカルリポジトリ名
% git push origin ブランチ名
```
### 4-2-5. プルする
- リモートリポジトリの変更点をローカルリポジトリに取り込むこと。
- マージ後、リモートリポジトリは最新の状態、ローカルリポジトリはマージ前の状態なので、ローカルリポジトリに反映させる必要がある。

```rb:ターミナル
% git checkout master     # masterブランチに移動
% git pull origin master  # リモートリポジトリ（origin）のmasterブランチを反映
```

### 4-2-6. LGTM後、マスターにマージする
- GitHub（リモートリポジトリ）: `Merge pull request`をクリックしてマージ実行。
- GitHub Desktop: Current Branch:`Master`で、`Fetch origin`をクリックし、 History を確認し、`Pull origin`をクリック。( Merge pull request に反映を確認)



## 4-3. よく使うGit管理に関するコマンド

| コマンド    | 機能 |
|:---------|:----|
|git init  |対象のディレクトリをバージョン管理できる入れ物に格納してくれるイメージ|
|git status|インデックスに追加/追加されてない変更修正の確認|
|git add ●●|●●をインデックスに追加。※ git add . とすると「全て」を対象にできる|
|git commit -m 'メッセージ'|コミット|
|git log|コミットログの履歴確認（コミットID、コミットメッセージ、日時）|
|git remote add origin リモートリポジトリのURL(https：//github.com/GitHubのユーザー名/リモートリポジトリ名.git)|ローカルリポジトリにリモートリポジトリの情報を付与し、紐づける|
|git push origin ブランチ名|ローカルの変更点を、リモートに反映。ブランチ名 masterなら、マスターブランチにプッシュ。|
|git pull origin master|リモートリポジトリ（origin）のマスターブランチをローカルリポジトリに反映。|
|git clone https：//github.com/ユーザー名/リモートリポジト名.git|リモートリポジトからローカルリポジトリにダウンロード|
|cd ●●     |currentディレクトリを●●に移動|
|pwd       |currentディレクトリの確認|
|ls ●●     |currentディレクトリの中の●●を検索|


## 4-4. コミットメッセージ例

|コミットメーセージ|意味|
|:--|:--|
|Create ●● class|クラス作成|
|Add relation with ●●|リレーションの追加|
|Add presence validation of ●●|バリデーションの追加|
|Add #parse_body for parse body's markdown||




# 5. よくあるトラブル・エラー
## 5-1. コミット時のエラー
- コミットの時、`Please tell me who you are`というエラーが出た場合は、以下の作業を行う。
- [GitHub](https://github.com/) にアカウント登録、usernameとメールアドレスをコマンドで入力する。

```rb:ターミナル
% git config --global user.email "GitHubに登録したメールアドレス"
% git config --global user.name "GitHubに登録したusername"
```

## 5-2. プッシュを取り消したい
基本、プッシュした情報をローカルリポジトリに戻すことはできない。
そこで、コミットを打ち消すコミットを生成する（git revertコマンド）。プッシュ済みのコミットを消す方法もあるが、よくなさそう。。git revertでは打ち消したコミットの記録が残る。

### git revert
- 指定したコミットを、add前に戻してくれるコマンド。

```rb:ターミナル(間違って、masterにpushしちゃった時など)
% git log                    # コミットログの確認
% git revert 間違えたコミットID   # 指定したコミットを、add前に戻す
  # ターミナルが編集できなくなるので、`:q`で脱出
```
- GitHub Desktopを確認すると、git revertで生成したコミットが生成されてるハズ。これをpushすれば、リモートリポジトリで打ち消されているハズ。この時、ローカルからも消えるので、注意。

```rb:参)ターミナルで実施する場合
% git pull                            # 念のため、ローカルのmasterを最新にする
% git checkout pushすべきだったブランチ    # ブランチを切り替える
% git merge master
% git add .                           # 変更箇所をadd
% git commit -m "コミットメッセージ"
% git push origin pushしたかったブランチ
```
**※** 念のため、ローカルのmasterをpull(最新)にしてから、作業してたブランチも最新状態をmerge(反映)し、pushすべきだったブランチにpushするイメージ。



## 5-3. GitHubの管理をPrivate→Publicへ！
Settings から Danger Zone の Make this repository private から変更可能。





## 5-4. ブランチを切り替え、かつ、変更内容も引き継ぐ


```php:ブランチを切り替え、かつ、変更内容も引き継ぐ
% git stash        // スタッシュ（コミットされていない変更内容を一時退避）
% git checkout 切り替えたいブランチ名
% git stash pop    // 直前に一時退避した変更内容を取り出すコマンド

```

## 5-5. コミット済みの変更を引き継ぎ、かつ、ブランチを変更
- 「間違えて違うブランチでコミットした」時の対処法

```php:コミット済みの変更を引き継ぎ、かつ、ブランチを変更
% git reset --soft HEAD^   // 最新のコミットを取り消し、未コミットの状態に戻すコマンド（ --soft ： 変更内容は残す、HEAD^ ： 直前のコミット という意味 ）

```

## 5-6. ブランチ切り替えたい時にエラー！

 > error: you need to resolve your current index first !!


```php:ブランチを切り替えられない！
% git merge --abort

% git status
// ローカルでコンフリクト解消
% git add backend/routes/web.php    // コンフリクトを解消したファイル名
% git commit
```