Beim Refactoring von Quellcode müssen Sie manchmal große Textblöcke in eine Datei oder sogar in eine neue Datei verschieben. Sie erstellen einen Zweig refactored
und verpflichten sich:Verweisen von Git auf verschobene Inhalte (nicht einfach verschobene Dateien)
$git checkout master
$git branch refactored
$git checkout refactored
<move code around>
$git commit -m "refactored code"
jedoch Menschen auf dem alten pre-refactor Zweig begehen kann, den Code zu ändern, die verschoben wurde:
$git checkout master
<change code that was moved elsewhere on branch refactored>
$git commit -m "bugfix"
Auf Zweig refactored
, Sie dann wollen Änderungen in master
gemacht zu übernehmen:
$git checkout refactored
$git merge master
<giant merge conflict>
Dies führt zu einem großen merge Konflikt. 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 auch nach dem Konflikt und commiting es zu lösen, git noch nicht die Auflösung weiter verschmilzt, um herauszufinden, verwenden kann:
<fix conflicts>
$git commit -m "merge master into refactored"
$git checkout master
<change more code>
$git commit -m "bugfix2"
$git checkout refactored
$git merge master
<another giant merge conflict>
Ist das überhaupt vermeidbar? Ich habe versucht git rerere
und es 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?
Während dies ist einfach genug für moving the contents of a complete file, konnte ich nicht finden Informationen zum Verschieben nur Teil davon, oder innerhalb der gleichen Datei verschieben.
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ätere zu erreichen?
Falls jemand interessiert, ich habe eine Base64-codierte tar.gz des (sehr minimal) Repository habe ich mich für Tests mit on pastebin
Möglichen Lösungen
Eine mögliche Lösung durchführen könnte die Zusammenführen durch Anwenden eines (automatisch) bearbeiteten Patches mit den Änderungen im vorrefaktorierten Zweig. Ist dafür Software entwickelt worden? Mit diesem Ansatz denke ich, dass git blame
auf das Refactoring-Commit verweisen würde, da dies für git transparent ist.
Ich habe the same question, applied to diff gefunden. Es gibt keine Erwähnung zu einer bestehenden nicht-proprietären Implementierung, aber dort zu einem Algorithmus, der Blockbewegung verfolgt
Ich schlage vor, Sie mehr begehen zu machen. Wenn Sie eine Menge Daten ändern, haben Sie mehr Commit, die Sie haben, weniger Problem beim Zusammenführen des Codes. – sensorario
@sensorario das ist ein guter Vorschlag im Allgemeinen. Ich bin nicht sicher, wie Sie es für das Refactoring anwenden würden, obwohl - das Verschieben einer Funktion/kleine Blöcke auf einmal nicht helfen wird – goncalopp
Wenn Sie Dateien ändern, haben Sie zwei verschiedene Inhalte. Ja, auch wenn Sie eine Funktion von einer Datei in eine andere verschieben. Wenn Sie Konflikte minimieren möchten, machen Sie mehr und mehr Commits. Bitte versuche. – sensorario