12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-14

背景

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

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

12
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?