2010-12-07 18 views
8

RepoXにBranchAとBranchBという2つのブランチがあるとしましょう。 RepoXにはSubmoduleYというサブモジュールもあります。Git:マージとサブモジュール

BranchAはリビジョン 'abc'でSubmoduleYを持ち、BranchBはリビジョン 'def'でSubmoduleYを持ちます。

BranchAをBranchBにマージしたいと思いますが、私はBranchBのSubmoduleYに元のリビジョンの「def」を指名しておきたいと思います。

方法1:

  1. チェックアウトBranchB私はこれを行うのカップルの方法を参照してください。
  2. SubmoduleYをリビジョン 'abc'に移動すると、実際のマージが無駄になりません(現在、サブモジュールレベルでマージしたくない)。
  3. SubmoduleYの新しいリビジョンをコミットします(マージではフローティングにすることはできません)。
  4. BranchAをBranchBにマージします。競合があれば解決する。
  5. SubmoduleYをリビジョン 'def'に戻します。
  6. SubmoduleYの新しいリビジョンをコミットします。
  7. メインリポジトリに変更をプッシュします。

方法2:ステップ6をやっ

方法1と同じですが、代わりに、リベースや余分なサブモジュールを取り除くステップ3からコミット

はどちらも迷惑な欠点を持っているようだ。

方法1は2つの余分なコミットを履歴に入れます。

方法2は、サブモジュールリビジョンとの変更を忘れてしまいます。サブモジュールリビジョンはコミットが削除されるためです。したがって、後でマージすると再びいくつかの問題に対処する必要があります。

良い方法がありますか?

答えて

7

メソッド1のバリエーションを実行できますが、マージコミットのサブモジュールの状態が変更されるように、--amendでサブモジュールバージョン(手順6)の変更を導入するコミットを実行します。言い換えれば、これは次のようになります。私は、あなたの質問に示唆されているように、合併前の異なるバージョンでサブモジュールを避けるためにしようと気にしませんでした

$ git checkout b 
$ git merge a 
Merge made by recursive. 
example.txt | 1 + 
sY   | 2 +- 
2 files changed, 2 insertions(+), 1 deletions(-) 
create mode 100644 example.txt 
$ cd sY 
$ git checkout def 
[... you get the "detached HEAD" warning ...] 
$ cd .. 
$ git add sY 
$ git commit --amend 

注意。競合が発生した場合は、サブモジュールをdefに追加して解決することができます。競合がなければ、上記の手順はうまくいくはずです。

+0

ニースのソリューション!ありがとう。 – Ben

関連する問題