Gibt es eine Möglichkeit zu sehen, welche Dateien sich in einem Zweig geändert haben?
Gibt es eine Möglichkeit zu sehen, welche Dateien sich in einem Zweig geändert haben?
Antworten:
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.
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.).
<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-base
zwei Argumente erwartet werden - zumindest in der aktuellen Version gibt es keine Verknüpfung.
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}'
)
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.
<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.
notMainDev
mit den mainDev-Commits auf dem neuesten Stand gehalten werden würde ... Ich finde es normalerweise auch nützlich, diese Unterschiede zu sehen.
<sha-of-branch-point>
mitgit rev-parse <branch-name>
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
git diff --name-only master..
Wenn Sie nur die Namen von Dateien möchten, die sich zwischen den beiden Zweigen unterscheiden.
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.
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.
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)
git diff master... --name-only
wenn 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?
git diff master.. --name-only
(beachten Sie, dass es nur 2 statt 3 Punkte gibt). Um zu verstehen, was die Punkte bedeuten,
git whatchanged
scheint eine gute Alternative zu sein.
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.
git diff --name-only master...branch-name
mit denen wir vergleichen wollen.
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 ~/.gitconfig
Datei 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 .
git show --stat origin/branch_name
Dadurch erhalten Sie eine Liste der Dateien, die unter diesem Zweig hinzugefügt oder geändert wurden.
Aus irgendeinem Grund erwähnte niemand git-tree
. Siehe https://stackoverflow.com/a/424142/1657819
git-tree
wird 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-status
anstatt --name-only
den Status der Dateien anzuzeigen ( A
/ M
/ D
und so weiter)
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
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>)
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)"