質問
Gitを使用して保守されたプロジェクトを継承しました。ある時点で、コードは3つの別々のシステムにデプロイされ、各システムは独自の分散Gitリポジトリを維持していました。
3つのシステムのそれぞれは、元のベースシステムを3つの異なる方向に拡張しました。 3つのシステムのどれも互いに同期されていません。いくつかの変更はmasterブランチにあり、その他は新しいブランチにあります。
次のことができるように、3つの異なるソースをまとめるにはどうすればよいですか:
- 使用する共通ベースを見つける;
- 3つのシステムすべてに適用する必要があるバグ修正を見つけます。そして
- 3つのシステムを適切な方法で維持して、共通のブランチが1つだけになり、3つの異なるシステムに必要なカスタマイズを分離しますか?
解決
おそらく、すべてのリポジトリを中央リポジトリの個別のブランチにプッシュすることから始めます。そこからブランチ間のリベース、マージなどを簡単に行うことができます。
git-age 、 gitnub 、 gitx 、 giggle は驚異的に動作する可能性がありますが、タスクはおそらく、分岐点を見つけます。すべてのブランチに同様のパッチが適用されている場合、(インタラクティブ) rebase を使用して並べ替えることができます。同じ順序になるようにコミットします。その後、ブランチを「圧縮」し、コミットをマスターに配置してブランチポイントを上に移動します。 rebaseを使用してコミットを並べ替える方法に関する説明は、こちら。
チャンスは、必要なアクションです。 Git Howtoインデックス。優れたチートシートは、いつでも手元に置いておくと便利です。また、エリックシンクスの投稿" DVCSおよびDAG、パート1 のフォローアップも疑わしい"有用なものが含まれます(含まれていませんが、興味深い読み物でした)。
その他の役立つリンクは次のとおりです。 Git Magic 、 Git Ready および SourceMage Gitガイド
すべてのリポジトリに、各パッチの目的、それまたはコードレビューを示す良いコミットメッセージがあることを願っています:)
カスタマイズを維持する方法については、次のように幸運でした:
最初に、カスタマイズされたコードを汎用コードから分離(または分離)することから始めました。次に、2つのアプローチを試しました。両方ともうまくいきました:
- すべてのデプロイメントは、カスタマイズが保持される独自のリポジトリを取得しました。
- すべてのデプロイメントは、「カスタマイズ」リポジトリで独自のブランチを取得しました。
最初の展開の後、2番目の展開が事実であることを確認した後、カスタマイズされたレポジトリ(alt。ベース/コアリポジトリ。
そして、はい、コア/カスタマイズの分割がずれていることに気づいたときはいつでも容赦なくリファクタリングを試みます:)
他のヒント
OK。かなりの苦労の後、私はそれをなんとかすることができました。同様のタスクに着手する他の人にとって、それは多くのことを伴います:
git rebase
コマンドと物事が台無しになったとき:
git reflog
続いて
git reset --hard HEAD@{ref}