背景
開発の途中でマルチベンダになり、zipファイルで納品していたソースコード(最新より数ヶ月古い)で他社が開発をはじめてしまった。
弊社でも機能追加やバグ修正を行っていたため、こちらのリポジトリも進行してしまっている。
他社は修正したものをzipファイルで一括して修正差分として提出すると言っている。
手動マージは地獄なのでそれを回避したい。
前提
- 中央リポジトリは弊社にある。
- 他社は納品されたzipファイルを自社のGitに取り込んでいる(弊社のコミットログはない)
- 他社のGitのリポジトリは参照できる状態になっているものとする。
やりたいことは基本的に Git で複数のリポジトリをまとめたり、逆に切り出したりする と同じ
他社の変更分を取り込む
作業用のディレクトリ作成
% mkdir -p merge/{AAA,BBB}
% cd merge/BBB
% git clone BBB.git
% cd ../AAA
% git clone AAA.git
% cd AAA
% git checkout -b merge/AAA origin/master
※ AAAが弊社、BBBが他社
他社リポジトリを追加してfetch、merge
% git remote add tmp ../../BBB/BBB # (他社リポジトリの.gitディレクトリのあるディレクトリ)
% git fetch tmp
ブランチの確認
% git branch -a (git)-[merge/AAA]
master
* merge/AAA
remotes/origin/HEAD -> origin/master
:
:
remotes/tmp/master
remotes/tmp/master のブランチ等が増えているはず
マージ
% git merge tmp/master
おそらくコンフリクトが発生するので、merge-conflictsなどでちゃちゃっと解消していく。
最後にこれを中央リポジトリへプッシュして、PRを投げれば一旦は終わり。
その後は中央リポジトリを用意でき次第、そちらを各社が参照するようにすれば良いはず。
両社で同一のリポジトリを参照するまでの変更取り込み
さっさと同一のリポジトリで開発をしたいものの、会社間の面倒な関係上その後の更新も取り込んでいく
$ git fetch tmp
$ git cherry-pick [commit id]
単純にcherry-pickをすると、このようなエラーが出てcherry-pickが失敗する場合があります。
% git cherry-pick [commit id] (git)-[merge/AAA]
error: Commit [commit id] is a merge but no -m option was given.
fatal: cherry-pick failed
その場合には、
% git cherry-pick -m 1 [commit id]
としてmerge commitを取り込んであげましょう。
また、PullRequestなどの取り込みのある場合
nothing to commit, working directory clean
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:
git commit --allow-empty
などのメッセージがされるので、メッセージ通りに
% git commit --allow-empty
してあげれば、他社の変更分を取り込めるはずです。
複数のcommitをまとめてcherry-pickしてやるには
% git cherry-pick [始点となるcommit]..[終点となるcommit]
この場合、始点となるcommitは、実際の取り込みたいcommitの1つ前を指定してやる必要があります。
開発者としてはこういった状況は非常によろしくないのだけれど、
会社間の契約の関係上などで起こりえたりするので、自戒の意味も込めて手順として残しておきます。