6

リポジトリのサブディレクトリとして追加したいサードパーティのリポジトリにブランチがあります。そのサードパーティのコードを変更し、それらの変更を自分のリポジトリで維持し、サードパーティのリポジトリに加えられた更新を引き続き取得できるようにしたいと考えています。本質的に、オーバーレイを作成しようとしています。

ここのサブツリーのマージに関するガイド(私が達成しようとしていることを正確に説明しています) に従って、そのサード パーティのリポジトリを指すリモートを作成し、必要なリモート ブランチを参照するローカル ブランチを作成し、プルを実行しましたread-tree を使用して、ローカル ブランチの内容を master のサブディレクトリにコピーしました。

このサブディレクトリの変更 (新しいファイルと既存のファイルへの編集) を master にコミットしてプッシュしました。アップストリーム ブランチのさまざまなファイルにも変更が加えられています。変更を自分のブランチに引き下げることができました。ただし、次のようにマージしようとすると、

git merge --squash -s subtree --no-commit <my_branch>

ローカルの変更が上流の変更によって上書きされます。作成した新しいファイルは削除され、既存のファイルに加えた変更は失われます。

私は何か間違ったことをしていますか、それとも期待される動作ですか? 変更を保持したまま、上流からの変更をマージするにはどうすればよいですか?

4

2 に答える 2

1

これが望ましい動作だとは思いませんが、同様の問題を自分で解決しました。

私の場合、問題は、他の開発者が最初にマスター ブランチにサブツリーを追加したときに、一度に複数のサブツリーを追加したことでした。これにより、結果のコミットの SHA が変更されました。

その結果、サブツリーのマージを試みたとき、git は共通の親を見つけることができませんでした。これは、私のローカル ツリー内のすべてが元のレポのコードよりも古いものであり、マージの完了時にローカルの変更が失われたと仮定した git の最終結果でした。

git log --onelineサブツリーのプレフィックスディレクトリで a を実行し、ローカルリポジトリへの最初のコミットを特定することで、これを回避しました。

それで、

git checkout -b <subtree>_merge <first commit SHA>
git merge --squash -s subtree --no-commit <subtree_remote/ref>
git checkout master
git merge <subtree>_merge

これにより、上部からのサブツリーのマージが成功した場合と同じ結果が得られるはずです。

于 2013-04-26T20:06:01.253 に答える
-1

原則として、クリーンな作業ツリーでこのような操作を実行する必要があります。コミットされていない変更を上書きする必要がある場合、Git は中止されます。

git stashこれらのコミットされていない変更を一時的に保存して、マージを実行し、git stash popそれらを再度適用してスタッシュを削除するために使用できます。

于 2013-04-03T06:04:46.760 に答える