🤧

リバート後に修正してマージしたいとき【Git】

2025/01/08に公開

リバートとリセットの違い

リセットはコミットを削除するのに対して、リバートはコミットを打ち消すコミットを追加します

リセット

リバート

ローカルブランチでの変更はリセットでも良いですが、リモートブランチの場合はリセットが推奨されなかったりブランチの保護があることがあります
そのためリバートを使うことが多いかと思いますが、リバートも元に戻したい場合があります

条件設定

次のようにfeatureでのコミットをmainにマージしている状態を考えます
GitHubならPRでマージしたような場合です

mainAに戻したいとき

ここで、mainにマージした内容を戻すにはmainでリバートをすればよいです
GitHubならPRからリバートを行うことができます
(厳密にはリバートコミット用のブランチが発行されます(参考))

やっぱりmainA+Bに戻したいとき

リバートしたけど、その内容をまた戻したいときもありますよね
例えばコミットBの内容を一時的にオフにしておいて再度オンにしたい場合です

この場合は、mainでリバートのリバートをすればよいです
GitHubならリバートのPRからリバートを行うことができます

mainAに戻したうえでBとその修正Cも加えたいとき

NGな例

さて、ここでfeatureに戻り修正を加えたとします

この状態でmainにマージしてしまうとA+B+(-B)+CすなわちA+Cの内容になってしまいます
これは、mainにマージされるのはfeatureにはありmainにはないコミットCのみだからです

OKな例

まず、mainでリバートした状態をfeatureにマージします
(ブランチを新しく作れる場合はmainからfeature_2などを作成しても良いです)

featureでリバートのリバートをします
これにより、featureA+B+(-B)+(-(-B))すなわちA+Bの内容になっています

featureで修正をします

mainにマージします
mainには(-(-B))Cがマージされるので目的通りになっています

参考

https://qiita.com/Esfahan/items/d70dabbebed851bc6978

Discussion