gitブランチで変更されたすべてのファイルを取得する


208

ブランチで変更されたファイルを確認する方法はありますか?



2
彼らは私の従業員ではなく、私の同僚であり、一般の人々ほど、特に彼らではありません。しかし、そうです、この投稿をもう一度読んでみると、それは少しひどく見えます。:)
Raif

3
githubまたはbitbucket、gitlabを使用できますか?この状況を正確に管理するツールがあります。開発者がプルリクエストを行います。リクエストを受け取ると、各ファイルに加えられたすべての変更の差分を表示する非常に優れたインターフェースにアクセスできます。コメントしたり、変更を要求したりすることもできます。変更が適切な場合は、変更を要求されたブランチにマージする要求(通常は開発)を受け入れることができます。これは、この状況を処理するための最良の方法です。
スコットライト

回答:


166

@Marco Pontiによる回答の代替手段であり、チェックアウトを回避します。

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

特定のシェルが$()構成を理解できない場合は、代わりにバックティックを使用してください。


1
ああ!これはとても楽しいです。今<notMainDev>を現在のブランチにしたい場合はどうでしょうか。それを指定する必要はありませんか?
Raif

29
git diff --name-only <some-other-branch>現在のブランチとで異なるファイルが表示されます<some-other-branch>。だから、あなたが間で異なるファイルを見つけるためにこれを使用することができ、本質的に同じコマンドですが、ノートの任意彼らはリモートで関連していない場合でも、二つの枝を。その比較が役立つかどうかは、ブランチのトポロジに依存します...また、<some-other-branch>実際には、コミット、または1つに解決されるすべてのもの(タグなど)である可能性があることに注意してください。
twalberg 2012年

うーん、まあ、私が言っているのはgit diff --name-only <notMainDev> $(git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>)です。MY_CURRENT_CO_BRANCHはもちろん現在のチェックアウトされたブランチです
Raif

それもできます。それはポイント見つける<notMainDev><MY_CURRENT_CO_BRANCH>共通の祖先を持っていた最近の、そして比較<notMainDev>その祖先に。ただし、git merge-base2つの引数を期待するように、現在のブランチ名を指定する必要があります。少なくとも現在のバージョンでは、ショートカットはありません。
twalberg

1
OK!わかった。彼の名前は私の同僚の好意による。git branch | grep '\*' | awk '{print $2}' <notMainDev>と現在のブランチの間のブランチのコミットを取得するgit merge-base <notMainDev> その後、git diff --name-only <notMainDev> $(git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')を実行できます
Raif

147

あなたがしなければならないのは以下です:

git checkout <notMainDev>
git diff --name-only <mainDev>

これにより、2つのブランチ間で異なるファイル名のみが表示されます。


すごい速すぎて要点。ありがとうございました。ところで私はgitが大好きです。それは常に迅速かつ要点です
Raif

23
でも<mainDev>、支店が分かれてから変わったことがわかると思います。git diff --name-only <sha-of-branch-point>代わりに使用するか、チェックアウトを回避するために私が投稿した別の回答をご覧ください。
twalberg

はい、それは本当です@twalbergブランチが分岐している場合、それらの変化を示します。notMainDevmainDevコミットで最新の状態に保たれると想定していましたが、通常はそれらの違いを確認することも役立つと思います。
Marco Ponti、2012年

--right-onlyを指定して、右側で変更されたファイルのみを表示することはできませんか?
TheZenker

あなたが得る<sha-of-branch-point>git rev-parse <branch-name>
fc9.30

69

これは今のところ言われていないことに驚いています!

git diff master...branch

でのみ変更を確認してください branch

現在のブランチをチェックするには

git diff master...

jqrに感謝

これは

git diff $(git merge-base master branch) branch

したがって、マージベース(ブランチ間の最新の一般的なコミット)とブランチのヒント

マスターだけでなくorigin / masterを使用すると、ローカルマスターに日付が付いている場合に役立ちます


4
これは何が変更されたのかを示していますが、変更されたファイルの概要ではなく、すべての変更を示しています...これが最初にこのページに私を導いたものです:)
Chris Rutledge

1
次に--name-onlyフラグをこれに追加します。または--short-stat
exussum '10

2
git diff --name-only master..2つのブランチ間で異なるファイルの名前が必要な場合。
アダム

1
サイドブランチを作成した後にマスターにコミットがあった場合、これは正しく機能しません。
simplylizz

2
@simplylizzはいそうです。厥まさにこの解決された
exussum

45

これには多くの方法があるとは思えません。私は誰かが以前に投稿したものと同じように、次の引数を使用してwhatchangedを使用します。

git whatchanged --name-only --pretty="" origin..HEAD

これはファイル名と、現在のブランチで変更されたものだけをリストします。


3
これは追加情報を必要としないため、ここで最も簡単な答えのようです。出力は正しいように見え、受け入れられた答えよりも覚えやすくなります。
RickMeasham 2016

1
おかげで、これは面白く、もっと言葉っぽいです。コミットごとに逆の順序で出力を提供します。 git-whatchanged-コミットごとに異なるログを表示するコミットごとに git-scm.com/docs/git-whatchangedが
nealmcb

git docsから:New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S

21

@twalbergの答えは本当に気に入りましたが、常に現在のブランチ名を入力する必要はありませんでした。だから私はこれを使っています:

git diff --name-only $(git merge-base master HEAD)

1
あなたの解決策は私にとってうまくいき、私が見ると予想されるファイルのリストを取得します。私はGitの初心者git diff master... --name-onlyで、ターゲットブランチで実行すると同じ結果が得られます。あなたの答えと私が提供したコマンドとの間の良い点と悪い点についてフィードバックを提供するほど親切にできますか?
hungerstar 2018

ブランチが作成されてからマスターに新しいコミットがない場合でも、コマンドはまったく同じように機能します。私のコマンドはgit diff master.. --name-only(3ドットではなく2ドットしかないことに注意してください)と同等になると思います。ドットの意味を理解するには、この回答を
Yep_It's_Me

驚くばかり!迅速な返信と洞察をありがとう。とても有難い。
hungerstar

12

git whatchanged 良い代替手段のようです。


1
まさに私が探していたもの。
Sild

git docsから:New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S

9
git diff --name-only master...branch-name

比較したいもの。


既存の回答の一部のようです、stackoverflow.com
a / 41486181/11912

このバリエーションは、マスターのHEADを現在のブランチと比較します。受け入れられた回答は、分岐した時点でのマスターの状態を比較します。あなたが知りたいことに応じて、どちらがあなたが探している答えを持っているかもしれません。
Mark Stosberg、

8

これほど簡単にできるとしたら?

git changed

メインブランチが「マスター」と呼ばれ、マスターから他のブランチを作成すると想定する場合は、このエイリアスを~/.gitconfigファイルに追加して、簡単にすることができます。

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

これらの仮定は、ほとんどの場合、ほとんどの状況で機能しますが、それらを作成していることを認識する必要があります。

また、をサポートするシェルを使用する必要があります$()シェルがこれをサポートしている可能性が非常に高いです


3
git show --stat origin/branch_name

これにより、このブランチで追加または変更されたファイルのリストが表示されます。


2
これは間違っています。これは、ブランチ全体ではなく、そのブランチのヘッドコミットで変更されたファイルのみを表示します。
davidtbernal

2

どういうわけか誰も言及しなかったgit-treehttps://stackoverflow.com/a/424142/1657819を参照してください

git-treeそれは配管コマンドなので、推奨されます。プログラマティックであることを意図しています(そしておそらく、より高速です)

(ベースブランチがであると仮定master

git diff-tree --no-commit-id --name-only -r master..branch-name

ただし、これにより、ブランチで影響を受けたすべてのファイルが表示されます。明示的に変更されたファイルのみを表示する場合は、次のコマンドを使用できます--diff-filter

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

--name-status代わりに--name-onlyを使用して、ファイルのステータスを確認することもできます(A/ M/ Dなど)


これは、削除されたファイルを除外しながら、変更されたファイルをリントするために必要なものでした。rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel

1

受け入れられた回答-- git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)は非常に近いですが、削除のステータスが間違っていることに気付きました。ブランチにファイルを追加しましたが、このコマンド(を使用--name-status)は、削除したファイルに「A」ステータスと追加したファイルに「D」ステータスを与えました。

代わりにこのコマンドを使用する必要がありました。

git diff --name-only $(git merge-base <notMainDev> <mainDev>)

0

@twalbergと@iconoclastの機能を拡張して、何らかの理由でcmdを使用している場合は、次のように使用できます。

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y

0

次のバッチファイルは、twalbergの回答に基づいていますが、Windowsで機能します。

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

上記は、メインブランチがorigin / masterであり、Gitがインストールされたときにgit bashが含まれていることを前提としています(その場所はパス環境にあります)。実際には、構成済みの差分ツール(kdiff3)を使用して実際の違いを表示する必要があったため、上記の次のbashコマンドを置き換えました。

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"

0

私はgrepを使用しているので、ファイルパスであるdiff --gitの行のみを取得します。

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.