俺のgitチートシート

## はじめに
個人学習でしか使ったことないです。
gitでバージョン管理をすると、よくわからなくなった際戻せるので楽
都度調べるのは面倒なので、[boostnote](https://honkideblog.com/boostnote/boostnote-legacy)にまとめています。
今回はそれを共有
PS: boostnoteは旧版が便利だと個人的に思ってます。

## Git コマンド

**ローカルリポジトリを作成** ~個人開発~
`git init`

**cloneを作成** ~チーム開発~
`git clone <Git hubのcloneの作成リンクのURL>` 

**変更状況を確認する**
`git status`

**変更内容を確認する**
`git diff` 前回のcommitからの変更
`git diff コミットAのID..コミットBのID` コミットAとBの差分
`git diff<ファイル名>`
`dit diff --staged` *git addした後の変更内容を確認* wtとstageの間

`git diff --cached` git addした後 Indexと最新のコミットの違いを確認

**ステージに記録**
`git add` 
`<ファイル名>` `<ディレクトリ名>` `全て`  .

**コミットする**
`git commit` 
`git commit -m 'second commit'`
`-v` 変更内容を確認可能

**pushする**
`git push origin master`

**変更履歴を確認する**
`git log`
`git log -n 3`
`git log --oneline`
`git log -p index.html`
`git log --graph`

---

**ファイル/ディレクトリを削除する**
*ファイルを削除したい場合エディタやshellコマンドで削除してaddしても`git rm`と同じ内容になる。git rmを使うとaddを省略できるので楽*

**ファイルやディレクトリの削除をstageに記録**
`git rm <ファイル名>`
`git rm -r <ディレクトリ名>`
*wtのファイルを削除し、stageに削除した記録をする その後commitが必要*


**ファイル削除をstageに記録するが、wtには残す**
`git rm --cached<ファイル名>`

---

**ファイル名の変更**
`git mv<旧ファイル><新ファイル>`
*wtのファイル名を変更してステージに変更したことが記録される*

---
**ファイルの場所を変更する**
`git mv <場所を変えたいファイル> 変更先のpath`

---

## 取り消しするコマンド

**ファイルへの変更を取り消す**
`git checkout -- <ファイル名>`
`git checkout -- <ディレクトリ名>`
`git checkout -- .`

**ステージに追加した変更を元に戻したい時**
`git reset HEAD <ファイル名>`
`git reset HEAD <ディレクトリ名>`
`git reset HEAD .`
*影響はステージのみ　ワークツリーはそのまま*
*どちらも戻したい場合どちらもやる*
*HEADは最新のcommitのこと*

**直前のコミットをやり直す**
`git commit --amend`
*リモートリポジトリにPushしたコミットはやり直しちゃだめ*
*今のステージの内容で直前のcommitを上書きする*
*消去ではなく上書きしている点に注意*
*複数のコミットを一度にやり直す場合Rebaseを使う*

---

## ブランチ関連

**ブランチを切り替える**
`git checkout <既存ブランチ名>`
`git checkout -b <新ブランチ名>` *作成と切り替えを一度で*

**新しいブランチを追加**
`git branch <ブランチ名>`ブランチの切り替えは行わない

**ブランチを削除**
`git branch -d <ブランチ名>` HEADは削除できない

**ブランチの一覧を表示**
`git branch`
`git branch -a` *リモートリポジトリも確認できる*

**ブランチがどのコミットを参照しているか確認する**
`git log --oneline`

**リモートブランチをローカルにコピーして移動**
`git checkout -t origin/develop`

**変更をマージする**
`git merge<ブランチ名>` HEADに指定したbranchが統合
`git merge<リモート名/ブランチ名>`
`git merge origin/master`
*他の人の変更内容を自分のブランチに統合する*
*上書きではない。統合された新しいコミットが作成される　元のブランチのコミットをベースに統合したブランチの変更分を取り込んでいる*
*fast mergeの場合はブランチを進めるだけ*
*mergeする前にローカルに落とす必要がある もしくは一気にやるか*

*`git pull`でfetchとmergeができる*




 ## リモートリポジトリ関連 command


**リモートを表示する**
`git remote`
`git remote -v` 対応するURLを表示

**リモートの情報を詳しく確認する**
`git remote show <リモート名>`
`例：git remote show origin`

**リモートリポジトリを新規**
`git remote add <リモート名> <リモートURl>`
*リモートリポジトリは複数追加可能*

**リモートリポジトリへ送信する**
`git push -u 任意の名前 master`

---
**リモート名を変更**
`git remote rename <旧リモート名> <新名前>`

**リモートを削除**
`git remote rm <リモート名>`
`例 git remote rm tutorial`

---

## リモートリポジトリから情報を取得する
**fetchを使う**
`git fetch <リモート名>`
`例：git fetch origin`　　通常はこっち
`例：git fetch origin master`
*リモートリポジトリをローカルリポジトリにコピーする*
*ワークツリーは変わらない*

取得したコミットをワークツリーに反映
`git merge origin/master`

*`git fetch`した内容は`remotes/origin/<ブランチ名>`*に登録される
`git branck -a`で確認できる

**pullを使う**
*リモートの情報取得をマージを一度に行う*
`git pull <リモート名> <ブランチ名>`
`例： git pull origin master`
*上記の例は`git pull`で省略可能*

*pullは挙動が特殊。pullすると現在いるブランチにmergeする*
*予想外のブランチに統合する可能性があるので基本fetchを使う*


*`rebase`型の`pull`*
`git pull --rebase <リモート名> <ブランチ名>`
`git pull --rebase origin branch`