Git・Githubまとめ

# リポジトリを作る
```shell
//sample ディレクトリを作成
mkdir sample

//sampleディレクトリに移動
cd sample

//今いるディレクトリをGitリポジトリとして設定
git init 
```
※.gitは隠しファイルなので普段は表示されないが、＜Command + Shift + . ＞で隠しファイルが表示できる。
# 状況確認
```
//作業ディレクトリの状態を確認
git status
//リポジトリとファイルの差分をチェック
git diff
//リポジトリとステージの差分をチェック
git diff -staged
```

# コミットする
```
//指定したファイルをステージする
git add ファイル名
//全てのファイルをステージする
git add .

//コミットメッセージを添えてコミットする（スナップショット）
git commit -m "コミットメッセージをここに書く"
```
※コミットすると、**誰が・いつ・何**を変更したが記録されるが、何のために変更したのかわからないため、コミットメッセージにてなぜ変更したのかを書く必要がある。
# 変更履歴の確認
```
# 変更履歴の確認
git log
```
# 変更をもとに戻す
```
//ワークツリーの変更を取り消す
git restore ファイル名
//ステージ上げた変更をワークツリーに戻す
git restore -staged ファイル名
```
# チェックアウトでコミットを移動する
```
//指定したコミットに移動する
git checkout コミットID
```
# フォーク
フォークとは**他の人が公開しているリモートリポジトリを自分のリモートリポジトリにコピーすること。**
※Github上で操作する。
# クローン
クローンとは**Github上でコピーされたリモートリポジトリを自分のパソコンにダウンロードする**
[↓Code]ボタンをクリックし、[HTTPS]が選択されていることを確認し、URLをコピーする。
```
//リモートリポジトリをクローンする
git clone 自分のリモートリポジトリのURL
```
# ブランチを作る
```
//存在するブランチを一覧表示
git branch
//現在のブランチを元にして、新規ブランチを作成する
git branch ブランチ名
//指定したブランチに移動する
git checkout ブランチ名

//一つのコマンドで新規ブランチを作成して、作成したブランチに移動する
git checkout -b ブランチ名
```
# ブランチを作ってコミットする
```
//profileブランチを新規作成して、profileブランチに移動する
git checkout -b profile
//member.htmlをステージする
git add member.html
//コミットメッセージを添えてコミットする(スナップショット)
git commit -m "新たに紹介文を追加"
//masterブランチに移動する
git checkout master
```
# ブランチを統合する(マージ)
マージとは**本番用のmasterブランチに自分が変更したコードを統合すること**。
```
//マージコミットを作りたいブランチA（master）に移動する
git checkout ブランチA
//マージしたいブランチBを指定してマージする
git merge ブランチB
```
※先程の例ならば、ブランチAがmaster、ブランチBがprofile
# プッシュとは
プッシュとは、**ローカルリポジトリで起きた変化をリモートリポジトリに反映すること（アップロード）**
```
//ローカルリポジトリで行った変更を、リモートリポジトリにプッシュする
git push リモートリポジトリ名　ブランチ名
//※リモートリポジトリ名がorigin、ブランチ名がmasterのとき
git push origin master
```
# プルとは
リモートリポジトリで起きた変更を、ローカルリポジトリに反映すること
```
//プルしてきたいブランチにチェックアウトする
git checkout ブランチ名
//リモートリポジトリ上のコミットを、ローカルリポジトリの現在のブランチに取り込む
git pull リモートリポジトリ名 ブランチ名
//※リモートリポジトリ名がoriginで、ブランチ名がmasterのとき 
git pull origin master
```
# コンフリクトの対処法
コンフリクトとは、同じ行に同時に別々の修正がされたときに発生するバグ。
→どちらの修正を採用すればいいのかわからなくなるために、発生する。
コンフリクトした部分を、エディタで直接編集・保存してから、以下のコマンドで操作する。
```
//修正したファイルをステージする
git add ファイル名
//普通にコミットする
git commit -m "コミットメッセージ"

//コンフリクトの箇所が多すぎて修正が難しい場合、コミット前で荒れた、以下のようにしてマージをキャンセルできる
git merge --abort
```
# プルリクエストとは
プルリクエストとは、自分がした変更をフォークした元のリポジトリに取り込んでもらえるように提案すること。
プルリクエストの目的は、本流のブランチにマージされること。
## プルリクエストまでの流れ
1.フォークする
GitHubにて[Fork]ボタンを押して、自分のリモートリポジトリに複製する
2.クローンする
```
//指定のリポジトリをクローンする
git clone リポジトリURL
//クローンで作成されたディレクトリに移動
cd ディレクトリ名
```
3.ブランチを作ってコミットする
```
//ブランチを作ってそのブランチにチェックアウトする
git checkout -b ブランチ名
//コミットする
git add ファイル名
git commit -m "コミットメッセージ"
```
4.プッシュする
```
git push origin ブランチ名
```
5.GitHub上でプルリクエストを作成する

GitHub上で、フォークしてきたリポジトリのトップページを更新すると、画面上部に[Pull repuest]と[Compare]が表示される。
Compareページを開くと、「masterブランチと自分のリポジトリのブランチが比較」と「どの行で、どんな変更があったのか詳細を確認」問題がなければ、[Create Pull request]ボタンをクリック。

6.マージされる

Fork元の作成者が内容を確認し、[Merge pull request]ボタンをクリックするとマージされる
# バージョン管理しなくていいファイルを無視する
* OSが自動生成するファイル
* キャッシュ
* 容量が大きすぎるもの
そのようなバージョン管理が必要ないファイルは **.gitignore** というテキストファイルを使ってGit管理しないように設定できる。

**↓除外するファイル名（例)**
|ファイル・ディレクトリ名|説明|
|-|-|
|.DS_Store|macOSが自動生成するもの|
|Thumbs.db|Windows OSが自動生成するもの|
|.sass-cache/|Saasのキャッシュ。管理が必要ないため、除外する|
|*.css.map|Sassのソースマップ。Sassの適用箇所を辿るために出力するもの。管理が必要ないため、除外する|
## .gitignoreの書き方
```
// 自分用のメモファイルを無視する
memo.txt
//　.rbcという拡張子がついているファイルを無視
*.rbc
//例外として、text.rbcは無視しない
!test.rbc
//特定のディレクトリ名(config_c)以下を無視
config_c/
//ルートディレクトリ直下にあるものを指定する
//※ルートディレクトリにあるlogというディレクトリ以下を無視するとき
/log/
```
## .gitignoreのコミット
```
//.gitignoreファイルをステージする
git add .gitignore
//.gitignoreファイルをコミットする
git commit -m "add file to .gitignore"
//.gitignoreに .DS_Storeを追加編集する
echo .DS_Store >> .gitignore
```
# 余計なファイルをコミットしてしまいignoreしたいとき
## 今後の管理から対象のファイルを外すとき
```
//gitの管理から削除
git rm --cached <ファイル名>
//gitignoreファイル内にそのファイル名を記入
echo '<ファイル名>'　>> .gitignore
```
## ファイルの履歴からも消す
```
git filter -branch -f --index-filter 'git rm --cached -rf --ignore -unmatch <ファイル名>' HEAD
```