Ich möchte noch eine weitere Frage ausweiten: Merge zwei Git-Repositories und behalten Sie den Master-Verlauf
Es ist mir gelungen, zwei verschiedene Repos zu einem Repo zusammenzufassen. Ich brauchte eine Rebase, um dies erfolgreich zu machen. Der Master ist korrekt, aber Ich möchte auch den Merge-Verlauf beibehalten . Ist das möglich?
Ich habe 2 Repositories:
Dies ist das Ergebnis nach der Umbasierung. Die Zeiten des obersten Repo sind die Rebase-Zeit. Das ursprüngliche Datum ist verloren!
So habe ich es gemacht:
%Vor%Ist es möglich, so etwas zu haben? ( gemalte Lösung !!! )
Ich möchte die ursprüngliche Zeit + die Zusammenführungsgeschichte behalten.
UPDATE - ANTWORT
Die Antwort, die am besten für mich funktioniert hat, war die Arbeit mit den Graft-Punkten. Aber andere Antworten sind auch in anderen Anwendungsfällen sehr brauchbar. Ich habe meine Ergebnisse auf GitHub hinzugefügt, so dass jeder bewerten kann.
Antwort 1: Am besten funktioniert es in meinem Fall Das 'Graft' hat mir die richtige Antwort gegeben.
Antwort 2 Die Option "Ersetzen" von "LeGEC" liefert auch für einige Anwendungsfälle gute Ergebnisse. Eine Anomalie blieb für mich:
Antwort 3: Sinnvoll hinzufügen Die Antwort von 'VonC'. Ich konnte die Option "Preserve-merges working" in meinem Fall nicht erhalten. Dies könnte in anderen Szenarien funktionieren, aber ich habe diesen Treiber nicht getestet.
Wie Sie herausgefunden haben, ist rebase
nicht der Befehl, den Sie zum Zusammenfügen von Historien verwenden möchten (weil er den Verlauf tatsächlich neu schreibt). Frühe Git hatte ein Feature (Hack) speziell für das, was Sie versuchen zu tun: Graft-Punkte . Noch besser, seit 1.6.5 können Sie git replace --graft
stattdessen verwenden:
( git log RepoA/master --format=%H | tail -1
gibt das initiale Commit von RepoA
zurück)
Technisch könnten Sie den ersten replace
überspringen, wenn Sie noch nichts Wertvolles in master
haben, was nur einen Verlauf mit RepoB + RepoA ergibt.
Diese Befehle erstellen Einträge in refs/replace/*
, die verschoben und verschoben werden können, um Ihren überarbeiteten Verlauf mit anderen zu teilen. Oder, wenn Sie nicht daran interessiert sind, die SHAs von RepoA / RepoB zu erhalten, können Sie die Ersetzungen permanent machen, indem Sie git filter-branch --all
ausführen, um eine "echte" Menge von Commits der gewünschten Herkunft zu erzeugen / p>
Es gibt zwei Optionen in git rebase, die in Ihrem Fall von Interesse sein könnten:
%Vor%%Vor%Erstellen Sie Merge-Commits neu, anstatt den Verlauf durch Wiederholen von Commits, die ein Merge-Commit einführt, zu reduzieren.
(aus git am
)
Standardmäßig zeichnet der Befehl das Datum aus der E-Mail-Nachricht als das Autorisierungsdatum des Commits auf und verwendet den Zeitpunkt der Erstellung des Commits als Committer-Datum. Dadurch kann der Benutzer über das Committer-Datum lügen, indem er denselben Wert wie das Autorendatum verwendet.
Testen Sie, ob die zweite Rebase mit:
kein besseres Ergebnis liefert %Vor% Diese Antwort schlägt eine andere Möglichkeit vor, RepoB
als aktiven Repo zu verwenden und trotzdem Zugriff auf RepoA
history:
verwende git replace
Hinweis: Diese Operation wird auf Ihrem Computer ausgeführt, nicht auf den Remote-Repositories. Sie sollte daher bei allen neuen Clones wiederholt werden.
Variante :
Sie können RepoA:master
auf RepoB
unter einem neuen Namen (z. B. RepoB:history/master
) setzen, dann können Sie git replace abcdef history/master
für Commits verwenden, die alle in RepoB
gespeichert sind.
Versuchen Sie, die folgenden Schritte auszuführen:
Erstellen Sie ein neues leeres Repository New.
Machen Sie eine initiale Festschreibung, weil wir eine benötigen, bevor wir eine Zusammenführung durchführen.
Fügen Sie eine Fernbedienung zum alten Repository OldA hinzu.
Verknüpfen Sie OldA / master mit New / master.
Erstellen Sie ein Unterverzeichnis OldA.
Ein Powershell-Skript für diese Schritte könnte folgendermaßen aussehen:
Nehmen Sie an, dass das aktuelle Verzeichnis das Verzeichnis ist, in dem das neue Repository erstellt werden soll Erstellen Sie das neue Repository
$ git init
Bevor wir eine Zusammenführung durchführen, müssen wir eine initiale Festschreibung haben, also machen wir eine Dummy-Festschreibung
$ dir & gt; delete.txt $ git add.
$ git commit -m "Erstes Dummy-Commit"
Fügen Sie eine Fernbedienung für das alte Repo hinzu und rufen Sie es ab
$ git remote add -f alt_a
Fügen Sie die Dateien von old_a / master in new / master
ein$ git merge old_a / master
Bereinigen Sie unsere Dummy-Datei, weil wir sie nicht mehr brauchen
$ git rm. \ delete.txt
$ git commit -m "Initialdatei bereinigen"
Verschieben Sie die old_a-Repo-Dateien und -Ordner in ein Unterverzeichnis, damit sie nicht mit dem anderen später eintreffenden Repo kollidieren
$ mkdir old_a
$ dir -exclude old_a | % {git mv $ _. Name alt_a}
Übernehmen Sie den Umzug
$ git commit -m "Verschiebe alte Dateien in das Unterverzeichnis"
Machen Sie dasselbe für old_b
$ git remote add -f alt_b
$ git merge old_b / master
$ mkdir old_b
$ dir -exclude alt_a, alt_b | % {git mv $ _. Name alt_b}
$ git commit -m "Verschiebe old_b-Dateien in das Unterverzeichnis"
Bringe einen Feature-Zweig von einem der alten Repos mit $ git checkout -b Funktion läuft
$ git merge -s rekursiv -Xsubtree = alt_a alt_a / feature-in-progress
Ich hoffe, es hilft.
Tags und Links merge git rebase repository