Ruft alle Dateien ab, die im Git-Zweig geändert wurden


208

Gibt es eine Möglichkeit zu sehen, welche Dateien sich in einem Zweig geändert haben?



2
Sie sind nicht meine Angestellten, sie sind meine Kollegen und es sind nicht sie im Besonderen, sondern die Menschen im Allgemeinen. Aber ja, wenn ich diesen Beitrag noch einmal lese, scheint es ein bisschen agro zu sein. :)
Raif

3
Kannst du Github oder Bitbucket verwenden, Gitlab? Es gibt Tools, um genau diese Situation zu bewältigen. Der Entwickler stellt eine Pull-Anfrage. Sie erhalten die Anfrage und haben Zugriff auf eine sehr gute Benutzeroberfläche, die Ihnen einen Unterschied zu allen an jeder Datei vorgenommenen Änderungen anzeigt. Sie können sogar Kommentare abgeben, Änderungen anfordern usw. Wenn die Änderungen gut sind, können Sie die Anforderung annehmen, die die Änderungen in den angeforderten Zweig zusammenführt (normalerweise entwickeln). Dies ist die beste Vorgehensweise, um mit dieser Situation umzugehen.
Scott Wright

Antworten:


166

Eine Alternative zur Antwort von @Marco Ponti und Vermeidung der Kaufabwicklung:

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

Wenn Ihre bestimmte Shell das Konstrukt $ () nicht versteht, verwenden Sie stattdessen Back-Ticks.


1
Ah! Das macht Spaß. Wie wäre es, wenn ich sagen möchte, dass <notMainDev> der aktuelle Zweig ist, in dem ich mich befinde? das muss man nicht angeben?
Raif

29
git diff --name-only <some-other-branch>zeigt Ihnen, welche Dateien sich zwischen Ihrem aktuellen Zweig und unterscheiden <some-other-branch>. Es ist also im Wesentlichen der gleiche Befehl, aber beachten Sie, dass Sie diese verwenden können , um die Dateien zu finden , die zwischen verschiedenen sind irgendwelche zwei Zweige, auch wenn sie nicht aus der Ferne sehen. Ob dieser Vergleich nützlich ist oder nicht, hängt von der Topologie Ihrer Zweige ab. Beachten Sie außerdem, dass <some-other-branch>es sich möglicherweise um ein Commit handelt oder um etwas, das in ein Commit aufgelöst wird (Tags usw.).
Twalberg

hmmm, nun, ich denke, ich meine, dass ich git diff - name-only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) machen möchte, wobei MY_CURRENT_CO_BRANCH natürlich mein aktuell ausgecheckter Zweig wäre
Raif

Das können Sie auch. Das wird den Punkt finden, an dem <notMainDev>und <MY_CURRENT_CO_BRANCH>zuletzt einen gemeinsamen Vorfahren hatte, und <notMainDev>mit diesem Vorfahren vergleichen . Sie müssen jedoch Ihren aktuellen Filialnamen angeben, da git merge-basezwei Argumente erwartet werden - zumindest in der aktuellen Version gibt es keine Verknüpfung.
Twalberg

1
OK! Ich habe es verstanden. Mit freundlicher Genehmigung meines Kollegen, wie er heißt. git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' , die das Commit für den Zweig zwischen <notMainDev> und meinem aktuellen Zweig erhält. Ich kann dann git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif

147

Sie müssen lediglich Folgendes tun:

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

Dies zeigt Ihnen nur die Dateinamen, die sich zwischen den beiden Zweigen unterscheiden.


Wow schnell und auch der Punkt. Danke. Übrigens liebe ich Git. Es ist immer schnell und auf den Punkt
Raif

23
Ich glaube, das wird auch Dinge zeigen, die sich geändert haben, <mainDev>seit die Zweige auseinander gegangen sind. Vielleicht möchten Sie git diff --name-only <sha-of-branch-point>stattdessen verwenden oder die alternative Antwort sehen, die ich gepostet habe und die das Auschecken vermeidet.
Twalberg

Ja, das ist wahr @twalberg es würde diese Änderungen zeigen, wenn die Zweige auseinander gehen. Ich ging davon aus, dass das notMainDevmit den mainDev-Commits auf dem neuesten Stand gehalten werden würde ... Ich finde es normalerweise auch nützlich, diese Unterschiede zu sehen.
Marco Ponti

Können Sie nicht einfach --right-only angeben, um nur die Dateien anzuzeigen, die auf der rechten Seite geändert wurden?
TheZenker

Sie erhalten die <sha-of-branch-point>mitgit rev-parse <branch-name>
fc9.30

69

erstaunt, dass dies bisher noch nicht gesagt wurde!

git diff master...branch

Sehen Sie sich die Änderungen also nur an branch

Um den aktuellen Zweig zu überprüfen, verwenden Sie

git diff master...

Danke an jqr

Dies ist eine kurze Hand für

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

also die Zusammenführungsbasis (das letzte gemeinsame Commit zwischen den Zweigen) und die Verzweigungsspitze

Auch die Verwendung von origin / master anstelle von nur master hilft, falls Ihr lokaler Master datiert ist


4
Während dies zeigt, was sich geändert hat, zeigt es die ALLEN Änderungen und nicht eine Zusammenfassung der geänderten Dateien ... was mich an erster Stelle zu dieser Seite geführt hat :)
Chris Rutledge

1
Fügen Sie dann das Flag --name-only hinzu. oder --short-stat
exussum

2
git diff --name-only master..Wenn Sie nur die Namen von Dateien möchten, die sich zwischen den beiden Zweigen unterscheiden.
Adam

1
Dies funktioniert nicht richtig, wenn Ihr Master Commits hatte, nachdem Sie Ihren Seitenzweig erstellt haben.
simplylizz

2
@simplylizz ja das tut es. Das ist genau das, was dies löst
Exussum

45

Ich kann nicht glauben, dass es so viele Möglichkeiten gibt, dies zu tun. Ich verwende whatchanged als jemand, der zuvor gepostet hat, nur mit den folgenden Argumenten:

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

Hier werden nur die Dateinamen aufgelistet und nur diejenigen, die sich im aktuellen Zweig geändert haben.


3
Dies scheint hier die einfachste Antwort zu sein, da keine zusätzlichen Informationen erforderlich sind. Die Ausgabe sieht korrekt aus und ist viel einfacher zu merken als die akzeptierte Antwort!
RickMeasham

1
Danke, das ist interessant, wortreicher. Es liefert die Ausgabe für jedes Commit in umgekehrter Reihenfolge. git-whatchanged - Zeige Protokolle mit Unterschied bei jedem Commit. git-scm.com/docs/git-whatchanged
nealmcb

Aus den Git-Dokumenten :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

Die Antwort von @ twalberg hat mir sehr gut gefallen, aber ich wollte nicht immer den aktuellen Filialnamen eingeben müssen. Also benutze ich das:

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

1
Ihre Lösung funktioniert für mich und ich erhalte die Liste der Dateien, die ich voraussichtlich sehen werde. Ich bin ein Git-Neuling und habe verwendet, git diff master... --name-onlywenn auf dem Zielzweig ausgeführt und das gleiche Ergebnis erhalten. Könnten Sie so freundlich sein, Feedback zu geben, was zwischen Ihrer Antwort und dem von mir erteilten Befehl gut oder schlecht ist?
Hungerstar

Ihr Befehl funktioniert genauso, wenn der Master seit der Erstellung Ihres Zweigs keine neuen Commits hat. Ich denke, mein Befehl entspricht git diff master.. --name-only(beachten Sie, dass es nur 2 statt 3 Punkte gibt). Um zu verstehen, was die Punkte bedeuten,
lesen

Genial! Vielen Dank für die schnelle Antwort und den Einblick. Sehr geschätzt.
hungerstar

12

git whatchanged scheint eine gute Alternative zu sein.


1
Was genau war das, wonach ich suchte.
Sild

Aus den Git-Dokumenten :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

mit denen wir vergleichen wollen.


Scheint ein Teil einer bestehenden Antwort zu sein, stackoverflow.com/a/41486181/11912
James Skemp

Diese Variante vergleicht den HEAD of Master mit einem aktuellen Zweig. Die akzeptierte Antwort vergleicht den Status des Masters an dem Punkt, den Sie gegabelt haben . Je nachdem, was Sie wissen möchten, haben beide möglicherweise die Antwort, nach der Sie suchen.
Mark Stosberg

8

Was wäre, wenn es so einfach sein könnte?

git changed

Wenn Sie davon ausgehen möchten, dass der Hauptzweig "Master" heißt und Sie Ihre anderen Zweige aus Master erstellen, können Sie diesen Alias ​​zu Ihrer ~/.gitconfigDatei hinzufügen , um dies zu vereinfachen:

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

Diese Annahmen funktionieren für die meisten Menschen in den meisten Situationen, aber Sie müssen sich bewusst sein, dass Sie sie machen.

Außerdem müssen Sie eine Shell verwenden, die unterstützt $(). Es ist sehr wahrscheinlich, dass Ihre Shell dies unterstützt .


3
git show --stat origin/branch_name

Dadurch erhalten Sie eine Liste der Dateien, die unter diesem Zweig hinzugefügt oder geändert wurden.


2
Dies ist falsch. Hier werden nur die Dateien angezeigt, die im Head Commit dieses Zweigs geändert wurden, nicht der gesamte Zweig.
Davidtbernal

2

Aus irgendeinem Grund erwähnte niemand git-tree. Siehe https://stackoverflow.com/a/424142/1657819

git-treewird bevorzugt, weil es sich um einen Installationsbefehl handelt . soll programmatisch sein (und vermutlich schneller)

(unter der Annahme, dass der Basiszweig ist master)

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

Dies zeigt Ihnen jedoch alle Dateien, die in der Verzweigung betroffen waren. Wenn Sie nur explizit geänderte Dateien anzeigen möchten , können Sie Folgendes verwenden --diff-filter:

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

Man kann auch verwenden, --name-statusanstatt --name-onlyden Status der Dateien anzuzeigen ( A/ M/ Dund so weiter)


Dies war genau das, was ich brauchte, um geänderte Dateien zu fusseln und die gelöschten auszuschließen. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel

1

Die akzeptierte Antwort - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- ist sehr nah, aber ich habe festgestellt, dass der Status für Löschungen falsch ist . Ich habe eine Datei in einem Zweig hinzugefügt, und dennoch gab dieser Befehl (mit --name-status) der Datei, die ich gelöscht habe, den Status "A" und der Datei, die ich den Status "D" hinzugefügt habe.

Ich musste stattdessen diesen Befehl verwenden:

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

0

Wenn Sie cmd aus irgendeinem Grund verwenden, können Sie Folgendes verwenden: @twalberg und @iconoclast

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

Die folgende Batch-Datei basiert auf der Antwort von twalberg, funktioniert jedoch unter 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

Das obige setzt voraus, dass der Hauptzweig origin / master ist und dass git bash bei der Installation von Git enthalten war (und sich in der Pfadumgebung befindet). Ich musste tatsächlich die tatsächlichen Unterschiede mit einem konfigurierten Diff-Tool (kdiff3) anzeigen, also ersetzte ich den folgenden Bash-Befehl oben:

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

0

Ich benutze grep, damit ich nur die Zeilen mit diff --git bekomme, die der Dateipfad sind:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.