823 Stimmen

Wie kann man die Änderungen zwischen zwei Commits ohne dazwischen liegende Commits sehen?

Wie kann man die git diff nur den Unterschied zwischen zwei Übertragungen anzeigen, ohne die anderen Übertragungen dazwischen?

19 Stimmen

"git diff" immer zeigt den Unterschied zwischen zwei Commits (oder Commit und Arbeitsverzeichnis usw.).

42 Stimmen

@JakubNarebski, er fragt, wie man den Unterschied zwischen den Änderungen, die durch einen Befehl eingeführt wurden, und den Änderungen, die durch einen anderen Commit eingeführt wurden, erkennen kann. Mit anderen Worten, das Diff von Diffs oder Interdiff.

1 Stimmen

Und wenn Sie den Parameter --dirstat=files zum diff-Befehl hinzufügen, erhalten Sie einen sehr schönen Screenshot der genauen Projekte und Dateien, die geändert wurden, zusammen mit einem Prozentsatz der Änderungen. So geht's: git diff [commit-number] [commit-number] --dirstat=files

681voto

OneOfOne Punkte 88023

Können Sie einfach die 2 Commits an git diff übergeben wie :

-> git diff 0da94be  59ff30c > my.patch
-> git apply my.patch

1 Stimmen

Das hat bei mir funktioniert, aber wie kann ich jetzt die my.patch zu einer anderen Branche?

3 Stimmen

@nacho4d: git checkout other-branch && git apply my.patch && git add . && git commit -am "Nachricht"

1 Stimmen

Der Vorteil von git apply gegenüber patch ist, dass man Umbenennungen und einige andere git-spezifische Änderungen einfügen kann. Ich verwende gerne git format-patch und git am.

168voto

bdonlan Punkte 213545

Nach der Differenz /zwischen/ zwei Commits zu fragen, ohne die Commits dazwischen einzubeziehen, macht wenig Sinn. Commits sind nur Momentaufnahmen des Inhalts des Repositorys; die Frage nach dem Unterschied zwischen zwei Commits schließt diese zwangsläufig mit ein. Die Frage ist also, wonach Sie wirklich suchen?

Wie William vorschlug, kann man durch Cherry-Picking das Delta eines einzelnen Commits ermitteln, das auf einem anderen basiert. Das heißt:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached

Dies nimmt die Übergabe 'abcdef', vergleicht sie mit ihrem unmittelbaren Vorgänger und wendet dann dieser Unterschied oben auf '012345'. Dieser neue Unterschied wird dann angezeigt - die einzige Änderung ist, dass der Kontext von "012345" und nicht vom unmittelbaren Vorfahren von "abcdef" stammt. Natürlich kann es zu Konflikten usw. kommen, so dass dieses Verfahren in den meisten Fällen nicht sehr nützlich ist.

Wenn Sie nur an abcdef selbst interessiert sind, können Sie das tun:

$ git log -u -1 abcdef

Dies vergleicht abcdef mit seinem unmittelbaren Vorgänger, allein, und ist normalerweise das, was Sie wollen.

Und natürlich

$ git diff 012345..abcdef

gibt Ihnen alle Unterschiede zwischen diesen beiden Übertragungen an.

Es wäre hilfreich, eine bessere Vorstellung davon zu bekommen, was Sie zu erreichen versuchen - wie ich bereits erwähnt habe, macht es keinen Sinn, nach der Differenz zwischen zwei Commits zu fragen, ohne zu wissen, was dazwischen liegt.

59 Stimmen

Ich stimme zu, dass es im Allgemeinen nicht viel Sinn macht, zwei Commits zu vergleichen. Aber Git ist wirklich gut darin, Ihnen nicht vorzuschreiben, wie Sie denken sollen. Nehmen wir an, Sie haben zwei Zweige mit unterschiedlichen Commits, die so aussehen, als würden sie die gleichen Änderungen an den gleichen Dateien vornehmen. Ich würde gerne in der Lage sein, Git zu benutzen, um mir zu sagen, ob diese beiden Patches gleich sind, ohne meinen Augen vertrauen zu müssen. Ich denke, dass dies von Nutzen ist.

9 Stimmen

@ChrisCleeland, das Interdiff-Dienstprogramm kann in diesem Fall sehr nützlich sein. Verwenden Sie git diff, um den Unterschied zwischen jedem Commit und seinem unmittelbaren Elternteil zu ermitteln, und verwenden Sie dann interdiff, um die Unterschiede zu vergleichen.

0 Stimmen

Interdiff würde sicherlich funktionieren. Da Git bereits Patches speichert, scheint es nicht so schwer zu sein, Patch-Inhalt mit Patch-Inhalt zu vergleichen, anstatt Hashes zu vergleichen.

150voto

plx Punkte 1439

Um zwei Git-Commits 12345 und abcdef als Patches zu vergleichen, kann man den Befehl diff wie folgt verwenden

diff <(git show 123456) <(git show abcdef)

8 Stimmen

Warum sollten Sie GNU diff mit git verwenden?

7 Stimmen

@OneOfOne git diff <(git show 123456) <(git show abcdef) funktioniert nicht; diff <(...) <(...) tut. (Ich habe es gerade ausprobiert).

0 Stimmen

@Menachem git diff 123456 abcdef .

74voto

roadev Punkte 952
git diff <a-commit> <another-commit> path

Ejemplo:

git diff commit1 commit2 config/routes.rb

Es zeigt den Unterschied zwischen diesen Übertragungen in der Datei.

52voto

bit_cracker007 Punkte 1921

Zur Überprüfung vollständiger Änderungen:

  git diff <commit_Id_1> <commit_Id_2>

Zur Überprüfung nur der geänderten/hinzugefügten/gelöschten Dateien:

  git diff <commit_Id_1> <commit_Id_2> --name-only

ANMERKUNG : Für die Überprüfung von diff ohne dazwischen liegende commit, brauchen Sie die commit ids nicht anzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X