私はリポジトリBを持っていますが、その内容はA/src/Bのサブディレクトリに存在する必要があります。私はAとBの両方からのコミットの履歴を含む1つのリポジトリAにしたい。別のディレクトリレベルでgitリポジトリをマージする
ウェブ上の他のソリューションは、ツリーを独立したサブツリーにそのまま残すか、リポジトリの選択された部分をマージする方法を示しているようだ同じディレクトリ構造を有する。
だから、これを行う方法はありますか?
私はリポジトリBを持っていますが、その内容はA/src/Bのサブディレクトリに存在する必要があります。私はAとBの両方からのコミットの履歴を含む1つのリポジトリAにしたい。別のディレクトリレベルでgitリポジトリをマージする
ウェブ上の他のソリューションは、ツリーを独立したサブツリーにそのまま残すか、リポジトリの選択された部分をマージする方法を示しているようだ同じディレクトリ構造を有する。
だから、これを行う方法はありますか?
これはかなり簡単ですが、コマンドは必ずしも明らかではありません。後でBからの更なる更新を組み込む必要がある場合には、git-subtree(サブツリーのマージ戦略と混同しないでください)が役に立ちます。 1つのリポジトリで終わりたいと言っているので、gitサブモジュールを使うのは適切ではありません。
ここでこれを行うための古典的な方法は、いくつかの説明を、です:リポジトリAに
変更:
cd A
(リポジトリB
からmaster
支店(または何でも)を取得し、一時的に)FETCH_HEAD
として保存します。
git fetch /home/whoever/dev/B master
FETCH_HEAD
からの変更を無視するが、コミットしないマージを行います。これは後でマージを行うことができるように、マージの親にはFETCH_HEAD
が含まれます。 (その親が.git/MERGE_HEAD
に格納されます。)
git merge -s ours --no-commit FETCH_HEAD
サブディレクトリsrc/B
でのステージング領域にFETCH_HEAD
(B
のまだフェッチmaster
ブランチ)からツリーをお読みください。 -u
も同様の作業コピーにその結果を反映させる意味:これは除いて、GitHub's help page on the subtree merge strategyで提案されたものと同様である
git commit -m "Merge in the history of master from B into src/B"
:
git read-tree --prefix=src/B/ -u FETCH_HEAD
最後に結果をコミット私はB
のためのリモートを作成するのをスキップしました。この手順でもサブツリーのマージ戦略は実際には使用されていないことに注意してください。正しく理解すれば、それ以降の変更をB
から取り込むためだけです。
これは私にははるかに明確です。 「われわれのもの」が何を意味しているのか理解できなかった...そして、私はフェッチが間違ったディレクトリにファイルを置くと思った。 ...ありがとう。 – fodon