【git】コミット書き換えまとめ


#難易度 : ☆
##■ amend - 直前のコミットを修正する
amendオプションを指定してコミットを行うと、
同じブランチの直前のコミットに対して内容を追加やコメントの修正をすることができます。

[主な利用シーン]
-直前のコミット漏れしたファイルを後から追加する
-直前のコミットコメントを修正する

[コマンド]

```sh:
$ git add sample.txt
$ git commit --amend
```

参考：http://www.backlog.jp/git-guide/stepup/stepup6_1.html

##■ revert - 過去のコミットを打ち消す

"revert"では、
指定したコミットの内容を打ち消すコミットを作り出すことができます。
"rebase -i"や"reset"でコミットを削除することもできますが、
そのコミットが既に公開済みであった場合は勝手に削除できません。
このような場合には、"revert"で内容を打ち消すコミットを作り出すことができます。

[主な利用シーン]
-過去に公開したコミットを安全に打ち消す

[コマンド]

```sh:
$ git revert HEAD
```

参考：http://www.backlog.jp/git-guide/stepup/stepup6_2.html

#難易度 : ☆☆
##■ reset - コミットを捨てる

resetでは、
要らなくなったコミットを捨てることができます。
実行時に影響範囲によって異なるモードを指定することで、
インデックスやワークツリーの内容も戻すかどうか指定できます。

| モード名 | HEADの位置 | インデックス | ワークツリー |
|:-:|:-:|:-:|:-:|
| `soft`  | 変更する | 変更しない | 変更しない |
| `mixed`  | 変更する | 変更する | 変更しない |
| `hard`  | 変更する | 変更する | 変更する |

HEADの位置 : branchが現在指すポインターの場所
インデックス : コミットした内容を保存する場所
ワークツリー : ローカルのリポジトリ

[主な利用シーン]
-変更したインデックスの状態を元に戻す(mixed)
-最近のコミットを完全に無かったことにする(hard)
-コミットだけを無かったことにする(soft)

[コマンド]

```sh:
git reset --hard HEAD~~
```
※`--hard HEAD~~`の"`~`"で1つ前のコミットを削除。
上記の場合は2つ前までのコミットを削除。

[+α]
reset前のコミットはORIG_HEADという名前で参照することができます。
間違えてresetしたなどの場合は、ORIG_HEADにresetするとreset前の状態に戻すことができます。

```sh:
$ git reset --hard ORIG_HEAD
```

参考：http://www.backlog.jp/git-guide/stepup/stepup6_3.html

##■ cherry-pick - コミットを抜き取る

cherry-pickでは、
別のブランチから指定したコミットをコピーして、現在のブランチに取り込む事ができます。

[主な利用シーン]
-ブランチを間違えて追加したコミットを正しい場所に移す
-別ブランチのコミットを現在のブランチにも追加する

[コマンド]

```sh:
$ git cherry-pick 99daed2
```
※***`99daed2`***は**コミット識別番号**。取り込みたいコミットを指定して取り込む。

参考：http://www.backlog.jp/git-guide/stepup/stepup6_4.html

##■ squash - ブランチ上のコミットを一つにまとめてマージする

少し特殊なmergeとして、squashオプションを紹介します。

このオプションを指定してブランチをマージすると、そのブランチのコミット全てをまとめたコミットが追加されます。

[主な利用シーン]
-トピックブランチ中のコミットを一つにまとめて統合ブランチに
統合する。

[コマンド]

```sh:
$ git merge --squash issue1
```
※`issue1`はブランチ名。issue1ブランチ上のすべてのコミットを一つにまとめたものが、マージするブランチにマージされる。


参考：http://www.backlog.jp/git-guide/stepup/stepup6_6.html

#難易度 : ☆☆☆

##■ rebase - コミットの履歴を書き換える
rebaseにiオプションを指定すると、コミットの書き換え、入れ替え、削除、統合を行うことができます。

[主な利用シーン]
-pushする前にコミットコメントをきれいに書きなおす
-意味的に同じ内容のコミットをわかりやすいように一つにまとめる
-コミット漏れしたファイルを後から追加する

[コマンド]

```sh:
$ git rebase -i HEAD~~
```
※`-i HEAD~~`の"`~`"で1つ前のコミットを対象にする。

"`git rebase -i HEAD~~`"をすると以下が出現。

```sh:
pick 9a54fd4 commitの説明を追加↲ // 2つ前のコミット
pick 0d4a808 pullの説明を追加↲   // 1つ前のコミット
# Commands:↲
# p, pick = use commit↲
# r, reword = use commit, but edit the commit message↲
# e, edit = use commit, but stop for amending↲
# s, squash = use commit, but meld into previous commit↲
# f, fixup = like "squash", but discard this commit's log message↲
# x, exec = run command (the rest of the line) using shell↲
``` 
`pick 0d4a808 pullの説明を追加`
→`pick`を`squash`に変更し保存、終了。
すると、まとめた後のコミットに設定するコミットメッセージを編集するためのエディタが表示されるので、編集して保存・終了します。
これで1つ前のコミットを2つ前のコミットにまとめることができます。

※コミットを修正したい場合は過去のコミットを指定して、`edit`とする。

[+α]
■競合時
ほかのコミットで競合が発生することがあります。
その時は、競合箇所を修正してから`add`と`rebase --continue`を実行してください。
このとき、コミットは必要ないので実行しないでください。
もし、途中でrebaseの作業を中止したくなった場合は`rebaseに--abort`オプションを指定して実行すると、これまでのrebaseでの作業をなかった事にして中止できます。

■戻す時
rebase前のコミットは`ORIG_HEAD`という名前で残っています。
もし、rebaseした後で元に戻したくなった場合は 

```sh:
git reset --hard ORIG_HEAD 
```
でrebase前の状態に戻せます。


参考：http://www.backlog.jp/git-guide/stepup/stepup6_5.html