git: Unterschied zwischen Datei im lokalen Repo und Herkunft


186

Ich möchte die Unterschiede zwischen einer Datei, die ich in meinem lokalen Repo habe, und der Datei in der Datei herausfinden origin master.

Ich weiß, dass es das gibt git diff, aber ich möchte es nur auf diese eine bestimmte Datei beschränken.

Nehmen wir zur Vereinfachung an, die Datei file1.txthat einen Namen und einen lokalen Dateipfad = [local_path]und im Ursprung den Dateipfad = [remote-path].

Was wäre der git-Befehl, den ich eingeben muss?

EDIT: Vielen Dank für Ihre Eingabe, es war sehr aufschlussreich. Für diejenigen, die Eclipse verwenden (was ich bin und ich hätte es früher sagen sollen), habe ich gerade herausgefunden, dass Sie einfach mit der rechten Maustaste klicken -> Vergleichen mit -> Verzweigen, Tag oder Referenz -> geeignete Version auswählen und los geht's.


Unterscheidet sich [Remote-Pfad] von [lokaler Pfad]?
Code-Lehrling

Ich habe gerade Ihre Bearbeitung bemerkt. Fühlen Sie sich frei, es als Antwort zu posten.
Code-Apprentice

Wie nennt man "Ursprungsmeister"?

Die Eclipse Egit-Methode ist gut
user1169587

Antworten:


247

Wenn [remote-path]und gleich [local-path]sind, können Sie tun

$ git fetch origin master
$ git diff origin/master -- [local-path]

Hinweis 1: Der obige zweite Befehl wird mit dem lokal gespeicherten Fernverfolgungszweig verglichen. Der Befehl fetch ist erforderlich, um den Remote-Tracking-Zweig so zu aktualisieren, dass er mit dem Inhalt des Remote-Servers synchronisiert ist. Alternativ können Sie einfach tun

$ git diff master:<path-or-file-name>

Hinweis 2: master Kann in den obigen Beispielen durch einen beliebigen Zweigstellennamen ersetzt werden


15
Und kann sogar den lokalen Pfad weglassen, wenn dies das aktuelle Verzeichnis ist.
Tony Wall

19
Für diejenigen, die extrem noob wie ich sind, ist hier ein Beispiel:git diff master:README.md -- README.md
Fabriciorissetto

23
Eigentlich ist hier ein besseres Beispiel:git diff origin/master -- README.md
JDiMatteo

Ich konnte nicht git fetch masterstattdessen verwenden git fetch .(Origin / Master funktionierte auch nicht), aber der Rest funktionierte gut.
Rob

1
@rob Du bist der erste, der auf meinen Fehler hinweist. Es sollte sein git fetch **origin**.
Code-Apprentice

114

So zeigen Sie die Unterschiede zwischen der Remote-Datei und der lokalen Datei an:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

So zeigen Sie die Unterschiede in die andere Richtung an:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

Grundsätzlich können Sie mit dieser Notation zwei beliebige Dateien überall unterscheiden:

git diff ref1:path/to/file1 ref2:path/to/file2

Wie üblich ref1und ref2können Zweigstellennamen, Remotename / Zweigstellenname, Commit-SHAs usw. sein.


17

Verwenden Sie einfach die folgende Syntax, um das lokale Repository mit dem Remote-Repository zu vergleichen:

git diff @{upstream}

2

Dafür habe ich ein Bash-Skript geschrieben:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

Im obigen Skript rufe ich den Remote-Hauptzweig (nicht unbedingt den Hauptzweig ANY-Zweig) ab FETCH_HEAD, erstelle dann eine Liste nur meiner geänderten Datei und vergleiche geänderte Dateien mitgit difftool .

Es gibt viele difftoolvon Git unterstützte, die ich Meld Diff Viewerfür einen guten GUI-Vergleich konfiguriert habe .
Aus dem obigen Skript habe ich Vorkenntnisse darüber, welche Änderungen von anderen Teams in derselben Datei vorgenommen wurden, bevor ich Git-Phasen befolge, untrack-->staged-->commitdie mir helfen, unnötige Konflikte beim Zusammenführen von Konflikten mit dem Remote-Team zu vermeiden oder einen neuen lokalen Zweig zu erstellen und den Hauptzweig zu vergleichen und zusammenzuführen.


1

Ich habe ein paar Lösungen ausprobiert, aber ich habe eine einfache Möglichkeit: Sie befinden sich im lokalen Ordner:

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

Dann haben Sie die letzte Commit-Nummer von local git und remote git verglichen ....


0

Die vollständige Antwort auf die ursprüngliche Frage, die sich auf einen möglichen anderen Pfad auf lokaler und entfernter Ebene bezog, finden Sie unten

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

Angenommen, der lokale Pfad lautet docs / file1.txt und der Remote-Pfad lautet docs2 / file1.txt git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Dies wird von der GitHub-Hilfeseite hier und der Antwort von Code-Apprentice oben angepasst

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.