ログイン

Git管理で複数branchでマージするとソースコードが紛失しまった

 2020.9.11 グローバルゴリラー李 ゴリラーブログ ブログ

グローバルゴリラー李です。よろしくお願いたします。


現在、devとbranch1で開発を行っていますが、ある日、branch1をdevにマージしたときに、部分ソースコードが勝手に削除されたことがありました。

もちろん履歴を見ても、手動で削除したわけではなかったので皆ビックリしました。


この問題の原因を分かるようにするため、Gitマージは一体なんの処理なのかを理解していきます。



Gitマージ

cmdでは、 git merge を実行する

これで、2パターンがあるのを初めて知りました。


1.fast-forward

・直接関連している場合は、fast-forwardマージが実行されます。

・新しいノートは生成されません。

・HEADが更新され、dev->C4 に指すことになります。


2.thirdparty merge

・ちょっと複雑で、新しいノート(C6)が生成されます。

・まず(複数関連しているノート)C3とC5が共通している親C1を探しにいきます。

・そしてC1(複数関連しているノートの共通親)、C3とC5(複数関連しているノート)の3つのノートに対してマージし、C6を生成します。

・HEADが更新され、dev->新しいノート(C6) に指すことになります。

・まとめてみると、C5とC1の差分をC3に適用してからC6を作り出すってことです。


結局、thirdparty merge が複雑だと言いつつ、3つのノートしか見ていません。

※見にいっている3つのノート以外のノートは関係なく、時間にも関係ないとのことでした。



検証



ノートは以下のように示します。

C9  (C5, C8, C7によるthirdparty merge) 紛失発生
C8 
C7 
C6 (C5, C3, C2によるthirdparty merge)問題
C5 (C8, C7の共通親ノート) 
C4
C3  (fast-forward  merge)
C2 (C5, C3の共通親ノート)
C1

時間軸で整理していきます。


C1  で a.testファイル作成します。

C2  …

C3  

C4…

C5  でa.testに対して function X変更

C6は (C5, C3, C2によるthirdparty merge)なので、C3とC2の差分をC5に適用してからC6が作られました。

そのため、C6の変更履歴はC3と比較したものになります。C3ではC5の変更はそもそもないので、C3の変更履歴しか見れません。

C6では、C5で変更する前のfunction Xになっているのではないか?と推測します。

C9は、C7とC5の差分をC8に適用してからC9が作られます。

C7とC5の差分はC7とC6と同じなので、C5の変更が漏れています。



ということなのでしょうか。

まだ引き続き検証していく必要がありますが、dev(主ブランチ)から branch 1(作業ブランチ)に逆マージすることが危険ですね。


TortoiseGitなど、thirdparty mergeによって親1、親2の履歴を全部表示できるツールも用いた方が無難ですね。


ありがとうございました。



© 2020 Mountain Gorilla Co., Ltd. 

プライバシーポリシー

%d人のブロガーが「いいね」をつけました。