revertのrevert|ブランチを過去の状態に戻して、戻した作業に追加の作業をした後、またマージし直す
ここに、マージ先ブランチとマージ元ブランチがある。
マージ元ブランチの作業が終わり、マージ先ブランチにマージした。
しかし、マージした後に、不具合が見つかってしまった。
一度過去の状態に戻して、不具合を修正したら再度マージし直そう。
まず、ブランチを過去の状態に戻すためにRevertする。
git revert -m 1 D
※DはコミットIDを表す。ここでは、図のコミットDのIDをDとする。
マージコミットをRevertする時には、 -m 1 というオプションが必要になる。何をしているのかというと、マージ先ブランチの1個前なのか、マージ元ブランチの1個前なのか、どちらの状態にしたいのかを選んでいる。
今回はマージ先ブランチの1個前の状態にしたいため 1 を記述する。
これで、マージする前の状態に戻すことができた。
次に、マージ元ブランチで不具合の修正をしていく。
FとGの作業をして不具合を修正した。
もう一度マージしよう。
・・・ん?差分がFとGの作業しかないんだけど。
AとBとCの作業も差分として表示されないとおかしい。
おかしいと感じるかもしれないが、AとBとCの作業は表示されないのが正しい。
なぜなら、マージ先ブランチには、すでにAとBとCの作業が存在しているからだ。
Revertで打ち消してはいるが、AとBとCの作業を相殺するコミットを作って上書きしているだけであって、AとBとCの作業はずっとマージ先コミットに残り続ける。
1つのブランチに全く同じコミットが複数存在することはできないので、もう一生、AとBとCの作業そのものを新しくマージすることはできない。
・・・え、じゃあAとBとCの作業どうするんだ。。
この問題を解決するためには、RevertをRevertする。
まずは、マージ先ブランチをマージ元ブランチに逆マージする。これで、マージ元ブランチにもRevertのコミットログがある状態になる。この状態で、Revertのコミットに対してRevertする。
git revert E
※EはコミットIDを表す。ここでは、図のコミットEのIDをEとする。
AとBとCを打ち消した状態になっているのを、AとBとCを打ち消した状態を打ち消した状態にする。そうすることで、AとBとCの作業を復活させることができる。
これで、AとBとCの差分も表示されるようになる。
反映したい作業の全てを差分として確認することができた。
これで再度マージすることができる。
※もし僕の理解が間違ってる箇所があった場合は教えてください🙇♂️
Discussion