2016-09-26 8 views
1

私はmasterからブランチxyzを1つ作成しました。私は約1000のコミットを行い、おそらくxyzブランチで20のファイルを修正しました。今私はxyzブランチで変更したすべてのファイルをリストしたいと思います。変更されたファイルを特定のブランチに一覧表示するにはどうすればよいですか?

以下のコマンドは、両方のブランチで修正されたファイルをリストします。

+0

: 'git diff --name-only master xyz' – LeGEC

+0

[git diff documentation](https://git-scm.com/docs/git-diff#_description)によると、 master ... xyz' ** diff **の構文( 'log'ではなく)はあなたが必要とするものだけを与えるはずです。それが間違った結果をもたらすと思われる場合は、最小限の例を提供できますか? – max630

答えて

3

ここでの根本的な問題はgit diffは、2つの特定のコミットを比較することです。 どのような引数を指定しても、はまだの2つの特定のコミットを選択して比較します。 これが何を意味するのか2

はそれがgit diffはあなたには、いくつかのブランチでやっていることを示すために取得することで、あなたはそのブランチ内の2つのコミットを選択する必要があります:「エンディングを呼び出すために、「出発点」と1を呼び出すための1ポイント"。これを行うことを選択した場合は、通常、コミット・グラフを描画するのに役立ちます。これを手動で行うか、git log --oneline --graphを使って手助けしてください。 (あなたの2つのブランチのこの2つのグラフをお互いに比較する良い方法は、git log --oneline --graph --decorate --boundary master...xyzです。)もう1つの方法は、グラフを自分で描画して、よりコンパクトに表現できるようにするか、gitkまたはグラフを描画します。

単一マージベースが、その後、masterにコミットし、先端がxyzにコミット先端の間でコミットがある場合:

git diff --name-only master...xyz 

は比較(および変更されたファイルの名前をリスト)されますが、その特定のマージベース、分岐XYZの先端コミットと対比。その後、

  o--o--o--o--...--o--Z <-- master 
     /
...--o--* 
     \ 
      F--G-...--X    <-- xyz 

*マージベースがコミットである3Xは先端がxyzにコミットされ、そしてgit diff master...xyz*をコミット比較する、Zは先端がmasterにコミットされ、:グラフのようなものが見える場合つまり、 vsコミットX (対照的に、git diff master..xyzは、3つではなく2つのドットを示します。ここでは、コミットをZとコミットを比較します.をコミットします。私はgucce added this as a comment as wellを参照)、各はそれをコミットで何が起こるかをお見せすることになるxyzである。git diff --name-only master...xyzはあなたがgit log --name-only master..xyz(おそらくも--onelineとしたい場合があり、何をしたいあなたに表示されていないことを考えると、言った)

masterにも含まれていません。つまり、上記のグラフを見ると、コミットFに対して*をコミットした後、Gに対してFをコミットしてから、Xと比較するまで続きます。これは、git logの組み込み機能を使用して、各コミットをその親に対して差分することに注意してください。


また、一つのインデックスにコミットと比較することができ、または1つのワークツリーに作業ツリー、またはインデックスにコミットします。別のモードでは、リポジトリに格納する必要のない2つの特定のファイルを比較することができますが、使用する方法とはさらに異なります。

これは、あまりにも、過言のビットです:コミットのgit diff以上1未満のペアを与えることによって、あなたはそれが組み合わせ差分を呼び出すものを生成するために取得することができます。これは、通常、マージコミットに使用され、マージされた内容がすべての親コミットと異なる点、つまり「1つのブランチにあったもの」以外のものを選択してマージの競合が解決された箇所を示します。しかし、これも、あなたが達成したいと思っているものと比べて、間違った方向に向かっています。

私は一瞬、先端のマスタため、Tとしてこれを持っていたが、その後TFX間アルファベット順であることに気づきました。 Xxyzのため、ここではXになるようにTZに変更しました。一般的な考え方は、masterという名前のチップのほうを除いて、ほとんどのコミットがmasterにのみ関心がないということです。

F -through- Xチェーンのコミットのいずれかがマージコミットである場合は、git logが、まったくあなたには、いくつかの追加オプションを追加しない限り、それをdiffをする気はありません。つまり、git logは、複合差分(-cまたは--cc)または分割マージ(-m)を求めない限り、git logはマージをスキップして差分をスキップします。これらの3つのオプションにも欠点があります。そのため、最善の方法は、まずはノーマージの状況で作業することです。

2

@torekで指摘されているように、git diffコマンドはドット表記を完全に無視します。

したがって、次のコマンドは、所望の結果につながるはず:最後に変更されたファイルで、このようなものをプリントアウト

git log --oneline --name-only develop..xyz | sort | uniq 

0871be6 commit 1 
9caad09 commit 2 
bb714f0 commit 3 
... 
path/to/file1 
path/to/file2 
path/to/file3 
path/to/file4 

お知らせがあるのみ2つドット。これは、xyzにあるが、developにはないすべてのリビジョンを考慮に入れることを意味します。

3つのドットを使用すると、2つのブランチの1つにのみ存在し、両方ではないすべてのリビジョンが使用されます。

参考:https://git-scm.com/book/tr/v2/Git-Tools-Revision-Selection#Commit-Ranges

+0

私もこれを試しました。それはxyzブランチで修正していないファイルもリストしています。 –

+0

これは他のすべての* Gitコマンド、特に 'git log'には正しいですが、(ab)は他の目的のために2つと3つのドット表記を使用する' git diff'では正しくありません。特に 'git diff X ... Y'は' git diff X(Y) 'を意味し、' git diff X ... Y'は 'git diff X Y'を意味します。 'git diff'は中間のコミットを見ません。 (マッチベースがない場合、または複数のマージベースが存在する場合は、3重ドット表記法は別の問題の影響を受けやすくなります。) – torek

+0

誤って最後に改行を追加したか、改行を変更した可能性があります。あなたの 'xyz'ブランチで特定のファイルに対して何が変更されたのかを確認するには' git log -p develop..xyz-path/to/file'を使います。これは 'path/to/file'とdiff(' -p'は 'patch ')を修正した' xyz'( 'develop'ではなく)からのすべてのコミットをリストします。変更していないと思われるファイルの1つでこれを試してください。 – gucce

関連する問題