Diff aktuelle Arbeitskopie einer Datei mit der festgeschriebenen Kopie eines anderen Zweigs

158

Ich habe ein Repo mit Datei fooin der Hauptniederlassung. Ich wechselte zu Bar Branch und nahm einige Änderungen an vor foo. Wie kann ich jetzt eine git diffKopie zwischen dieser Kopie (die noch nicht festgeschrieben ist) und der Kopie des Hauptzweigs ausführen ?

Dogbert
quelle

Antworten:

151

Folgendes funktioniert für mich:

git diff master:foo foo

In der Vergangenheit war es möglicherweise:

git diff foo master:foo

Mark Longair
quelle
9
Jedes Mal, wenn ich eine Antwort von Ihnen git diffsehe, denke ich an stackoverflow.com/questions/5256249/git-diff-doesnt-show-enough/…
VonC
@VonC: Danke, es ist schön zu wissen, dass es sich gelohnt hat, diese zu zeichnen :) Übrigens, verstehst du zufällig die Seltsamkeit, mit der ich meine Antwort aktualisiert habe?
Mark Longair
2
Haben Sie versucht --, Parameter von Pfadargumenten zu trennen? git diff -- master:foo foo
VonC
1
Unter 1.8 git diff -- master:foo foofunktioniert das nicht - es scheint das Argument master:fooals nicht vorhandenen Dateinamen zu behandeln (und ignoriert es) anstelle einer Datei in einem Zweig. Versuchen Sie, die letzten 2 Argumente zu wechseln. Wenn dies funktioniert hat, sollte der Diff-Vergleich umgekehrt werden, aber die Ausgabe ändert sich nicht.
Kelvin
9
Für mich ist es das Gegenteil - ich kann es tun, git diff master:foo fooaber nicht umgekehrt. Ich verstehe es auch nicht. Mit Git 1.7.9.5 / Ubuntu 12.04 kann ich zumindest git diff -R master:foo foodas Diff bekommen, das ich eigentlich will. Wenn ich das mit msysgit 1.9.4 / Windows 7 x64 versuche, bekomme ich fatal: unable to read 0000000000000000000000000000000000000000. Ohne -Rbekomme ich die gleiche Fehlermeldung wie Sie mit Git 1.7.9.5, aber mit 1.9.4 bekomme ich fatal: master:foo: no such path in the working tree.
JMM
100

Sie versuchen, Ihren Arbeitsbaum mit einem bestimmten Zweignamen zu vergleichen, und möchten Folgendes:

git diff master -- foo

Welches ist von dieser Form von Git-Diff (siehe die Git-Diff-Manpage)

   git diff [--options] <commit> [--] [<path>...]
       This form is to view the changes you have in your working tree
       relative to the named <commit>. You can use HEAD to compare it with
       the latest commit, or a branch name to compare with the tip of a
       different branch.

Zu Ihrer Information, es gibt auch eine --cached(aka --staged) Option zum Anzeigen des Unterschieds von dem, was Sie inszeniert haben, und nicht von allem in Ihrem Arbeitsbaum:

   git diff [--options] --cached [<commit>] [--] [<path>...]
       This form is to view the changes you staged for the next commit
       relative to the named <commit>.
       ...
       --staged is a synonym of --cached.
Jordan Brough
quelle
2
Vielen Dank. Keine Ahnung warum, aber nur diese Antwort hat bei mir mit Git 1.8.1 unter Linux funktioniert.
srking
Ausgezeichnet, vielen Dank. Ich hatte den Wunsch, den Namen meines aktuellen Zweigs in den Befehl diff aufzunehmen, aber ich sehe, dass dies nicht erforderlich ist.
Jojo
Das hat vor ein paar Monaten bei mir funktioniert, scheint aber jetzt nicht zu sein. Derzeit bin ich bei Git Version 2.7.4 (Apple Git-66); Ich weiß nicht, was ich vorher hatte.
hBrent
@hBrent das funktioniert immer noch für mich unter OSX 10.11 mit Git 2.7.3. Hier ist ein kurzes Beispiel-Repo mit Anweisungen, wenn dies hilfreich ist: github.com/jordan-brough/git-diff-test
Jordan Brough
Danke @JordanBrough.
hBrent
14

Ebenfalls: git diff master..feature foo

Da git diff foo master:foofunktioniert bei Verzeichnissen für mich nicht.

ArtBIT
quelle
Ich auch nicht. Ist es eine Windows-Sache?
Scott Stafford
@ScottStafford Ich bin auf Ubuntu, also nein, es scheint nicht nur eine Windows-Sache zu sein.
ArtBIT
Funktioniert für mich, solange ich explizit beide Filialnamen (Fenster) gebe git diff branch1:foo master:foo
Meep
12
git difftool tag/branch filename
Adir
quelle
Dies ist die einzige Antwort, die für mich zum Vergleich zwischen einer lokalen Arbeitskopie einer Datei und dieser Dateiversion in einem Remote-Repo (nicht "Ursprung") funktioniert hat. Danke, Adir und Baz
Maus
git difftoolhat -vlaut docs git-scm.com/docs/git-difftool keine Option . Meinten Sie -y?
ks1322
10
git diff mybranch master -- file

sollte auch funktionieren

Naoise Golden
quelle
4
Dies funktioniert nur für Dateien, die an mybranch gebunden sind, nicht für die aktuelle Arbeitskopie der Datei.
Jojo
Was bedeutet "-" oben
Pushparaj
Dies ermöglicht einen Vergleich in beide Richtungen: git diff deployment master -- fileund git diff master deployment -- filefunktioniert wie erwartet mit 2 beliebigen Zweigen .
Viktorkho
0

Um lokale Änderungen zu sehen, vergleichen Sie diese mit Ihrer aktuellen Niederlassung

git diff .

Um lokale Änderungen zu sehen, vergleichen Sie diese mit anderen vorhandenen Zweigen

git diff <branch-name> .

Änderungen einer bestimmten Datei anzeigen

git diff <branch-name> -- <file-path>

Stellen Sie sicher, dass Sie git fetcham Anfang laufen .

kta
quelle