目的
例えば、コミットが A→B→C となっている時、Bのコミットを修正したい。
そのやり方は、以下の2つがすぐに思いつく。
- Bの修正コミットB'を追加し(A→B→C→B')、
B'をBの後ろに移動し(A→B→B'→C)、
BとB'を結合する(A→B"→C)。 - rebase -i でB直後のコミットに移動し、直接Bを修正する。
競合が発生しない場合はこれでよいが、競合が発生する場合は面倒になる。(競合解消のため、ソースの差分を判断する。)
そこで、上記の方法では競合が発生するような場合でも、競合なしでコミットの順番を変更する方法を示す。
それには git revert を利用する。
方法
目的で示したものと同じ例を用いて示す。
すなわち、コミットが A→B→C となっている時、Bのコミットを修正する方法を以下に示す。
#ここで、C^はCのrevertを意味する。C^をrevertすることを再revertとする(C^^)が、これはCと同じである。
- rebase -i でC直後に移動し、revert, 再revertを行う。(A→B→C→C^→C→B')
- Bをrevertする。(A→B→C→C^→C→B'→B'^)
- B'→B'^ を C→C^ の間に移動する。(A→B→C→B'→B'^→C^→C)
- B→C→B' を結合(B")し、B'^→C^→C を結合(C")する。(A→B"→C")
以上。