概要
問題を掘り下げるほど、問題の概要がわかりやすくなります。gitインフラストラクチャを使用して、実際にはアプリケーションドメイン内のツリーであるDAGの頂点の親を取得するにはどうすればよいですか。
よく読んでください。どんなアイデアでも大歓迎です(git固有)。
質問
半自動コマンドを使用して作成したスクリプトによって履歴が作成されたリポジトリがあります。
そのため、コマンドの実行時に、必要に応じて、たとえば黄色で色付けされたタグなど、あらゆる種類の情報を履歴に自動的に入れることができます。
このすべての重要な要件は、マージの競合が発生したときに発生することです(スクリプトの目的は、ユーザーにマージの競合を認識させ、他のユーザーと連絡を取り、解決策を見つけることです。問題-マージの競合が発生した場合に問題が発生します。スクリプトでユーザー間のコミュニケーションを促進したいと思います)。
それを念頭に置いて、マージコミットを元に戻したいとしましょう。install-def
これは、この画像のように、競合していないマージに最適です。私はgit revert -m 1 install-def
(例えば)使用する必要があります。
install-abc
これらのコミット(マージコミット)を正確に元に戻したいので、元に戻す必要がある場合、手順はより複雑になります。これは、install-abc
からの「灰色の」子ですremotes/hacklet/abc/master
。
profile/myfirstprofile
つまり、とのみの線形履歴を取得しremotes/hacklet/def/master
ます。
ほぼすべてのコミットに任意のタグで注釈を付けることができると仮定して、半自動化されたスクリプトでこれを実現するための最も簡単で安全な方法は何ですか?スクリプトはbashで記述されているため、 DAG (または、さらに言えば、再帰)に関連することを何もする必要がないことが望ましいです。
「元に戻す」は「アンインストール」を行います。git revert -m 1 ...
の状況でコミットを元に戻すために機能しますinstall-def
が、次のようにinstall-abc
なります。
error: could not revert 18cff49... using hacklet/abc/master in profile
myfirstprofile hint: after resolving the conflicts, mark the corrected
paths hint: with 'git add <paths>' or 'git rm <paths>' hint: and
commit the result with 'git commit'
注:profile
ブランチにはそのようなinstall-
コミットを多数含めることができます。そのうちの1つだけを削除したいと思います。「インストール」も「プロファイル」もネストできません。
注:「モジュール」と「サブツリー」について知っています。わざわざ言及しないでください。ここで行っているのはアプリケーションドメインに固有のものであり(gitはアプリケーションの一部です)、これは開発サイクルでgitを使用することではありません。これらの2つの機能を徹底的に分析しましたが、スクリプトのアプリケーションドメインに適合していません。
補遺1
私はこの情報を含めるためにハッキングしました。これにより、私は簡単に考えることができます。
これが過度に複雑になっていると思われる場合は、そうではありません。基本的に同じパターンが何度も繰り返されます。
ここでは、のみstart-profile
、install-abc
およびinstall-foo
競合は発生していません。しかし、木の構造は「同じ」ように見えます。
そして最後の1つは、すべての競合(最初の、を除くinstall-abc
)があります。これは、gitkのカラフルな出力が好きだからです。
さらにもう1つですが、競合はまったくありません。
注profile/myfirstprofile
:ブランチでタグ付けされていない個々のコミットが存在する場合があります。そのような場合、それらのコミットは保持されるべきです。本当に他に何も「アンインストール」されるべきではありませんが、に属するものはコミットしinstall-THING
ます。
補遺2
before-install-
対応するものはで見つけることができると私は理解しましたがgit describe --tags $(git rev-list -1 install-abc)
。でも:
タグが与えられた場合、子のコミットinstall-def
を見つける方法-最後の画像ではこれは?before-install-ghi
最後のメモ(中間のタグなしコミット)を考慮すると、これらの「子と親」のコミットを見つけるには、install-THING
「アンインストール」したいものがなくても、一緒に貼り付けるのが適切ですか?
PS:有向非巡回グラフで指示された単語が何を意味するのかは本当に理解していますが、gitインフラストラクチャと概念を使用して、gitに固有の方法があるはずです。
注:何かを「アンインストール」するたびにツリーを繰り返す必要はありません。