Bash git diff: Zwei Commits vergleichen und alles dazwischen ignorieren

CyborgBeta

Banned
Registriert
Jan. 2021
Beiträge
3.958
Ich habe schon im Internet gesucht, aber bislang keine praktikable Lösung gefunden. :(

Der Main-Branch hat folgende Commits:

A, B, ... Y, Z

In B kam ein Feature hinzu, das in Z wieder entfernt wurde. Leider wurden aber einige Änderungen beim Entfernen übersehen. 👀

Ich möchte nun B und Z vergleichen, aber dabei alle Änderungen, die zwischenzeitlich kamen, ignorieren.

Mathematisch gesehen: (Z-A) + B - Z

Folgendes funktioniert leider nicht:
git checkout Z
git cherry-pick -n B
git diff --cached

denn beim cherry-pick Merge treten lauter Konflikte auf, die ich jedes Mal manuell lösen muss, also in der Kette zurück von Y bis C ... (gelöschte Dateien).

Gleiches auch bei einem Revert.

Versucht hatte ich auch:
diff <(sort <(git diff --name-only A Z)) <(sort <(git diff --name-only B Z)) | grep '^< '

(das erste ist das normale Gnu diff) Aber das listet nur bestimmte Dateinamen auf, in denen es Änderungen gab, die in Z noch nicht wieder rückgängig gemacht bzw. entfernt wurden - und nicht die eigentlichen Änderungen.

Danke für Hilfe.
 
git diff commit1 commit2 müsste das können
Edit: ok scheint kompliziert zu sein bei dir
 
  • Gefällt mir
Reaktionen: CyborgBeta
Von wie vielen Zeilen Code sprechen wir denn?

Wenn es nicht zu viele sind, geht evtl. git diff commit_B commit_A ... und das Patch-File dann auf Z anwenden, hier müsstest du nur die bereits entfernten Codestellen ignorieren. Eine IDE wäre da schon geeigneter als nackt in der Shell.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: CyborgBeta
Das was du da vorhast, wird nicht ohne manuellen Eingriff funktionieren. Git baut auf einander auf, dass heißt ohne die Zwischencommits wirst du nicht auf den Stand Z kommen.

Deine beste chance besteht darin, einen Patch von A nach B zu exportieren (wo NUR die Änderungen von A nach B enthalten sind) und diesen dann erneut auf Z anzuwenden - dabei natürlich hoffen, dass keine Änderungen auf dem Weg zu Z zwischenzeitlich drin sind, die in Z noch wichtig sind und durch den "alten" Code im Patch überschrieben werden, aber in Z eigentlich erhalten bleiben müssen.

Ich denke, du solltest einen Diff von A nach B machen und anschließend die Änderungen manuell durchgehen und wieder auf Z anwenden. Das ist mühsam, aber mit den richtigen Tools sollte man damit in ner Stunde durch sein - wesentlich weniger, als eine (semi-)automatisierte Lösung zu suchen (wo ich nicht wüsste, wie die aussehen soll), richtig anzuwenden und zu überprüfen. Da du es nur einmal machen musst, sollte das passen.

Alternativ könntest du mal schauen, was ein LLM macht, wenn du es auf diese Aufgabe ansetzt.
 
  • Gefällt mir
Reaktionen: BeBur, netzgestaltung und CyborgBeta
Danke, das habe ich schon gedacht (oder befürchtet). Nach dem Z-Commit sind eigentlich auch nur 10 Zeilen in zwei Dateien übrig geblieben, die übersehen wurden, aber man will natürlich dennoch die Gewissheit haben, nicht doch noch woanders etwas übersehen zu haben ...

Gibt es vielleicht noch andere CLI-Tools, die auf Git basieren und so etwas könnten?
 
CyborgBeta schrieb:
Versucht hatte ich auch:
diff <(sort <(git diff --name-only A Z)) <(sort <(git diff --name-only B Z)) | grep '^< '

(das erste ist das normale Gnu diff) Aber das listet nur bestimmte Dateinamen auf
KI Output Copy&Paste? Weil --name-only macht doch genau das - nur die Dateinamen auflisten anstatt die Änderungen anzuzeigen.

Eine gute Übersicht kann man sich vielleicht mit sowas in der Art verschaffen: git diff --histogram --pickaxe-all --pickaxe-regex --function-context und dazu -S oder -G nach Bedarf. Ist jetzt nicht KI-generiert, aber hab ich auch nicht ausprobiert ;-).
 
BeBur schrieb:
KI Output Copy&Paste?
Nein

BeBur schrieb:
Weil --name-only macht doch genau das - nur die Dateinamen auflisten anstatt die Änderungen anzuzeigen.
Ich möchte aber auch die Änderungen sehen, also sprich alles, was durch B hinzugefügt oder später geändert wurde, aber noch nicht in Z rückgängig gemacht wurde

Kling unmachbar, ich weiß, weil Git nicht wissen kann, welcher Chunk weshalb geändert wurde, also welche Änderung zu welchem Feature gehörte, eigentlich ...

Aber es kann zumindest wissen, welche Commits einen Chunk geändert hatten
Ergänzung ()

Falls dir das die/eine KI ausgegeben haben sollte, könnte es sein, dass das Model gerade besonders schnell lernt :D
 
Zuletzt bearbeitet:
Zurück
Oben