2016-02-01 4 views
5

シナリオ:完全に切断された履歴を持つリポジトリ。例えば。共通のgitの履歴を持たない別のリモートから。 (通常これはgitサブツリーのシナリオで発生します)git cherry-common historyのないコミット間でdiffを選ぶ?

共通の履歴がなくても、これらの2つのコミットの差分をチェリーピックすることはできますか?

git cherry-pick -X subtree=vendor/package aaa/aaa..bbb/bbb 

サブツリーがなければ、これは単純だったでしょう:

私は( -X subtree=sub/dirオプションとサブディレクトリに)これを試してみました

(およびActiveは、これら二つのいずれかとの共通の歴史を持っていないコミット)

git cherry-pick aaa/aaa..bbb/bbb 

ここで、aaa/aaaとbbb/bbbは、切断された履歴を持つ2つのコミットです。

残念ながら、これは機能しません。aaa/aaa..bbb/bbbはdiffとして読み込まれるのではなく、他のものとして読み込まれます。

git show aaa/aaa..bbb/bbbと同じことがありますが、git diff aaa/aaa bbb/bbbとはまったく異なります。例えば。両方が同じファイルを持っている場合、git diffは空ですが、git show a..bはbのみを表示しますが、aは表示しません。


注:私の個人的な使用例は、サブツリーの背景です。私は人工的な使用の場合を避けるためにこれを言及しています。ここで人々は通常、実際の質問の代わりにユースケースの妥当性を議論し始めます。

まず、一般的なケースに対処してから、サブツリーのケースに対処してください。

答えて

2

チェリーピッキングは差分を適用しているので、それはcreate a patch an apply itに単純に次のようになります。

git checkout aaa/aaa 
git cherry-pick -n bbb/bbb 
git diff --cached > my.patch 

その後、あなたの通常のブランチをチェックアウトし、git apply my.patch

これは「bbb/bbb」をコミットとり、その直接の祖先と比較しますその差を 'aaa/aaa'の上に適用すると、競合が発生する可能性があります。
-X subtree=vendor/packageがサブツリーの場合に役立つかどうかをテストします。

+0

gitが適用されます良いアイデアです!しかし、私はあなたの命令が約束されたことをするのかどうかはわかりません。私はチェリーピックを参照 – donquixote

+0

問題は、それが唯一の( - これがポイントです実際には存在しません)/ BBBをBBBするには、aaa/AAAから一流のコミットの全範囲、最後のコミットをしませ選ぶということです。 – donquixote

2

@ VonCは良い方向に指しています。このアイデアにはクレジットと+1があります。

パッチを作成し、AN、それを適用する方が簡単だろう:

しかし、これは(私はこれを試みたが、それは私のために動作します)シンプルなワンライナーで行うことができます。

git diff aaa/aaa bbb/bbb | git apply 

Gitチェックアウトのための必要はありません、GitのCHERR:

git diff aaa/aaa bbb/bbb | git apply --directory=vendor/package 

または非サブツリーシナリオで y-pickを実行するか、ローカルファイルを作成します。
それでも、このことをコミットする必要があります。明らかに..ここ

とは、追加および/または任意のサブツリーのリモコンをフェッチせずにそれを行う方法です。代わりに、別のディレクトリに外のメインプロジェクトレポをパッケージリポジトリのクローンを作成することができます。

git --git-dir="/path/to/package/repo/.git" diff aaa bbb | git apply --directory=vendor/package 

私はそれを理解する方法、これはすべて、まだ通常のgit subtree作業の流れにほとんど同じです。つまり、メインプロジェクトのgitの履歴は同じになります。私が間違っているなら私を訂正してください。

+0

確かに、gitのdiffが(私は差分とチェリーピックの間ためらっ)おそらくより簡単です。 +1 – VonC

関連する問題