Den Unterschied zwischen zwei Repositorys ermitteln

179

Wie können wir den Unterschied zwischen zwei Git-Repositories ermitteln?

Das Szenario: Wir haben ein repo_a und ein repo_b. Letzteres wurde als Kopie von repo_a erstellt. In beiden Repositories gab es danach eine parallele Entwicklung. Gibt es eine Möglichkeit, die Unterschiede der aktuellen Versionen dieser beiden Repositorys aufzulisten?

Sanjayav
quelle
2
Mögliches Duplikat von Wie vergleiche ich zwei Git-Repositorys?
Ciro Santilli 法轮功 冠状 病 六四 事件 30

Antworten:

249

In repo_a:

git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b
iamamac
quelle
Ich musste Fernbedienungen / b / master gemäß der anderen Antwort angeben
Doug Moscrop
3
Was ist, wenn Sie repo_a / master mit einem bestimmten Tag von repo_b vergleichen müssen?
David Torres
2
funktioniert nicht für mich, es wirft: fatal: mehrdeutiges Argument 'remotes / b / master': unbekannte Revision oder Pfad nicht im Arbeitsbaum. Verwenden Sie '-', um Pfade von Revisionen wie folgt zu trennen: 'git <Befehl> [<Revision> ...] - [<Datei> ...]' Irgendwelche Ideen hier?
Andrew Heekin
2
Ich bekomme das gleiche wie @AndrewHeekin. Hat jemand eine Lösung?
Parlament
4
Ich muss origin/mastereher spezifizieren als nackt master. Dies stellt auch den Unterschied zwischen den Hauptzweigen fest. Was ist also, wenn Sie alle Zweige finden möchten, die unterschiedlich sind? ZB um den Status einer Repository-Sicherung zu überprüfen?
DavidA
32

Meld kann Verzeichnisse vergleichen:

meld directory1 directory2

Verwenden Sie einfach die Verzeichnisse der beiden Git-Repos und Sie erhalten einen schönen grafischen Vergleich:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie auf eines der blauen Elemente klicken, können Sie sehen, was sich geändert hat.

Martin Thoma
quelle
1
Meld friert ein, während Projekte in meiner VS-Lösung verglichen werden, BeyondCompare jedoch nicht.
Sasha Bond
3
in OSX: diff -RQ folder1 folder2
Mark
1
Wunderbarer Link! Sehr einfaches Programm, ich benutze es jetzt als mein Diff-Programm für OSX.
Dmanexe
1
Das ist absolut schön! Danke für das Teilen.
Shihab Khan
Ich bin mir nicht sicher, ob meld Dateien verarbeiten kann, die von git ignoriert werden - dies sollten Sie bei der Verwendung berücksichtigen
noamgot
11

Sie können Ihrem aktuellen Repo zuerst ein anderes Repo als Fernbedienung hinzufügen:

git remote add other_name PATH_TO_OTHER_REPO

dann holen Sie Brach von dieser Fernbedienung:

git fetch other_name branch_name:branch_name

Dadurch wird dieser Zweig als neuer Zweig in Ihrem aktuellen Repo erstellt. Anschließend können Sie diesen Zweig mit jedem Ihrer Zweige unterscheiden, um beispielsweise den aktuellen Zweig mit dem neuen Zweig (Filialname) zu vergleichen:

git diff branch_name
M. Kouchi
quelle
7

Sobald Sie beide Zweige in einem Repository haben, können Sie eine git diff. Und sie in ein Repository zu bekommen ist so einfach wie

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*
Michael Krelin - Hacker
quelle
Gibt es eine Möglichkeit, den Verlauf mit einer kleinen Änderung auszuwählen: Zum Beispiel wird die Remote-Repo-Datei in einem Verzeichnis abgelegt, aber ich möchte Änderungen auf dieselbe Datei anwenden, die sich jedoch in einem anderen Verzeichnis im lokalen Repo befindet.
Eugen Konkov
Wenn Sie über eine kleine Änderung sprechen, ist es meiner Meinung nach am einfachsten, einen Unterschied zu machen und ihn dann mithilfe eines Patches erneut auf die andere Datei anzuwenden.
Michael Krelin - Hacker
Patch wird wegen unterschiedlicher Dateinamen nicht angewendet, obwohl es sich um dieselben Dateien handelt
Eugen Konkov
Oh, ich habe nur an verschiedene Verzeichnisse gedacht, nicht an Dateinamen (Verzeichnisse können einfach über Patch-Optionen verarbeitet werden). Nun, für die Dateinamen würde ich sie einfach manuell oder über das Skript ändern. Das heißt, ich sage nicht, dass es keine bessere Lösung gibt, nur das, was ich mir einfallen lassen kann, ohne irgendwo zu graben.
Michael Krelin - Hacker
7
git diff master remotes/b

Das ist falsch remotes/bist eine Fernbedienung, aber kein Zweig.

Um es zum Laufen zu bringen, musste ich tun:

git diff master remotes/b/master
James
quelle
6

Siehe http://git.or.cz/gitwiki/GitTips , Abschnitt "Vergleichen zweier lokaler Repositorys" in "Allgemein".

Kurz gesagt, Sie verwenden die Umgebungsvariable GIT_ALTERNATE_OBJECT_DIRECTORIES, um Zugriff auf die Objektdatenbank des anderen Repositorys zu erhalten, und verwenden git rev---git-dir parse mit / GIT_DIR, um den symbolischen Namen in einem anderen Repository in den SHA-1-Bezeichner zu konvertieren.

Die moderne Version würde ungefähr so ​​aussehen (vorausgesetzt, Sie befinden sich in 'repo_a'):

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / Objekte \
   git diff $ (git --git-dir = .. / repo_b / .git rev-parse --verify HEAD) HEAD

Wo ../repo_b/.gitist der Pfad zur Objektdatenbank in repo_b (es wäre repo_b.git, wenn es ein reines Repository wäre). Natürlich können Sie beliebige Versionen vergleichen, nicht nur HEADs.


Beachten Sie, dass es möglicherweise sinnvoller ist, beide in dasselbe Repository zu stellen, wenn repo_a und repo_b dasselbe Repository sind. Verwenden Sie entweder " git remote add -f ...", um Spitznamen für das Repository für wiederholte Aktualisierungen zu erstellen, oder obe off " git fetch ...". wie in anderen Antworten beschrieben.

Jakub Narębski
quelle
5

Ich verwende PyCharm, das großartige Möglichkeiten zum Vergleichen zwischen Ordnern und Dateien bietet.

Öffnen Sie einfach den übergeordneten Ordner für beide Repos und warten Sie, bis er indiziert ist. Dann können Sie mit der rechten Maustaste auf einen Ordner oder eine Datei klicken Compare to...und den entsprechenden Ordner / die entsprechende Datei auf der anderen Seite auswählen.

Es zeigt nicht nur, welche Dateien unterschiedlich sind, sondern auch deren Inhalt. Viel einfacher als die Kommandozeile.

MrE
quelle
2

Am besten haben Sie beide Repos auf Ihrem lokalen Computer und verwenden den Befehl linux diff mit den beiden Verzeichnissen als Parameter:

diff -r repo-A repo-B

Andrew Heekin
quelle
1
Die einzige Möglichkeit, dies nutzbar zu machen, besteht darin, eines der .git-Verzeichnisse umzubenennen. Dies reduziert sich auf zwei Zeilen Seiten mit Unterschieden, die keine Rolle spielen. Ich war dort, habe das getan und bin hierher gekommen, um eine bessere Antwort zu finden.
Hildred
2

Eine einfache Möglichkeit, dies zu tun, ohne die Konfiguration Ihrer Fernbedienungen zu berühren. Aus Repo A in Master (vorausgesetzt, Sie möchten Master-Zweige vergleichen):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD
jorisv92
quelle
0

Sie können den folgenden Befehl verwenden:

diff -x .git -r repo-A repo-B

oder für die Seite an Seite können Sie verwenden:

diff -x .git -W200 -y -r repo-A repo-B

Wenn Sie jede Diff-Datei einfärben möchten, können Sie Folgendes verwenden:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"
Gerard
quelle
basierend auf @ andrew-heekin Lösung
Gerard
0

Erinnerung an sich selbst ... zuerst abrufen, sonst hat das Repository keinen lokalen Hash (denke ich).

Schritt 1. Richten Sie die Upstream-Fernbedienung und höher ein

Das Differenzieren einer einzelnen Datei folgt diesem Muster:

git diff localBranch uppreamBranch --spacepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

Hillsie
quelle