2013-04-03 14 views
5

私のレポのサブディレクトリとして追加したい第三者レポの支店があります。そのサードパーティのコードを変更し、その変更をリポジトリに保持し、サードパーティのリポジトリに加えられた更新を入手できるようにしたいと考えています。本質的に、私はオーバーレイを作成しようとしています。Gitサブツリーはマージされますが、ローカル変更は維持されますか?

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

私はこのサブディレクトリの変更(新しいファイルと既存のファイルの編集)をマスターにコミットし、プッシュしました。上流ブランチのさまざまなファイルも変更されています。私は変更を私の支店に引き渡すことができました。ただし、次のようにマージしようとすると、ローカルの変更はアップストリームの変更によって上書きされます。私が作成した新しいファイルは削除され、既存のファイルに行った変更は失われます。

私は何か間違っているのですか、それとも期待された動作ですか?変更を保存しても、アップストリームの変更をどのようにマージできますか?

+0

私は全く同じ問題を抱えていますが、解決策を見つけましたか? – gregseth

+0

@gregseth申し訳ありませんが、いいえ。幸いにも私はそれを解決する必要はありませんでした。私はいつかもう一度それを実行し、ここで答えをより良く振るべきです。あなたのために働く解決策を見つけたら教えてください! – Naenyn

答えて

-1

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

git stashを使用すると、変更されていない変更が一時的に保存されるので、マージを行うことができ、git stash popを再度適用して隠しを削除することができます。

+0

ローカルの変更がコミットされ、プッシュされました。私は隠すことは何もない。更新はこれらの変更を上書きしています。基本的には、ローカルに関係なくすべてを上流に置き換えます。 私は別の表現を使うべきだと思います。そこでは「ローカル」とは、私が起源/マスターを上流とは対照的に意味します。 – Naenyn

+0

あなたは '-s ours'をやっています 。それは、それが歴史の片側だけを選ぶことを意味します。それ以外に何を期待しますか? – Ikke

+0

Woops、私の間違い、私は間違った情報を貼り付けた。実際に '-s subtree'を実行しています。それに応じて質問を編集します。ちなみに、 '-s ours'はアップストリームの変更を完全に無視していました。これは私が経験しているものの逆です。 – Naenyn

1

私はこれが望ましい動作であるとは思わないが、私はちょうど同様の問題を自分で解決した。

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

その結果、サブツリーのマージを試みたとき、gitは共通の親を見つけることができませんでした。これは、ローカルツリーのすべてが元のリポジトリからコードを先行させることを前提としていて、マージが完了するとローカルの変更が失われたと仮定してgitの最終結果を得ました。

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

その後、

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 

これは、あなたが上から成功したサブツリーマージから見ることを期待するのと同じ結果を残す必要があります。

+0

分かりやすくするために、 ' _merge'は新しいブランチの名前なので、名前は何でも構いません。 ''は最初にリポジトリにサブツリーの内容を追加したときの最初のコミットで、 'git log --oneline'が覚えておくのに役立つSHAをコミットします。それでも、私が心配しているのは、この手順では、マスターリポジトリとサブツリーリポジトリがリンクされていないということです。最終的には、新しく作成された "マージされた"ブランチとリンクします。これは、 '<最初のコミットSHA>の古いリポジトリとローカルの変更なしでリモートと同期されたサブツリーサブディレクトリの奇妙な組み合わせです。 – KrisWebDev

関連する問題