gitで一旦取り消しRevertをしたら、RevertのRevertをすべし
投稿日:
いろんなプロジェクトを渡り鳥していると、「間違ってmaster/developにマージしちゃいました」案件がちょいちょいあります。
その場合、基本的にはmaster/developでgitのRevertをして対応してました。
でも、その後RevertのRevertをするのが漏れてしまうパターンがよくあります。
RevertのRevertが必要だと分かっていて漏れてしまうのは仕方ないのですが、
以前手伝っていたプロジェクトで「え?なんで必要なの?」っていう人がいたのを思い出したので記事にしてみました。
まずこんなソースがmasterブランチにあったとします。
ここで$hoge
だけでなく$fooo
という値も返せるようにしたくなったとします。
ブランチ「feature/fooo」を切って修正し、masterにマージします。
ここで、$fooo
を返すメソッドを作ってなかったことに気づき、masterでrevertします。
「feature/fooo」にメソッドを追加し、masterにマージします。
クラス変数やコンストラクタの処理が残っているように見えます。
※なお、ここでコンフリクトは起きていません。
できあがったソースがこちらです。
最後に追加したメソッドのみが追加されており、クラス変数やコンストラクタの処理は入っていません。
これだと想定した挙動になりませんね。
勘違いされる要素として、Revertは「対象コミットを取り消す」処理だと思っている人がたまにいます。
Revertはコミットを取り消すのではなく「対象コミットを打ち消すような修正コミットを新たに発行する」処理です。
Revert対象のコミットが無かったことになっている訳ではありません。
なので、Revertコミットはそれを更にRevertしないと、Revertコミットの修正が残ってしまいます。
手順をまとめると以下のようになります。
ダメなパターン
- 作業ブランチからmasterにマージする。
- masterでリバートする。
- 作業ブランチで修正を続ける。
- 作業ブランチからmasterにマージする。
良いなパターン
- 作業ブランチからmasterにマージする。
- masterでリバートする。
- 作業ブランチにmasterをマージする。(ダメなパターンで漏れてる)
- 作業ブランチでRevertをRevertする。(ダメなパターンで漏れてる)
- 作業ブランチで修正を続ける。
- 作業ブランチからmasterにマージする。
という訳でRevertした修正を捨てる訳でなければRevertのRevertをしましょう。