私はmasterからブランチxyzを1つ作成しました。私は約1000のコミットを行い、おそらくxyzブランチで20のファイルを修正しました。今私はxyzブランチで変更したすべてのファイルをリストしたいと思います。変更されたファイルを特定のブランチに一覧表示するにはどうすればよいですか?
以下のコマンドは、両方のブランチで修正されたファイルをリストします。
私はmasterからブランチxyzを1つ作成しました。私は約1000のコミットを行い、おそらくxyzブランチで20のファイルを修正しました。今私はxyzブランチで変更したすべてのファイルをリストしたいと思います。変更されたファイルを特定のブランチに一覧表示するにはどうすればよいですか?
以下のコマンドは、両方のブランチで修正されたファイルをリストします。
ここでの根本的な問題は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
としてこれを持っていたが、その後T
がF
とX
間アルファベット順であることに気づきました。 X
はxyz
のため、ここではX
になるようにT
をZ
に変更しました。一般的な考え方は、master
という名前のチップのほうを除いて、ほとんどのコミットがmaster
にのみ関心がないということです。
F
-through- X
チェーンのコミットのいずれかがマージコミットである場合は、git log
が、まったくあなたには、いくつかの追加オプションを追加しない限り、それをdiffをする気はありません。つまり、git log
は、複合差分(-c
または--cc
)または分割マージ(-m
)を求めない限り、git log
はマージをスキップして差分をスキップします。これらの3つのオプションにも欠点があります。そのため、最善の方法は、まずはノーマージの状況で作業することです。
@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
私もこれを試しました。それはxyzブランチで修正していないファイルもリストしています。 –
これは他のすべての* 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
誤って最後に改行を追加したか、改行を変更した可能性があります。あなたの 'xyz'ブランチで特定のファイルに対して何が変更されたのかを確認するには' git log -p develop..xyz-path/to/file'を使います。これは 'path/to/file'とdiff(' -p'は 'patch ')を修正した' xyz'( 'develop'ではなく)からのすべてのコミットをリストします。変更していないと思われるファイルの1つでこれを試してください。 – gucce
: 'git diff --name-only master xyz' – LeGEC
[git diff documentation](https://git-scm.com/docs/git-diff#_description)によると、 master ... xyz' ** diff **の構文( 'log'ではなく)はあなたが必要とするものだけを与えるはずです。それが間違った結果をもたらすと思われる場合は、最小限の例を提供できますか? – max630