40

foo競合が発生した状態で、ブランチのベースを変更したmasterとします。foo追加の変更を導入したり、変更を失ったりして(競合解決に適切なものを除く)、競合解決中に誤ってコンテンツを損傷しないようにしたいと思います。私はこれを次の方法で行いました:

diff -u <(git diff `git merge-base master foo@{1}` foo@{1}) \
        <(git diff `git merge-base master foo    ` foo    )

(更新:または私が今思い出した同等の...構文:)git-diff

diff -u <(git diff master...foo@{1}) <(git diff master...foo) | mate

master..fooこれは、パッチと見なされるために発生したすべての変更を示しています。これは、最小限であることを確認したいものです。ただし、呼び出しは複雑であり、出力の解釈は完全に簡単ではありません。

このタスクを実行するためのより良い方法はありますか—同じ情報を提供しますが、より良い方法または形式を使用します—または、上記を取得してスクリプトにまとめる必要がありますか?

4

6 に答える 6

3

git-cherry別のブランチにはない、あるブランチのコミットを検索します。次のように使用します。

git cherry -v OLDTIP TIP UPSTREAM

OLDTIPつまり、オンになっていてオンになっていないコミットを探しますUPSTREAM..TIP。パッチ署名を調べて、パッチが含まれているかどうかを確認します。そのため、リベース中にパッチが追加、削除、または変更された場合、リストに表示されます。そのまま適用されたものは表示されません。

OLDTIPに戻ってを実行git rebase -i TIPすることで、同じロジックを使用してコミットのリストを作成することで、同様の効果を得ることができます。

于 2012-09-26T16:10:51.780 に答える
2

マスターとリベースされたfooの違い:

git diff master..foo

対。

マスターから分岐した後のリベース前のfooの違い(3つのドットに注意):

git diff master...foo@{1}

于 2012-09-20T13:16:59.570 に答える
2

fooこれはリベースであり、マージではないため、マージ前にそれ自体と比較することをお勧めします。私が正しく思い出せばfoo@{1}、現在のコミットの親が生成されfooますが、これはあなたが探しているものではないかもしれません。

私はあなたが次のようなことをすることができると思います(あなたがしていないと仮定してgit gc):

fooリベース後のブランチ:

$ git reflog

これにより、ブランチのHEADがどのように移動したかがわかります。次のようなレコードが表示されるはずです(インタラクティブにリベースするかどうかによって異なります)。

64d3c9e HEAD@{15}: rebase -i (finish): returning to refs/heads/master
64d3c9e HEAD@{16}: rebase -i (fixup): Fixes external dependencies
049169e HEAD@{17}: rebase -i (fixup): updating HEAD
d4c2e69 HEAD@{18}: rebase -i (pick): Fixes external dependencies
049169e HEAD@{19}: rebase -i (fixup): Imports futures
e490bed HEAD@{20}: rebase -i (fixup): updating HEAD
...
etc
...

fooマージ前の最後のコミットを楽しみにしています。何をしたかによって、これは難しい場合とそうでない場合があります。そのため、do-itスクリプトを提供していません。

リベース前に最後のコミットがあったコミットIDをfoo取得し、そのコミットIDと比較します。コミットIDが次のようになっているとしますXXXX::

 git diff XXXX...foo

多分それはあなたが望むものです。

于 2012-09-24T20:33:45.893 に答える
1

少し異なるアプローチ:Gitは、マージの場合にこれを表示するための優れたサポートを提供します。つまり、「parent-2では説明できないparent-1と比較して何が変わったのですか?」

リベースのサポートを活用する方法はいくつかあります。

オプション1:

  1. (リベースではなく)最初に使い捨てマージを実行します。次に、通常のマージ表示に、マージの変更内容が表示されます。これがあなたが望んでいたものであることを確認してください。

  2. 戻ってリベースし、リベースされたヒントをマージ結果と比較します。これらは同一である必要があります。

オプション2(リベースがマージよりも簡単な場合):

  1. リベースを行います。
  2. グラフトを使用して、ローカル/一時的にマージのように見せます。

これを行うには、1行で.git / info/graftsを作成します。

TIP UPSTREAM OLDTIP

ここで、TIPはリベースされたブランチのコミットIDであり、他は2つの目的の親です(つまり、マージを行っていた場合にマージしたはずの2つのもの)。次に、それが実際のマージであるかのように調べます。

自動化についてはよくわかりません。(右クリックメニューを使用して)適切なリビジョンを簡単に比較できるため、私はgitkを開いた状態でこのようなことを行う傾向があります。

本当に2つのdiffを比較したい場合は、interdiff(1)を確認することをお勧めしますが、異なるベースファイルにどれだけうまく対処できるかはわかりません。

于 2012-09-26T12:45:04.653 に答える