Git チートシート

## ステータス確認系
- git status : 状態の確認
- git show [ID] : 変更の確認
- git log : ログ確認
- git log --decorate : HEADつきのログを表示
- git log --oneline : ワンラインのログ表示
- git log --graph  : ログをグラフ表示  
- git log [branch]  : 指定branchのログを見る
- git config -l : gitの設定を表示
- git cat-file -p [hash] : commit情報を確認
- git diff [id1] [id2] : 差分を確認

## git remote 系
- ※originはリモートリポジトリの変数名のようなもの
- git remote : リモートの名前を表示
- git remote rm [name]  : 設定削除
- git remote -v  : originの向き先を確認
- git remote prune origin : リモートリポジトリを更新（state=消えていないブランチを消す）

### originの設定変更     
- git remote add [name] [remote repository] : リモートリポジトリの名前設定を付追加
- git branch --set-upstream master [name] : originの変更

## git init 系
- git init : 新規リポジトリの作成
- git init --bare —shared : bareリポジトリの作成
    - 作業ファイルがなく(裸)、管理ファイル（更新情報）のみ
    - サーバー側のリモートリポジトリとして扱われる
    - sharedオプションで共有設定
    - bareの前にハイフンを二つつけないと内部構造がおかしくなる
    - 変更状態のみ保持しているので、実際に作業したファイルは直接みれない
    - ワーキングディレクトリをもたない

## git clone 系
- git clone [対象リポジトリのuri] [clone場所] : cloneを作成
    - clone場所に注意

## git add 系
- git add [file] : インデックスにあげる

## git commit 系
- git commit -m “message” [file] : コミットを行う
    - mオプションをつけることで単一コメントが可能
    - 新規ファイルやディレクトリも、add commitしない限り反映されない
- git commit -am [file] : 一度addしたファイルに対して、addとcommitとを同時に行う
- git commit —amend : 最新のcommit Messageを変更
    - editerで編集することができる
    - HashIDも変化するのでpullやpushする際は注意が必要

## git push 系
- git push [リモートリポジトリのパス] [ローカルのブランチ名]:[リモートのブランチ名（正しくは特殊変数refspec)]
    - 他リポジトリのbranchに変更を加える
    - 引数の両ブランチ名が同じなら[branch]を一つ書くだけで省略できる
    - 引数省略するとgitの設定により挙動が変わる場合があるので注意
    - cloneしてきたリポジトリなら、リモートリポジトリのパスをoriginに省略できる
    - --allオプション(宣言位置はどこでも)で、全てのローカルブランチをpushできる
    - エラーメッセージ：`fast-forwards`は、最新ということを示す
    - 指定branchがremoteにない場合は新規作成される
    - git push [remote] :[remote branch] で空を送る =remote branchの削除が可能

## git fetch 系
- git fetch [remote repo] [branch]
    - 他リポジトリのbranchから追跡ブランチを取得
    - fetchで取得したブランチのcommitは、名前のないブランチとして取り込まれる
        - これは、FETCH_HEADというブランチ名でチェックアウトできる
    - 取得ブランチを取り込みたい場合はこのブランチをmergeするか、改めてpullすればいい
    - [branch]を省略で全てのbranchを取得
    - push時にconfrictが起きる状態で行うと、勝枝を増やしてくれる(= branchの取得)
        - これは、リモートリポジトリの情報をローカルに持ってきているため
        - git merge origin/master でmergingモードに入ることができconfrictを解消する必要はある

## git pull 系
- git pull [リモートリポジトリのパス] [リモートのブランチ名(正しくは特殊変数refspec)]
    - 他branchの変更をカレントbranchに取り込む
    - pull自体、fetchのあとにmergeをするようなもの
    - branchを省略した場合は、カレントbranchに[branch]がfetch → mergeされる（remote branchの追跡ブランチがローカルに残らない）
        - 指定した[branch]に変更が加わるわけではないので注意
    - エラーメッセージ：`non-fast-forward`は、最新でないという意味
- git pull --rebase
    - pullした時の挙動が fetch → mergeから fetch → rebaseになる

## git merge 系
- git merge [branch]
    - **カレントbranchに、選択branchを統合**する

## コンフリクト起こしたら
- 自分で該当箇所を編集 → add → commitすればいい
    - confrict時のcommitメッセは残らないままでいい(再commit時のメッセージで統合されるので)
- push時のconfrictに関して、解消して再度pushをすれば、相手側で取り込む(pull)ものはconfrict解消済みのものを取り込める
- pull時のmerge messageでvimが開く場合は、「mergeを勝手にしたのでmerge messageを編集しろ」という意味

### マージ時のconfrictを片方だけ採用したいとき
- git checkout --ours [file] : checkoutしているbranch側にあわせる
- git checkout --theirs [file] : mergeされたbranch側にあわせる
    - confrict状態であれば、何回でも繰り返せる
    - 解消後、add commitを忘れないように注意

## git branch 系
- git branch : 現在のブランチを表示
- git branch -a : 追跡ブランチ(赤色)含むlocal branchを確認
- git branch -r  : 追跡ブランチのみ確認
    - `remotes/origin/HEAD->origin/***` はcloneした後に作業ディレクトリにcheckoutするbranchを表す
- git branch [branch] : 新規branch作成
- git branch [old_branch] [new_branch] : new branch を old branch に取り込む 
- git branch -d [branch] : branchを削除
    - DオプションでHEADにmergeされていないbranchも削除できる
    - カレントbranchはcheckout後でないとdeleteできない
- git branch -m [old name] [new name] : branchの名前を変更
- git branch -m [new name] : カレントbranchの名前を変更

## git checkout 系
- git checkout [branch] : branchに移動
    - : 追跡ブランチを指定してリモートにアクセスすることも可能
- git checkout -b [branch] : 作成と同時に移動(branchのb)
- git checkout [ID] [file] : 特定のcommitIDの時点に戻す
- git checkout HEAD [file] : 最後にcommitした時点まで戻す = `git checkout [file]`
- git checkout -b [branch] [origin/branch] : リモートブランチを[branch]の名前で取得して移動

## git reset 系
- git reset --hard 
    - すべて(ワーキングツリー、インデックス、HEAD)を最新のcommit地点まで戻す
- git reset HEAD : HEADの位置とインデックスをHEADに動かす
    - = `git reset --mixed HEAD`
    - addしたものを戻す
    - ただしrmで消すのとは異なり、足跡が残る
- git reset --hard HEAD~ : 1つ前のcommit状態に戻る
- git reset --hard HEAD~2 : 2つ前のcommit状態に戻る
- git reset softとhardの違い
    - git reset --soft : ワークディレクトリの内容はそのままでコミットだけを取り消す。
    - git reset --hard : コミット取り消した上でワークディレクトリの内容も書き換える。

## git stash 系
- git stash  : commit後の更新されていない変更を退避
- git stash list : 退避リストが見れる
- git stash pop : 元に戻す
- git stash apply : リストを残したまま戻す
- git stash save 'hoge' : stash自体に名前をつける
    - ただし、名前からstashを取れるわけではない(メモリは一つなので)
- git stash drop : stashを削除

## git tag 系
- git tag [val] : 最新のcommitにタグをつける
    - checkoutでタグを指定して戻すことができる

## git revert 系
- git revert [ID] : ID時のコミットのみを取り消す
    - AA → BB → CC のコミット順序で、BBのIDをrevertすると、AAとCCのみ残る
        - resetやcheckoutではBB以降のCCも消えてしまう
    - revertを取り消すのは、`git revert --abort`

## git rebase 系
- git rebase [元になるbranch] [変更されるbranch(省略するとカレントbranch)]
    - 他branchの変更を取り込み吸収する
    - 履歴がわかりやすくなるというメリットがあり、複数のcommitを一つにできる。
- git rebase develop [branch]
    - [branch]にdevelopを取り込む。headは[branch]になる
    - rebaseの後は `git add` → `git rebase --continue`を行う
        - rebaseは古い履歴から順にcommit単位でたどられるので、最新の情報とconfrictするわけではない
        - つまり、過去のコンフリクトから順に解消してしなければならない

### git rebase -i [ID（HEAD~[数値]）]
- 指定したcommitの削除
    - 修正したいIDの一つ前を指定
    - 指定されたID以降のcommitがpickで表示される pick=そのまま利用
    - pick idを消すとそのコミットが消される
- 指定したcommitの変更
    - 修正したいIDの一つ前を指定
    - 下の"pick"を"s"に書き換える → editerが再度立ち上がり、commit messageを変更できる
- 指定したcommitの編集
    - 修正したいIDの一つ前を指定
    - "pick"を"e"に書き換え
    - （一時的に停止, コンフリクトしているので修正&addしろとmessage）vimで編集 → `git add`
    - `git commit --amend` で、commit message変更
    - `git rebase --continue` で、rebaseの再開

##その他
### インデックスからファイルをアンステージする(deleted logの削除)
- git rm [file]
    - --cachedオプションでファイルは残す
    - -rオプションでディレクトリ削除
    - -fオプションで強制

### ファイルをgitの対象外に指定したい
- .gitignore
    - このファイルに追記したファイルはgitの対象外になる(トッラキングの対象外)
    - ただし、一度インデックスに載ったことがあるファイルは後で.gitignoreにいれても対象外にならない。
    - `git rm --cached [file]`でインデックスから降ろし、対象外にできる
    - 正規表現で判定されるので注意

### その他 : 「No newline at end of file」が出た時
- 末尾に改行が含まれていないため、警告がでている状態
- vimにて、`:set binary noeol`実行で解決。