Help us understand the problem. What is going on with this article?

別リポジトリでコミットが進んでしまったリポジトリから、コミットログも取り込む

More than 3 years have passed since last update.

背景

開発の途中でマルチベンダになり、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つ前を指定してやる必要があります。

開発者としてはこういった状況は非常によろしくないのだけれど、
会社間の契約の関係上などで起こりえたりするので、自戒の意味も込めて手順として残しておきます。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away