リバート後に修正してマージしたいとき【Git】
リバートとリセットの違い
リセットはコミットを削除するのに対して、リバートはコミットを打ち消すコミットを追加します
リセット
リバート
ローカルブランチでの変更はリセットでも良いですが、リモートブランチの場合はリセットが推奨されなかったりブランチの保護があることがあります
そのためリバートを使うことが多いかと思いますが、リバートも元に戻したい場合があります
条件設定
次のようにfeature
でのコミットをmain
にマージしている状態を考えます
GitHubならPRでマージしたような場合です
main
をA
に戻したいとき
ここで、main
にマージした内容を戻すにはmain
でリバートをすればよいです
GitHubならPRからリバートを行うことができます
(厳密にはリバートコミット用のブランチが発行されます(参考))
main
をA+B
に戻したいとき
やっぱりリバートしたけど、その内容をまた戻したいときもありますよね
例えばコミットB
の内容を一時的にオフにしておいて再度オンにしたい場合です
この場合は、main
でリバートのリバートをすればよいです
GitHubならリバートのPRからリバートを行うことができます
main
をA
に戻したうえでB
とその修正C
も加えたいとき
NGな例
さて、ここでfeature
に戻り修正を加えたとします
この状態でmain
にマージしてしまうとA+B+(-B)+C
すなわちA+C
の内容になってしまいます
これは、main
にマージされるのはfeature
にはありmain
にはないコミットC
のみだからです
OKな例
まず、main
でリバートした状態をfeature
にマージします
(ブランチを新しく作れる場合はmain
からfeature_2
などを作成しても良いです)
feature
でリバートのリバートをします
これにより、feature
はA+B+(-B)+(-(-B))
すなわちA+B
の内容になっています
feature
で修正をします
main
にマージします
main
には(-(-B))
とC
がマージされるので目的通りになっています
参考
Discussion