Gitコマンドについてまとめ（備忘録）

#はじめに
いままでSourceTreeに頼ってgitコマンドについて
おろそかになっていたので自分のためにもまとめます。コマンドを通して、Gitの仕組みも改めて冷静に見ていきたい。
備忘録シリーズその４？（数えてない）


そもそもGitとは？な場合↓が個人的に一番わかりやすいと思います。
サルでもわかるGit入門https://backlog.com/ja/git-tutorial/intro/01/

複数人で同じファイルの差分を共有・管理するための仕組みのことですね。

いきなりですが、下記に良く使う（はず）のコマンドをまとめていきます。



#確認用コマンド

①全体の変更を確認する

```
$ git status
```

変更点の現在の状態を見る。addしたファイル、commitしたファイル、conflictしたファイルなどが確認できる。

②特定のディレクトリ・ファイルの変更を確認する

```
$ git status [ディレクトリパス or ファイルパス]
```

ディレクトリを指定すると、その箇所の変更点のみ確認できる。
指定しないと全管理対象の変更点が確認できる。

##○変更の履歴を見る

```
$ git log [オプション]
```
作業ブランチの履歴を見ることができる。

|オプション|説明|
|---|---|
|--oneline|ハッシュ値＋commitメッセージの1行目を見ることができる|
|--graph|ブランチの分岐を確認できる。（GitLabのNetworkのようなものでツリーを把握する際に良い）|
|-p|コミットの変更点を見ることができる|
|-p[ファイルパス]|そのファイルの変更点を見ることができる|
|--author=[ユーザー名]|	指定したユーザーのcommitメッセージを見ることができる|
|--grep [検索文字列]|検索文字列に合致するコミットのみ表示できる|
|--name-only|変更したファイル名のみ表示(-pと併用した場合、こちらが優先)|


##○トピックブランチに対する変更内容を見る
master ブランチに対して、トピックブランチに関してどのようなcommitがあったかを確認する

```
git log master..[トピックブランチ名]
```

##○変更点をadd（追加）する

```
$ git add [ファイルパス]
```
設定方法	説明
-u [削除済ファイルのパス]	ファイルの削除履歴をaddする
インデックスにファイルを登録する。ディレクトリ指定可能。

##○変更点をcommit（確定）する

```
$ git commit [オプション]
```

|オプション|説明|
|---|---|
|-m "commitメッセージ"|1行のコミットメッセージを付けてcommitができる|
|--allow-empty|空commitの作成(-mと併用できる)|

##○変更点をpush（通知）する
```
$ git push origin [ローカルブランチ名]:[リモートブランチ名]
```
##○差分を抽出する

```
$ git diff [オプション] ([設定値])
```
|設定方法|説明|
|---|---|
|オプションなし|全体の差分を抽出する|
|--name-only|差分があるファイル名のみ抽出する|
|[ディレクトリパス]|特定のディレクトリの差分を抽出する|
|[ファイルパス]|特定のファイルの差分を抽出する|
|[old_commit][new_commit]|commit同士の差分を抽出する|


##○修正者を確認する

```
git blame [ファイル名]
```
##○指定したcommitの変更点を見る

```
$ git show [commitのハッシュ値]
```

##○変更点を一旦退避させる
作業している最中に別ブランチをMergeするなどの操作が必要なときに使います。

```
$ git stash [オプション] ([設定値])
```
本来はgit stash saveだが、saveは省略できる。

|設定方法|説明|
|---|---|
|save "コメント"|コメント付きで一旦退避できる|
|list|現在退避させている変更点の一覧を表示|
|pop|退避させた変更点を再度適用する|
|clear|退避させている変更点を全て削除する|
|drop|1つずつ削除。何も指定しなければ最新のもの、dropの後に引数を指定すれば特定のものを削除可能)|


#ブランチ操作編

##○ブランチの作成・削除

```
$ git branch [オプション] [ブランチ名1] ([設定値])
```
|設定方法|説明|
|---|---|
|プションなし|新規ブランチの作成|
|-d [ブランチ名1]|ブランチの削除|
|-D [ブランチ名1]|ブランチの強制削除|
|-m [ブランチ名1][ブランチ名2]|ブランチ名1からブランチ名2へ名前を変更
|-l [ブランチ名1][commitのハッシュ値]|特定commitでブランチを切る
|-vv|全ブランチのHEADを確認する|

##○作業ブランチの変更(チェックアウト)

```
$ git checkout[オプション] [ブランチ名]	
```
|オプション|説明|
|---|---|
|-b|指定したブランチ名でブランチを作成し、チェックアウトする|

##○[cf]ブランチを切るとどうなるか
特定のワークツリーからブランチを切ると、新しいブランチのHEADは切ったワークツリーのHEADと同じ状態になる。

branchA：HEAD 1
branchB：HEAD 2
branchC：HEAD 3
branchAで新しくブランチを切ったとき
branchA：HEAD 1
branchB：HEAD 2
branchC：HEAD 3
branchD：HEAD 1



＃履歴操作編

間違った操作をしてしまったり、変更を取り消す必要がある際などに良く使うコマンド。

##○「HEAD^」についてHEAD^はワークツリーの最初のcommit。
「^」を増やすと次のcommitになる。以降、「HEAD^」と記載した箇所は「^」を増やせば次のcommitを指定できる。

##○addを取り消す

```
$ git reset HEAD [ファイル名]
```
##○commitを取り消す

```
$ git reset [オプション] HEAD^
```
|オプション|説明|
|---|---|
|--soft|commitのみ取り消し、ファイルの変更は残す|
|--hard|commitもファイルの変更も全て取り消す|

##○commitメッセージを修正する
直前のcommitメッセージを直す場合は下記のようになる。

```
$ git commit --amend
```

直前でない場合、git rebase -i を参考のこと。

##○commitを打ち消す
あるcommitを打ち消す。commit履歴は残したままその変更をなかったことにできる。

$ git revert [commitCのhash値]

commitメッセージはRevert [指定したcommitのcommitメッセージ]になる。


##○commitした中の1ファイルだけ取り消す
複数ファイルでcommitしたが、1ファイルだけ戻したいときに使う。

```
$ git checkout [commitのハッシュ値] ファイルパス
```
##○pushしたcommitを取り消す

```
$ git push -f origin HEAD^:[ブランチ名]
```

##○commitを別ブランチのHEADに移動する
commitを移動先ブランチへ移動し、下記コマンドを使う。conflictしやすいので注意する。


##○git rebase -i でcommitメッセージの修正やcommitの統合を行う

```
$ git rebase -i [ハッシュ値 or HEAD^]
```

①commitメッセージの修正
変更したいcommitメッセージの左横にあるコマンドを「reword」にして保存
新しいcommitメッセージを書いて保存
②commitをまとめる
まとめたいcommitメッセージの左横にあるコマンドを「squash」にして保存
pick [ハッシュ値] commitA
squash [ハッシュ値] commitB

##○git reflogを使って過去の履歴に戻る

```
$ git reflog
```

上記コマンドを打つと、下記のようなログが出る。

[ハッシュ値] HEAD@{0}: 処理:  処理の詳細
[ハッシュ値] HEAD@{1}: 処理:  処理の詳細
[ハッシュ値] HEAD@{2}: 処理:  処理の詳細
…
…
git reset --hard を使用し、HEADの位置をずらす。

git reset --hard HEAD@{X}
ちなみに ブランチに関わらずHEADが指定したものになるっぽいので注意。



＃Git設定編
##○リポジトリの作成をする

①Gitリポジトリをカレントディレクトリに作成する
$ git init
②Gitリポジトリを特定のディレクトリに作成する
$ git init [ディレクトリパス]
③ベアリポジトリ 2 を作成する
$ git init --bare [ディレクトリパス]

##○ユーザー情報を設定する
$ git config --global user.name "あなたの名前"
$ git config --global user.email "あなたのメールアドレス"
最低限上記の内容は設定しないとエラーになる。
他にも下記のようなものがある。

##○Gitの出力をカラーリングする

```
$ git config --global color.ui auto
```
##○Gitのエイリアスを設定する

```
$ git config --global alias.co checkout

```

##○日本語のファイル名を表示できるようにする

```
$ git config --local core.quotepath false
```

##○エディタをvimにする

```
git config --global core.editor 'vim -c "set fenc=utf-8"'

```

##○Gitの設定を確認する


```
$ git config --global --list

```

※--globalを設定していない場合は--globalは不要です。

##○gitの設定ファイルについて
グローバルは~/.gitconfig 、リポジトリ毎は.git/configに保存されている。
コマンドを打つと保存される。

【便利な設定】git logを見やすくする
参考サイト
https://blog.toshimaru.net/git-log-graph/


##○ブランチの設定をする
.git/configを設定する。
これにより、originを省略することも可能。

【設定コマンド】push/pull時の　origin master　を省略する
下記コマンドを打つと.git/configに設定が追記される。
設定後はgit pull git pushでOKとなる。

```
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
```

よく使う設定はconfigに書いて常に有効にしておくと良さそう。


##○リモートリポジトリの参照を確認

```
$ git remote -v
```

設定されている全てのリモートリポジトリが確認できる。

##○リモートリポジトリの参照を追加

```
$ git remote add [任意の名前] [Gitリポジトリ]
```

##○リモートリポジトリの参照を削除

```
$ git remote rm [任意の名前]
```

##○.gitignore
Gitの管理外ファイルを設定する。
リポジトリ下に配置。

#Git対象ファイル操作編
##○Git管理対象ファイルのファイル名を変更
git mv [変更前ファイル名] [変更後ファイル名]
新規ファイルではなく、変更ファイルとして扱われる。


#リポジトリ取得編
##○リポジトリをcloneする

```
git clone [リポジトリのURL] ([cloneしたいディレクトリ名])
```

ディレクトリ指定でcloneすることも可能。


#rebaseとmerge編
##○rebase

```
git rebase [取り込みたいブランチ名]
```

AブランチにBブランチを取り込みたい場合はAブランチに移動してから。

```
git checkout A
git rebase B
```

rebaseの特徴
履歴を付け替える。
rebaseすると取り込み側のcommitIDが変わるのでリモートにpushする側のブランチではrebaseしない方がよい。


##○merge

```
git merge [取り込みたいブランチ名]
```

AブランチにBブランチを取り込みたい場合はAブランチに移動してから。

```
git checkout A
git merge B
```

mergeの特徴
履歴を合流させる
commitIDはそのまま

Fast-Forword：MergeCommitを作らない(履歴が分岐していない)
Non Fast-Forword：MergeCommitを作る(履歴が分岐している)

merge or rebaseを間違った直後に取り消したいとき

```
git reset --hard ORIG_HEAD
```

[cf] pull
pull = fetch + merge
pull --rebase = fetch + rebase


参考:
[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/intro/01/)
[gitコマンドを体系的に覚えよう](https://kitsune.blog/git-command)
[gitコマンドの基本的な使い方](https://qiita.com/wwacky/items/2f110ee76fc1cb681c3b)
[美しき git log --graph のエイリアス](https://blog.toshimaru.net/git-log-graph/)
[pimping out git log](http://www.jukie.net/bart/blog/pimping-out-git-log)