Git/GitHubの基礎知識

#Gitとは
プログラムのソースコードなどの変更履歴を記録・追跡するためのバージョン管理システム。
#GitHubとは
ローカル環境で作成したコードをリモートリポジトリで公開するためのツール
#０.用語解説

| ﻿word&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;  | meaning              |
|:-------------------|:---------------------------------------------|
| repository         | ファイルや変更履歴を保管する場所<br>ローカルリポジトリ（自分のパソコン上）<br>リモートリポジトリ（Webサービス上） |
| worktree            | 編集したファイルが自動的に保存される場所（※コミットの対象でない） |
| index               | 編集したファイルを仮確定して置いておく場所（※コミットの対象になる）<br>ワークツリーとリポジトリの間に存在   | 
| remort              | 共有ファイルの置き場所 |
| commit              | 変更履歴の保存       | 
| Fork                | 他の人が公開しているリモートリポジトリを自分のアカウントにコピー           |
| Clone               | リモートリポジトリをローカル環境(自分のパソコン)にコピー                | 
| branch              | 履歴の流れを分岐して記録する際に使用<br> 分岐したブランチは他のブランチの影響を受けない<br>同じリポジトリ中で複数の変更を同時に進められる |
| merge               | masterから分けたブランチを統合・合体させる  |
| Push                | ローカルリポジトリからリモートリポジトリへアップロード　　　               |
| pull                | リモートリポジトリからローカルリポジトリへデータをダウンロード　　　         |
| pull request        | 「プルリク」、「PR」と略される<br>自分のパソコンで開発したソースコードをリモートリポジトリにプッシュした後に変更内容を他の人にコードレビューしてもらい、masterに追加しても良いか確認       |
| revert              | コミットの削除ではなく、反対の内容で新規コミットを作ることで過去の変更を打ち消す |
| rebase              | 履歴が枝分かれせずに一直線となる |
| squash              | コミットを一つにまとめる |
| fetch               | リモートリポジトリから更新内容をダウンロードし、ローカルリポジトリ内のリモート追跡ブランチを更新（※マージした時にローカルリポジトリが更新される） |
| stash               | 未コミットのファイルを一時退避        |
| cherry-pick         | コミットしたブランチを別のブランチへ変更 |

#１.ローカルリポジトリの作成

```
$ git init
```
・`init`ializeの略：初期化
・ディレクトリ内に中身が空のローカルリポジトリを作成
・`Reinitialized existing Git repository in /Users/〜〜〜〜〜〜/.git/`が表示された場合、すでに存在するものを初期化したという意味、エラーではない

#２.変更ファイルをインデックスに移動
```
$ git add(reset) ファイル名
```
・変更があったファイルをインデックス移動させ、変更履歴を保存するための準備
・ワークツリー⇨インデックスへ移動(add)〈ステージとも言う〉
・インデックス⇨ワークツリーへ移動(reset)〈アンステージとも言う〉
・ファイル名無しの場合、`git add(reset) .`で全て選択
・コミット前の変更内容を一時的に退避(復元)`git stash (pop)`

#３.ファイル変更の履歴を保存
```
$ git commit -m "メッセージ"
```
・メッセージは`"  "`で囲む
・メッセージは変更した内容が分かりやすように表記
・コミットメッセージを修正 `$ git rebase -i HEAD^`

#４.リモートの登録
```
$ git remote add リモート名　URL
```
・一般的にリモート名は`origin`
・リモートにファイルをアップロード、リモートからファイルをダウンロードすることで、他者とファイルを共有することができる

#５.リモートへのファイルアップロード
```
$ git push リモート名　master
```
・アップロードのことをプッシュという

#６.リモートからのファイルダウンロード
```
$ git pull リモート名　master
```
・ダウンロードのことをプルという

#７.変更ファイルの把握
```
$ git status
```
・変更があったファイルは赤字で表示 `modified ファイル名`
・追加されたファイルは緑字で表示`modified ファイル名`

#８.変更内容の把握
```
$ git diff
```
・変更前のコード（赤字）
・追加コード、変更後のコード（緑字）

#９.コミットメッセージの確認
```
$ git log
```
・自分や他人のコミットを表示

#１０.コミット内容の確認
```
$ git log -p
```
・`qキー`を押して終了

#１１.ブランチの一覧を表示
```
$ git branch
```
・`＊`が現在のブランチ

#１２.ブランチの作成&削除&切替
```
①$ git checkout ブランチ名 # ブランチの切り替え
②$ git checkout -b ブランチ名 # ブランチの新規作成＆切り替え
③$ git branch -d（D） ブランチ名 # マージしたブランチの削除
```
・②`Switched to a new branch 'ブランチ名'`と表示され、切替も行われる
・③`D`は強制削除（マージ済みか関係なく）
　※マージ済か確認【`$ git branch --(no-)merged master`】

#１３.変更内容の統合
```
$ git merge ブランチ名①（統合する側）
```
・ブランチ②（統合される側）に移動してから実行する

#１４.過去のコミットの状態にファイルを戻す
```
$ git checkout HEAD^
```
・`^`が１つは１つ前のファイル、`^^^`なら３つ前のファイルに戻す

#１５.ローカルリポジトリからリモートリポジトリへプッシュ
①バージョン管理の開始【`$ git init`】（１回目だけ）

②`worktree`で作成したコードを`index`に移動させる【`$ git add .`】

③ファイル変更の履歴保存【`$ git commit -m "メッセージ"`】
　※`$ git commit`で`vim`編集も可能
　　①`i`②コミットメッセージ入力③`esc`④`:wq`

④GitHubで`New repository`の作成

⑤ローカルリポジトリとリモートリポジトリを関連付けるURLをコピー【`Clone or download`をクリック】

⑥関連付け【`$ git remote add origin ⑤のURL`】
 　`git remote`で確認すると`origin`に関連付けされる

⑦ `origin`に対してプッシュする【`$ git push origin ブランチ名`】
　リモートリポジトリにソースコードが反映される

#１６.共同開発の流れ

①GitHubで`Clone or download`をクリックしURLをコピー

②クローンする（※コピーしたい場所のディレクトリ上で）【`$ git clone ①のアドレス`】

③クローンしたディレクトリへ移動【$ cd ディレクトリ】

④ブランチの作成または切替【`$ git checkout (-b) ブランチ名`】

④`$ git add .`

⑤`$ git commit -m "メッセージ"`

⑥`$ git push origin ブランチ名`

⑦GitHubで変更されたブランチの`Compare & pull request`をクリック
　※動作確認を行い、正常に機能するか確認してから行うこと

⑧title（変更内容の表題）とWrite（変更内容の詳細）を記入し、`Create pull request`をクリック
　※どのブランチにプルリクエストを送るのか確認
　※Writeはマークダウンで記入できる

⑨他の人にコードレビューしてもらい`Merge pull request`＞`Confirm merge`をクリック
　※自分がチェックする場合は、`Files chenged`をクリックし、変更内容をチェック

⑩マージが終われば、統合前のブランチが不要になるため`Delete branch`をクリック

#１７.リモートリポジトリの情報をローカルリポジトリに反映させる#

・ローカル環境へ変更内容を反映【`$ git pull origin master`】
　 ※マージ後のファイル内容はローカルリポジトリには反映されていないため
　 ※ブランチを`master`に移動してから実行
　 ※`git fetch(取得)`と`git merge(反映)`を同時に行われている
　 ※`git fetch(取得)`はローカルのファイルは変更されないが、ブランチを指定せずにリモートの情報を一括で取得できる

#１８.コミットメッセージの変更
①過去のコミットメッセージを確認【`$ git log`】
②`$ git rebase -i HEAD^`
③iを押して表示をINSERTモードに切り替え、一番上に書かれているpickの部分をrに変更
④escを押し、:wqで上書き保存
⑤iをクリックしてINSERTモードに切り替え、コミットメッセージを変更
⑥escを押し、:wqで変更内容を保存

#１９.コンフリクトの解消
①ローカルリポジトリでmasterブランチへ切り替え【`$ git checkout ブランチ名`】
②リモートリポジトリのmasterをpull`$ git pull origin master`】
③コンフリクトしたブランチへ移動【`$ git checkout ブランチ名`】
④変更を反映させたmasterを③のブランチにマージ【`$ git merge master`】
⑤再度変更内容をリモートリポジトリへpush