Wie man zwischen lokalen nicht festgeschriebenen Änderungen und Ursprung unterscheidet


141

Angenommen, ich habe ein Repository geklont und begonnen, Dateien zu ändern. Ich weiß, dass ich, wenn ich lokale nicht festgeschriebene Änderungen habe, einen git diff test.txtUnterschied wie folgt machen kann, der mir den Unterschied zwischen dem aktuellen lokalen HEAD und den geänderten, nicht festgeschriebenen Änderungen in der Datei zeigt. Wenn ich diese Änderungen festschreibe, kann ich sie mithilfe von mit dem ursprünglichen Repository vergleichengit diff master origin/master

Aber gibt es eine Möglichkeit, die lokalen Änderungen vom ursprünglichen Repository auf dem Server zu unterscheiden, bevor sie lokal festgeschrieben werden? Ich habe verschiedene Permutationen git diff --cached master origin/masterohne Glück ausprobiert .


Ich wollte wissen, wie sehr sich meine Datei gegenüber der letzten festgeschriebenen Version auf meinem lokalen Server geändert hat. Die Antwort auf meine Frage war diese Frage. Vielen Dank!
Souvik Ghosh

Antworten:


133

Da das Remote-Repository über zwischengespeichert wurde git fetch, sollte es möglich sein, mit diesen Commits zu vergleichen. Versuche Folgendes:

$ git fetch origin
$ git diff origin/master

5
Ah, ausgezeichnet. Der Schlüssel war, den Meister wegzulassen. Ich hatte zuvor eine Kombination ausprobiert, bei der ich einen Abruf durchgeführt habe, aber als ich dies tat, wurde git diff master origin/mastersie immer noch mit der festgeschriebenen Version verglichen (im Nachhinein offensichtlich). Wenn Sie jedoch den Master weglassen, werden die lokalen Änderungen jetzt mit der abgerufenen Version verglichen.
Chaitanya

@Chaitanya Gut, ich könnte helfen. Eigentlich finde ich die verschiedenen Stile, die Git verwendet, etwas irritierend: Sobald man schreiben muss origin masterund woanders origin/master. Es gibt noch viel zu tun, IMHO.
JJD

Dies scheint nicht zu funktionieren: git diff origin/masterRückgabemeister fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.existiert jedoch am Ursprung, z. B. git fetch origin masterfunktioniert gut,
mikemaccana

42

Ich weiß, dass es keine Antwort auf die genaue gestellte Frage ist, aber ich fand diese Frage, um eine Datei in einem Zweig und eine lokale nicht festgeschriebene Datei zu unterscheiden, und ich dachte, ich würde sie teilen

Syntax:

git diff <commit-ish>:./ -- <path>

Beispiele:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Vielen Dank an Eric Boehs für die Möglichkeit, den Dateinamen nicht zweimal eingeben zu müssen.)


Ich mag die allgemeine Lösung besser als die enge, spezifische oben. Teilen Sie, wo Sie das gefunden haben?
Fbicknel

Ich kann die Dokumentation zu den Details commit-ishund dem Doppelpunkttrennzeichen nicht finden . Die Dokumente auf git-diff scheinen es nicht zu erwähnen. Ich habe es so lange benutzt, dass ich mich nicht mehr daran erinnere, wo ich es zuerst gefunden habe. Wahrscheinlich die Beispiele anderer Leute zu anderen Befehlen, mit denen ich gerade experimentiert habe git-diff. Ich fürchte, eine andere Antwortcommit-ish ist die beste, die ich im Moment finden kann.
Nate

3
Eine schöne Ergänzung dazu ist git diff master:./ -- README.md. Auf diese Weise müssen Sie nicht README.mdzweimal eingeben und können es einfacher zu einem Alias ​​hinzufügen.
Eric Boehs

Danke @EricBoehs, das ist ein großartiger Vorschlag.
Nate

1
Das Syntax funktioniert nicht für mich ... eher git diff master: -- README.mddas ./schafft eine /dev/nullQuelle , anstatt den Fern Zweig. Verwenden von Git-Version 2.19.0
rustyDev

21

Anzeigen von nicht bereitgestellten (nicht hinzugefügten) Änderungen an vorhandenen Dateien

git diff

Beachten Sie, dass dadurch keine neuen Dateien verfolgt werden. Bereitgestellte, nicht festgeschriebene Änderungen anzeigen

git diff --cached


9

Wenn Sie Dateien visuell vergleichen möchten, können Sie Folgendes verwenden:

git difftool

Es startet Ihre Diff-App automatisch für jede geänderte Datei.

PS: Wenn Sie keine Diff-App festgelegt haben, können Sie dies wie im folgenden Beispiel tun (ich verwende Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false

Wird diese Änderung sofort wirksam?
Dilip Raghunathan

Ich bin nur neugierig, wie hängt das mit der gestellten Frage zusammen? Würde git difftool nicht einfach die lokalen Änderungen mit dem Master vergleichen? Das OP möchte dies jedoch zwischen den lokalen Änderungen und dem Remote-Master.
Infoclogged

Mit Abstand die einfachste Lösung
Chris Johnson
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.