4

状況: 最新のコミットと選択的にマージする必要がある古いコミットがあります。一部のファイルには変更がなく、他のファイルには重要な変更があり、それらを確認して選択的にマージする必要があります。

1古いコミットにファイルA、、、BがあったとしましょうC

最新のコミット5には、ファイルの変更が含まBれておりC、コミット以降、ファイル1も追加されました。DEF

したがって、コミット15ファイルの間BC変更されました。つまり、で実行diffされ1:Bてい5:Bます。そして上1:C5:C違いを示します。

ファイル名だけBを取得する必要があります。C

つまり、属していない1が変更または追加されたすべてのファイルは表示され5ませ

4

4 に答える 4

2

あなたは試すかもしれません

git diff --diff-filter=M 1 5

使用可能なフィルターは次のとおりです。

  • A: 追加した
  • C: コピーしました
  • D: 削除しました
  • M: 修正済み
  • R: 改名
  • T: タイプが変更されました (シンボリックリンク、通常のファイルなど)
  • U: マージされていません
  • X: わからない
  • B: ペアリングが壊れています

git-diff(1)すべての詳細については、マニュアル ページを参照してください。

編集

2 つのコミット間で何がどのように変更されたかに関心がある場合は、変更されたファイルごとに上記のコードのいずれかを出力するオプションを使用することできます--name-status。このオプションはgit-log、各コミットのどのファイルにどのような種類の変更が行われたかを伝えるためにも使用できます。

于 2013-02-21T12:10:19.927 に答える
1

commitに存在するファイルのみを考慮するには、次を1実行します。

$ git ls-tree --name-only commit1 | xargs git diff commit1 commit5 --

これには、コミット1には存在したが、コミット5では削除されたファイルが含まれることに注意してください(差分では削除されたファイルとして表示されます)。それを避けたい場合は、ファイルの一般的なサブセットを見つけてください。

$ git ls-tree --name-only commit1 > all-files-in-commit1
$ git ls-tree --name-only commit5 > all-files-in-commit5
$ comm -1 -2  all-files-in-commit1 all-files-in-commit5 > common-files
$ xargs git diff commit1 commit5 -- < common-files
于 2013-02-23T18:45:55.853 に答える
0

試してください(SHA1を使用5して、例のように):

git diff 1 5 $(git diff --raw --no-commit-id --name-only -r 1~1 1)

または、より快適に、すべての SHA を 1 回だけ入力する必要があります。

c1="1"; c2="5"
git diff $c1 $c2 $(git diff --raw --no-commit-id --name-only -r $c1~1 $c1)

仕組み: 最初の git diff は 2 つのコミットを比較します。2 つ目は、比較を制限するパスのリストを生成します。$c1このリストは、古いコミットとその親の間で変更されたファイルを比較することによって生成されます$c1~1c1="HEAD~10"(これは、を使用して最後の 10 番目のコミットのようなものを指定する場合にも機能HEAD~10~1HEAD~11ます。

サブシェルはgit diff --raw、マージ コミットにも使用されます。git diff-tree --no-commit-id --name-only -r $c1それ以外の場合は、コミットをその親と自動的に比較する を使用できます。

TODO:まだ完全には機能していません。動作することもあれば、「致命的: あいまいな引数 '<ファイル名>': 不明なリビジョンまたはパスが作業ツリーにありません」というメッセージが表示されることもあります。

于 2014-03-02T01:25:44.453 に答える