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:
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}')
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
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:
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:
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.
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.
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:
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:
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.
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:
Antworten:
Eine Alternative zur Antwort von @Marco Ponti und Vermeidung der Kaufabwicklung:
Wenn Ihre bestimmte Shell das Konstrukt $ () nicht versteht, verwenden Sie stattdessen Back-Ticks.
quelle
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, dagit 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:
Dies zeigt Ihnen nur die Dateinamen, die sich zwischen den beiden Zweigen unterscheiden.
quelle
<mainDev>
seit die Zweige auseinander gegangen sind. Vielleicht möchten Siegit 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!
Sehen Sie sich die Änderungen also nur an
branch
Um den aktuellen Zweig zu überprüfen, verwenden Sie
Danke an jqr
Dies ist eine kurze Hand für
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
quelle
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:
Hier werden nur die Dateinamen aufgelistet und nur diejenigen, die sich im aktuellen Zweig geändert haben.
quelle
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:
quelle
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.quelle
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.
mit denen wir vergleichen wollen.
quelle
Was wäre, wenn es so einfach sein könnte?
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: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 .quelle
Dadurch erhalten Sie eine Liste der Dateien, die unter diesem Zweig hinzugefügt oder geändert wurden.
quelle
Aus irgendeinem Grund erwähnte niemand
git-tree
. Siehe https://stackoverflow.com/a/424142/1657819git-tree
wird bevorzugt, weil es sich um einen Installationsbefehl handelt . soll programmatisch sein (und vermutlich schneller)(unter der Annahme, dass der Basiszweig ist
master
)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
:Man kann auch verwenden,
--name-status
anstatt--name-only
den Status der Dateien anzuzeigen (A
/M
/D
und so weiter)quelle
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:
quelle
Wenn Sie cmd aus irgendeinem Grund verwenden, können Sie Folgendes verwenden: @twalberg und @iconoclast
quelle
Die folgende Batch-Datei basiert auf der Antwort von twalberg, funktioniert jedoch unter Windows:
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:
quelle
Ich benutze grep, damit ich nur die Zeilen mit diff --git bekomme, die der Dateipfad sind:
quelle