2012-05-06 1 views
1

いいえ、A &の2つのプロジェクトがあります。私が 'B'で作業しているプロジェクトは、 'A'の下流です。つまり、Bは異なる機能を追加し、Aとは異なる方向に成長しました。しかし、共通の歴史を共有しています。git diffパッチを作成してから有効なワークフローを適用する前に手動で編集していますか?

少し前にBはAのメジャーリリースごとに定期的に更新されていましたが、これはもはやケースではありません。

Bでのメモリリークを追跡すると、Aで1年以上前に修正されたことがわかりました&その後、パフォーマンスを向上させるためにAに行った変更が非常に多くなりました。

それはすべてのこれらの変更は、プロジェクトB.

に統合されるべきであると決定されましたがこれは私が今やっているものです。明らかに、タスクを管理不能にするかなりの困難があります。しかし、それらのどれも本当に私の質問には関係しません。

私は&が、私は、各コンポーネントの新しいブランチを作成したA.

には存在しなかったBの機能を中断せずに含めることができるかを決める変わっていたものを見るためにコンポーネントによって差分のコンポーネントを作成するのを開始(より管理しやすくするために、特定のコンポーネントの外でコードが変更されたことを確認したものを特定するために)元々はマージを行うと思っていましたが、&の前にマージを使うことを覚えているようです。どんな理由であれ、AからBへのコンポーネントをマージしようとしたときに、Bに固有のコードのほとんどが失われました。

私は気付いていない可能性のあるテクニックに時間を費やすことを躊躇していました。差分から作成したパッチを編集するだけです。

次に、編集したパッチを適用します。

パッチの両サイドが横並びに見えるため、コードを削除したくない部分( - )を削除して、ケースバイケースで競合を心配することができます。

誰でもこれを試しましたか?あるいは、誰かがこの種の問題を扱うより主流技術を知っていますか?

もう1つの問題は、gitシステムによって壊れていないのに、どのようにパッチを変更できますか?

答えて

1

代わりに編集gitのパッチの、私は面白いコミットをチェリーピックをお勧めします、と作業ディレクトリに適用される差分を修正する:

git cherry-pick --no-commit upstream/commit1 
(edit changes in working directory) 
git commit 

あなたが潜在的に興味深いコミットをたくさん持っている場合は、インタラクティブ試すことができますリベース。例えば、それだけでは唯一のサブシステムに影響を与えるコミットを選択してください - あなたは&簡単にコミットをたくさん桜選ぶ確認することができます

git checkout upstream/master -b upstream-new 
git rebase -i master 

この方法です。 git log --oneline subsystem1/ >/tmp/subsystem1_commits.txtを実行して選択プロセスを手助けすることができます。git rebase -iで受け入れられているのと同様の構文を持つファイルが作成されます。

ワークフローについて:私は問題解決のための簡単なソリューションはないと思います。上流のリポジトリとブランチが長時間分岐する場合、gitの主な利点は失われます:簡単な分岐とマージする。あなたが残すのは、ほとんど手作りのパッチシステムです。これは常に痛みです。しかし、あなたは年に一度か二度、上流レポを更新することができれば、それは次のことをやって価値がある可能性があります

  • スタートバージョンアップストリーム/マスターから、それにあなたのコミットを適用する(=>あなたのマスター-1ブランチ)
  • 必要に応じてupstream/masterからチェリーピックを選択してください
  • アップストリームブランチにアップデートする時間がある場合、master-1ブランチをアップストリーム/マスターにリベースします。ただし、チェリーピックアップのホットフィックスはまだありませんgit rebase -i)。このブランチをmaster-2としましょう。あなたは以下の歴史を持っています

この方法:詳細な回答のため

A-A-A-A-A- (upstream/master at the beginning) 
      \ 
      -B-B-A-B (your master-1 branch, with a cherry-pick) 
      \ 
      -A-A-A-A-A-A-A-A -B-B-B (your master-2 branch, after the rebase) 
+0

感謝。私はこの痛みを受け入れなければなりませんでした。しかし、これは継続的なメンテナンスのためのより積極的なワークフローです。 (これまでの私の時間は、Pro Gitの最後の数章を読んでいることです。) – justify

関連する問題