リバート後に修正してマージしたいとき【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