こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
PHPエンジニアとして9年~の経験があります。
先日、gitを使ってソースをmergeしたときに事故が起こしました。
教訓:mergeするときは、せめて自分が使っているソースはよーく見てみよう。過信禁物
「競合が起こらない」mergeをする例
ソース
こちらが変更したソース
function {
$a = 1;
$b = 2;
$c = 3; // ←これを追加した
}
mainにあったソース
function {
$a = 1;
}
$bが削除されています。
コミット順
コミットされていた日付順番は、こんな感じの順番でした(見やすいように通常のログとは表示順を逆にしています)。
- 5/31 branchを作った
- 6/1 main $bが削除された
- 6/2 branchで$cを追加した
- 6/3 mainのソースをbranchにmergeした
mergeした結果
function {
$a = 1;
$b = 2;
$c = 3;
}
$bが元に戻ってしまいました。
特に競合も起こらなかったのでこれに気付かず、問題を起こしました…
mergeが予期したものにならなかった理由
本当だったら、こうなってほしかった。
function {
$a = 1;
$c = 3; // ←$bが削除されて$cがある状態
}
$bが削除されて追加した$cが残ってほしかった。
そうならなかった理由は、「mainでは$bが削除されたけれど、ブランチでは$bが追加され、$cも追加された」と判断されたためだと思います。たまたま、コミット順がそうなってるものね…
今後の対策
mergeするときに、
- ソースをチェックして、自分が現在進行形で修正しているソースに変更が入っていないか確認
- まさにブランチで修正中の箇所が修正されていたら警戒
- 変更がある場合、mergeして競合が起きなかったら見比べてみる
こうすると事故の発生を下げられるのではないかなと思います。
どこがどうmergeされたかの比較にはWinMergeを使おうかな。一昔前はよくWinMerge使って変更箇所を確認して、おかしいところがないか見てから一つずつソースをあげてたこともあったのに。
mergeすることが多くて競合しないからOK!と過信してしまっていたのが敗因です。反省…