Git sagen, dass sie dem verschobenen Inhalt folgt (nicht einfach verschobene Dateien)

9

Beim Refactoring von Quellcode müssen Sie manchmal große Textblöcke in eine Datei oder sogar in eine neue Datei verschieben. Sie erstellen eine Verzweigung refactored und committen weg:

%Vor%

Es kann jedoch vorkommen, dass Personen sich auf den alten Pre-Refactor-Zweig festlegen und den verschobenen Code ändern:

%Vor%

Am Zweig refactored möchten Sie dann Änderungen in master :

einbeziehen %Vor%

Dies führt zu einem großen Zusammenführungskonflikt. Wenn es eine Möglichkeit git mitzuteilen, dass der Inhalt einfach verschoben wurde, sollte es möglich sein, automatisch zusammenzuführen.

Der schlimmste Teil ist, dass git auch nach der Lösung des Konflikts und dem Versuch, den Konflikt zu lösen, die Auflösung nicht verwenden kann, um weitere Zusammenführungen zu finden:

%Vor%

Ist das überhaupt vermeidbar? Ich habe git rerere ausprobiert und kann die Konflikte hier nicht lösen. Gibt es irgendeinen Weg, wie Git einen Textblock als tatsächlichen Zug verschieben kann, anstatt ihn zu löschen und einzufügen? Wenn dies nicht möglich ist, was ist der beste Ansatz zum Minimieren von Zusammenführungskonflikten, wenn Sie die beiden parallelen Zweige für eine Weile behalten müssen?

Dies ist zwar einfach genug für Verschieben des Inhalts einer vollständigen Datei , ich konnte keine Informationen darüber finden, ob ich nur Teil davon verschieben oder mich in derselben Datei bewegen würde.

Auch wenn es eine Lösung dafür gibt, was wäre das Verhalten von git blame auf dem refaktorierten Code? Würde es auf das Refactoring-Commit zeigen oder es ignorieren? Gibt es einen Weg, das später zu erreichen?

Falls jemand interessiert ist, habe ich ein base64-codiertes tar.gz des (sehr minimalen) Repositorys, das ich zum Testen verwende, [a href="http://pastebin.com/raw.php?i= EwZtQf7R "> auf Pastebin

Mögliche Lösungen

Eine mögliche Lösung könnte die Zusammenführung sein, indem ein (automatisch) bearbeiteter Patch mit den Änderungen in der vorstrukturierten Verzweigung angewendet wird. Ist dafür Software entwickelt worden? Mit diesem Ansatz denke ich, dass, da dies für Git transparent ist, git blame auf das Refactoring-Commit zeigen würde.

Ich habe gefunden dieselbe Frage, angewandt auf diff . Eine vorhandene nicht proprietäre Implementierung wird nicht erwähnt, aber es wird ein Algorithmus erwähnt, der die Blockbewegung verfolgt.

    
goncalopp 12.12.2013, 10:31
quelle

2 Antworten

1

Leider kann ich die eingebauten Git-Merge-Strategien nicht ersetzen, soweit ich das beurteilen kann. Dies bedeutet, dass Sie die Konflikte nicht stoppen können, jedoch können Sie ein intelligentes Werkzeug verwenden, um sie zu lösen.

Dieser Semantic Merge sieht interessant aus, es kann auch von Git verwendet

    
abasterfield 17.12.2013 17:13
quelle
0

Es ist nicht möglich, diesen zusätzlichen Aufwand zu vermeiden, aber dann sollte Git auch funktionieren:

  

Die andere grundlegend kluge Designentscheidung ist, wie Git verschmilzt.   Die Merging-Algorithmen sind intelligent, aber sie versuchen nicht, zu schlau zu sein.   Eindeutige Entscheidungen werden automatisch getroffen, wenn Zweifel bestehen   Es liegt am Benutzer zu entscheiden. So sollte es sein. Du nicht   Ich möchte, dass eine Maschine diese Entscheidungen für Sie trifft. Du wirst es nie wollen.   Das ist die grundlegende Erkenntnis des Git-Ansatzes zum Zusammenführen: while   Jedes andere Versionskontrollsystem versucht intelligenter zu werden, Git ist es   glücklich beschrieben als der "dumme Inhaltsmanager", und es ist   besser dafür.

(Aus Wincent Colaiutas Blog )

>     
aronisstav 13.05.2014 11:43
quelle