Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

gitのマージ時に、各ブランチの内容をそれぞれ保持したい場合について

解決したいこと

Webアプリケーションの開発を行っており、新たに機能追加をすることになりました。
コード管理環境としては社内ローカルのgitlabを利用しています。
2つのチームがそれぞれ機能追加案A、Bとして1つのdevelopブランチから派生し、異なるブランチで開発を進めました。
クライアントに見せたところ、両方の機能を維持し、追加案ABを並列で存在させたいという要望が出ました。
そのため、AB案各ブランチをマージしようとしたのですが、意図したとおりにマージできません。

お助けください。

発生している問題・エラー

ex

  • hoge:ディレクトリ 今回機能追加した部分で、ディレクトリ内のファイル名は同一だが内容は著しく異なる。
  • huga:ディレクトリ 今回機能追加は行っていない部分。

現在

develop_modA

hoge
 L foo.js
 L vaa.html
 L baz.css
huga
 L hee.js
 L hoo.html
 L baz.css

develop_modB

hoge
 L foo.js
 L vaa.html
 L baz.css
huga
 L hee.js
 L hoo.html
 L baz.css

こうマージしたい

develop

hoge_A
 L foo.js (develop_modAのもの)
 L vaa.html  (develop_modAのもの)
 L baz.css (develop_modAのもの)
hoge_B
 L foo.js (develop_modBのもの)
 L vaa.html (develop_modBのもの)
 L baz.css (develop_modBのもの)
huga
 L hee.js (develop_modAのもの)
 L hoo.html (develop_modAのもの)

実施した操作

develop_modAブランチに対して

git mv hoge hoge_A

develop_modBブランチに対して

git mv hoge hoge_B

その後、gitlab上でマージリクエスト作成

こうなる

develop

hoge_A
 L foo.js (develop_modA+develop_modB)
 L vaa.html (develop_modA+develop_modB)
hoge_B
 L baz.css (develop_modA+develop_modB)
huga
 L hee.js (develop_modAのもの)
 L hoo.html (develop_modAのもの)

自分で試したこと

コンフリクトしたので確認したら「こうなる」のようにマージしようとされていた。

補足

  • 私が行った操作を記載しました
  • ディレクトリ構造などがわからないということでしたので補足しました
0

3Answer

こうかな。

# マージで衝突が発生した後の作業

# 一旦、自動マージ作業中に発生した衝突フラグを全部解除する
git reset .

# 作業コピーを手動で「こうマージしたい」内容に更新する
# ここは自分でファイルコピーや上書きをしてマージ後の内容を作ってください

# 「こうマージしたい」内容をステージング
git add .

# マージする
git merge --continue
1Like

Comments

  1. あとメタ構文変数は正しく使いましょう。
    意味のない名前であることを伝えるためのキーワードのはずなのに、そのスペルが違っていては意味不明の変数名を使った分かりづらい例になってしまいます。

    誤:huga
    正:fuga

    誤:vaa
    正:bar

  2. @notikaruga

    Questioner

    ありがとうございます
    何気なくつかっていたのですが、メタ構文変数というのですね、勉強になります。

git mv は、レポジトリ内のファイルを移動するわけですから、これだけではどうやってもレポジトリ内にはファイルは一つしかできないのではないですか。

いわゆる「レポジトリ内のコピー」をしなければならないわけですが、git copy なんてコマンドがありそうでないようで、以下のようにしなければならないようです。

上記を参考に、とりあえず「 hoge/vaa.html 」だけ作って下記のようにしてみました。

# まず、大元のdevelopでhoge_Aとhoge_Bに分ける。
git checkout -b develop_AB develop
git mv hoge hoge_A
git stash
git mv hoge hoge_B
git stash
git stash pop
git stash pop
git commit -a -m 'hoge to hoge_A and hoge_B'
# develop_modAのhogeをhoge_Aにする。
git checkout develop_modA
git mv hoge hoge_A
git commit -a -m 'hoge to hoge_A'
git merge develop_AB
# develop_modBのhogeをhoge_Bにする。
git checkout develop_modB
git mv hoge hoge_B
git commit -a -m 'hoge to hoge_B'
git merge develop_AB
# develop_ABに、develop_modAとdevelop_modBをマージ。
git checkout develop_AB
git merge develop_modA
git merge develop_modB

あとは、 develop_AB ブランチを develop ブランチにマージするだけかと。

まぁ望ましくはないけど、履歴をガン無視していいのであれば、どちらか一方のブランチをマージし、もう一方のブランチを新規に追加する、というやり方もあるかと思います。

1Like

Comments

  1. @notikaruga

    Questioner

    ありがとうございます
    この方法であれば履歴も残せるので、試してみたいと思います。

例に出てくる hoge, huga, hoge_A, hoge_Bなどはディレクトリですか?
だとしても、マージするとできるようなものではないので、質問の内容がよくわからない。

0Like

Your answer might help someone💌