この内部プロジェクトは、内部 Git-repositoryA
にあり、外部 Git-repository の外部ライブラリのコードの大部分を追加して適応させる必要がありましたB
。B の全履歴は追加しませんでした。現在のすべてのコード ( と呼びましょうB3
) を 1 つのコミット ( と呼びましょう) に追加し、A5_B3'
明示的に を参照するコミット メッセージを追加しましたB3
。次に、追加のコミットで不要なものをすべて削除し、次のコミットで必要に応じてコードを調整しました。
A1 - A2 - A3 - A4 - A5_B3' - A6 - A7
/*
B1 - B2 - B3
"/*" = copy/cherry-pick/... (no 'real' reference/merge-point)
数か月後 (および への多くのコミットA
)、外部の Git-repository からの更新が必要ですB
。私はリモート B を追加しましたが、B は途中で履歴なしで追加されたため、もちろん共通の祖先は検出されませんでした。しかし、 を使用して 2 つの SHA を並べる記述graft
を見つけたので、コードB
が「等しい」(B3
とA5_B3'
) であるポイントを並べることができました。B
からへの変更をA
ローカル リポジトリにマージすることもできました( A18_B6'
):
A1 - A2 - A3 - A4 - A5_B3' - A6 - A7 - ... - A17 - A18_B6'
/* /
B1 - B2 - B3 - B4 - B5 - B6
しかし、このマージを自分のリモート リポジトリにプッシュできないことが判明しましたA
。(編集:私が得たエラーは でした[remote rejected] master -> master (n/a (unpacker error))
。)考えてみると、それはもっともらしいかもしれません。なぜなら、私のリモートリモートリポジトリは について知らないので、おそらく、およびB
を見つける/追加する方法/場所を知らないからです。B4
B5
B6
B
( B4
, B5
, )から変更を選択して、B6
に追加することもできA17
ます。しかし、そうすれば、からの明示的なマージはありませんがB
、もちろん、コミット メッセージを適応させることはできます。(私が始めたところから明示的なマージはありませんでしB3
た。それに戻ります。)
A1 - A2 - A3 - A4 - A5_B3' - A6 - A7 - ... - A17 - A18_B4' - A19_B5' - A20_B6'
/* /* /* /*
B1 - B2 - B3 - B4 - B5 - B6
私が今思いつくことができる唯一の「解決策」は、別の「A_B
-branch 」を追加することですA5
(明示的に を参照するブランチ名を使用)、そのブランチの(、、B
)からの変更をチェリーピックし、そのブランチをマージします時々入ります。B
B4
B5
B6
A
A1 - A2 - A3 - A4 - A5_B3' - A6 - A7 - ... - A17 - A18_B6'
/ /
AB3' - AB4' - AB5' - AB6'
/* /* /* /*
B1 - B2 - B3 - B4 - B5 - B6
その間、別の外部 Git-repository から別の外部ライブラリのコードの小さな部分も追加しましたC
。これはおそらくバグ修正を取得するため、問題が2倍になる可能性さえあります...
私の質問は次のとおりです。
- 最初からやり直すことができる場合、B (および C) (の一部) を追加するためのベスト プラクティスは何でしたか
A_B
現在の状況を考えると、チェリーピックを使用したこの「-branch」以外の/より良い解決策はありますか
(これが重複していたらすみません。似たようなものを探してみました。「完全な」共通の歴史を持つプロジェクト/フォークをマージすることについて多くの回答を見つけました。そして、単一のマージが必要な同様のプロジェクトについていくつかの回答を見つけました。しかし、私は推測します後でバグ修正を追加する必要があるかもしれませんが、検索する適切な Git 用語/キーワードが不足している可能性があります。)