gitコマンド備忘録

# git stash



## 機能

変更内容を一時的に退避させておく機能



## 使いどころ

- branchを切って作業中に他のブランチを修正するように言われた時
- branch切るのを忘れてmasterで変更してしまった内容を他のbranchに移動させたいとき



## コマンド

### stashする

```
$git stash {save}
```

※saveは省略可能

#### メッセージを付けてstash

```
git stash save "message"
```

#### addしてない変更のみをstash

```
$git stash -k
```

### stashした内容を確認する

```
$git stash list
stash@{0}: WIP on shash_test: af31ecc Create README.md
```

```
<stash名>: WIP on <stashを行ったブランチ名>: <ハッシュ> <コミットコメント>
```

※ハッシュ、コミットコメントはstashを行った時のHEADのもの

####変更内容を確認

```
$ git stash list -p
```

```
diff --git a/README.md b/README.md
index 1e523a5..12419f4 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
 # git_test
+
+stash_test
\ No newline at end of file
```

####stashしたファイルの一覧を表示

```
$ git stash show <stash名>
```



### stashした内容を適用する(stashも同時に削除)

```
git stash pop # 最新のスタッシュを適用し、削除 
git stash pop {N} # N番目のスタッシュを適用し、削除
```

戻した時にコンフリクトが起きるとか、別なブランチにも適用したいとかなるとめんどそうなのでpopじゃなくてapply→dropで削除するほうが良いと思う。



### stashした内容を適用する(stashは残る)

```
git stash apply # 最新のスタッシュを適用し、残す
git stash apply {N} # N番目のスタッシュを適用し、残す
```

上記コマンドだと、stash前にaddしていた変更もaddされていない状態に戻る(staged → not staged)

下記のようにオプションをつけて戻すことでaddされた状態で戻せる

```
git stash apply {0} --index
```



### stashを削除(特定のstash)

```
git stash drop # 最新のスタッシュを削除
git stash drop {N} # N番目のスタッシュを削除
```



###stashを削除(全て)

```
git stash clear
```



# git merge

## 使いどころ

- masterから切り出した作業ブランチでのcommit,pushが終わった後にコンフリクトが発生してる場合
- 作業ブランチでの作業中に他のブランチのコミット履歴を取り込みたい時



## 手順

最新の状態のmasterをmergeしたいのでmasterブランチを最新化

```
git checkout master
git pull
```

作業ブランチに戻る

```
git checkout <topicブランチ>
```

mergeする

```
git merge master
```

コンフリクトが発生したら解消した上でaddしてmergeを続行する

```
git add <修正したファイル>
git merge --continue
```

mergeが完了したらcommitしてpush



# git rebase

## 使いどころ

- 作業ブランチをcommit,pushした後にmasterのコミット履歴を取り込んだ上でそのコミット履歴の後ろに作業ブランチのコミット履歴をくっつけたい時

- rebaseだとgitのpullリク画面のコミット履歴が綺麗だから自分はよくこっちを使う



## 手順

最新の状態のmasterをrebaseしたいのでmasterブランチを最新化

```
git checkout master
git pull
```

作業ブランチに戻る

```
git checkout <topicブランチ>
```

rebaseする

```
git rebase master
```

コンフリクトが発生したら解消した上でaddしてrebaseを続行する

```
git add <修正したファイル>
git rebase --continue
```

完了したらpushしたいところだが、いつも通りpushしてもできないのでオプションをつけて強制的にpushする

```
git push -f origin <topicブランチ>
```

コミット履歴を確認してmasterブランチの履歴→作業ブランチの履歴の順になっているか確認してみる

```
git log
```



## 注意点

複数人が同時に一つの作業ブランチにpushしてる場合、一人がrebaseした後に他の人がpushしようとしてもできないらしいので注意。

# Revert/Reset

コミットを元に戻したい時に



## Revert

取り消したいコミットを打ち消すようなコミットを新しく作成する。
既存のコミット内容は残ったまま。
**特定のコミット**を元に戻す。(指定以降の処理全てを戻す場合はreset)



### コマンド

#### revert

revertする(コミットメッセージ編集)

```
$git revert <commitID>
```

コミットメッセージを編集しない場合

```

```

#### コミットしないrevert

revertコマンドを使用するとコミットも行う。
indexに戻すだけなら次のコマンド

```
$git revert <commit> -n
or
$git revert <commit> --no-commit
```

数個分のcommitをrevertしてcommitしてpush!!



#### マージコミットのrevert

マージコミットを戻す場合、マージした2つのコミット(親)のうちどちらに戻すかを指定する。

`-m`オプションをつけて親を数字で指定(基本的に1か2)

```
$git show
commit ae2cc52245ccd67e0798acdc6afcd46756643ea1 (HEAD -> K, origin/K)
Merge: de1d774 a8b5b8f ←左から1,2

$git revert -m 1 <commitID>
```



## Reset

コミットした内容を取り消す



### コマンド

#### 指定ファイルをステージングから削除

```
$git reset <file>
```

#### 全てのファイルをステージングから削除

```
$git reset
```

#### 現在のブランチを指定コミットに戻す

```
$git reset <commitID>
```

#### コミットのみ取り消す

```
$git reset --soft <commitID>
// 直前のコミットを取り消す場合
git reset --soft HEAD^
```

#### コミット内容も全て取り消す

コミット内容、ステージングエリアへの移動も取り消す

```
$git reset --hard <commitID>
// 直前のコミットを取り消す場合
$git reset --hard HEAD^
```



### 間違ってresetして事故った時"reflog"

間違ってresetしちゃった時に元に戻す方法

```
// reflogで過去のコミット履歴を見れる
$git reflog
de1d774 (HEAD -> L) HEAD@{0}: reset: moving to HEAD@{18}
af31ecc HEAD@{1}: reset: moving to HEAD@{0}
af31ecc HEAD@{2}: reset: moving to HEAD^
eb5bff0 HEAD@{3}: reset: moving to HEAD^
5f19704 HEAD@{4}: reset: moving to HEAD^
6df3f5d HEAD@{5}: reset: moving to HEAD^
af3c6bb (origin/test2) HEAD@{6}: reset: moving to HEAD^
cce35a4 HEAD@{7}: reset: moving to HEAD^
c5b101f HEAD@{8}: reset: moving to HEAD^
3b36f82 HEAD@{9}: reset: moving to HEAD^
5c91984 HEAD@{10}: reset: moving to HEAD^
67c1344 HEAD@{11}: reset: moving to HEAD^
11b1153 HEAD@{12}: reset: moving to HEAD^
15ba5c9 HEAD@{13}: reset: moving to HEAD^　// ←ここらへんからresetしまくってる

// 15ba5c9のコミット時点に戻りたい場合
$git reset --soft HEAD@{13}
```
reflog、正しくは"参照"した履歴を見れる。
ブランチ移動・削除・名前変更、stash、mergeとかとか。

# 他のコマンド

変更を元に戻す

```
//１つのファイル
git checkout {ファイル名}

//全ファイル
git checkout .
```

差分表示

```
git diff
```

不要なブランチ削除

```
git branch -D {ブランチ名}
```