その他技術系
投稿日 : 2021年6月13日

gitのmergeで事故が起こった話

gitのmergeで事故が起こった話の画像

こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
私はPHPエンジニアとして8年~の経験があります。WordPressは2年半~の経験があります。その他、jQuery、HTML、CSSも使用します。
ここでは主に過去に納品した案件や自サイト運営(エンジニア婦人ノート)で遭遇したことについて書いています。

先日、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するときに、

  1. ソースをチェックして、自分が現在進行形で修正しているソースに変更が入っていないか確認
  2. まさにブランチで修正中の箇所が修正されていたら警戒
  3. 変更がある場合、mergeして競合が起きなかったら見比べてみる

こうすると事故の発生を下げられるのではないかなと思います。

どこがどうmergeされたかの比較にはWinMergeを使おうかな。一昔前はよくWinMerge使って変更箇所を確認して、おかしいところがないか見てから一つずつソースをあげてたこともあったのに。

mergeすることが多くて競合しないからOK!と過信してしまっていたのが敗因です。反省…