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

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

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

こんにちわ、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するときに、

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

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

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

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

PR

※本サイトはアフィリエイトプログラムを利用して商品を紹介しています。