9

git で同じコミットの 2 つのリビジョンの違いを表示しようとしています。基本的に、差分の差分。私がこれまでに読んだことから、これは「interdiff」として知られています。git パッチの相互差分を作成する方法に関するいくつかのチュートリアルを読みましたが、特定のケースでこれらの方法を機能させることができませんでした。

それではセットアップです。2 つの分岐ブランチがあり、それぞれコミットがわずかに異なります。

* 29e734f - (origin/feature_branch, new_commits) New commit 3 (69 minutes ago) <Ajedi32>
* b22ebea - New commit 2 (89 minutes ago) <Ajedi32>
* 09d42c2 - New commit 1 (2 hours ago) <Ajedi32>
| * 467e08f - (old_commits) Old commit 3 (4 weeks ago) <Ajedi32>
| * f2bf1cb - Old commit 2 (4 weeks ago) <Ajedi32>
| * 34a2187 - Old commit 1 (4 weeks ago) <Ajedi32>
|/  
*   1b05a4a - (origin/base, base) Base commit (5 weeks ago) <Ajedi32>

この例では、「古いコミット 3」と「新しいコミット 3」の間の相互差分を見つけたいと考えています。interdiffこれら 2 つのコミットからパッチ ファイルを作成し、ユーティリティを使用して実行しようとしましたが、得られたのは次のとおりです。

1 out of 2 hunks FAILED -- saving rejects to file /tmp/interdiff-1.Kgwx8u.rej
interdiff: Error applying patch1 to reconstructed file

それが何を意味するのかよくわからないので、ちょっと立ち往生しています。ここからどこへ行けばいいですか?

注:私はここで探しているわけgit diff old_commits new_commitsではありません。コミット 1 と 2 のリビジョンを出力に含めたくありません。

4

5 に答える 5

5

おそらく次のようなものです:

git log -p -1 new_commits > patch.new
git log -p -1 old_commits > patch.old
diff patch.old patch.new

または簡潔なワンライナーの場合 ( bash):

diff <(git log -p -1 old_commits) <(git log -p -1 new_commits)
于 2013-07-22T17:41:08.380 に答える
1

2 つのコミットに違いがほとんどない場合は、削除された行と追加された行 (つまり、+ または - で始まる行のみ) を比較すると効果的です。@@ で始まるハンク境界または重要ではないコミットメッセージ本文によって導入されたノイズを取り除きます。

diff -u --ignore-matching-lines '^[^+-]' \
    <(git show 1d9e4ac) <(git show 7b8e5c9)

サンプルアウトアウトは次のとおりです。

--- /dev/fd/63  2015-02-13 13:27:08.612683558 +0100
+++ /dev/fd/62  2015-02-13 13:27:08.616683527 +0100
@@ -62,13 +57,24 @@
  }

 diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h
-index 0113662..282cbeb 100644
+index 3b2e6e6..0a633a5 100644
 --- a/src/crush/CrushWrapper.h
 +++ b/src/crush/CrushWrapper.h
-@@ -874,6 +874,25 @@ public:
-     return false;
+@@ -863,6 +863,36 @@ public:
+     if (!crush) return -1;
+     return crush_find_rule(crush, ruleset, type, size);
    }
- 
++
++  bool ruleset_exists(int const ruleset) const {
++    for (size_t i = 0; i < crush->max_rules; ++i) {
++     if (crush->rules[i]->mask.ruleset == ruleset) {
++       return true;
++     }
++    }
++
++    return false;
++  }
++
 +  /**
 +   * Return the lowest numbered ruleset of type `type`
 +   *
于 2015-02-13T12:40:40.447 に答える
0

多分これはあなたが望むもののようなものをあなたに与えるでしょう。ただし、コミット 1-2-3 が大きく依存している場合は失敗します。

$ git checkout 'old commit 2'
$ git cherry-pick -n 'new commit 3'
$ git diff 'old commit 3'

$ git checkout 'new commit 2'
$ git cherry-pick -n 'old commit 3'
$ git diff 'new commit 3'
于 2013-07-22T16:45:45.770 に答える