14

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

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:

方法 1 と同じですが、ステップ 6 を実行する代わりに、リベースしてステップ 3 の余分なサブモジュール コミットを取り除きます。

どちらにも厄介な欠点があるようです。

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

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

より良い方法はありますか?

4

1 に答える 1

8

方法 1 のバリエーションを実行することもできますが、(ステップ 6 で) サブモジュールのバージョンに変更を導入するコミットを実行して--amend、マージ コミットでサブモジュールの状態を変更します。つまり、これは次のようになります。

$ 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競合がある場合は、サブモジュールを追加して解決することを選択できます。競合がない場合は、上記の手順で問題なく動作するはずです。

于 2010-12-08T16:55:04.083 に答える