Ich habe zwei Repositories. Von Zeit zu Zeit möchte ich den Inhalt von other
in main
zusammenführen. Die Zusammenführung ignoriert jedoch gelöschte Dateien. Lassen Sie mich das anhand eines Beispiels erklären:
Fügen Sie other
zu main
als Remote hinzu.
Verschmelzen Sie den Inhalt.
%Vor% Es fügt die Dateien korrekt hinzu. Entferne nun eine Datei in other
.
Änderungen in main
zusammenführen.
Nach der Zusammenführung git status
sagt:
Ich würde erwarten, dass die Zusammenführung two
löscht, da sie in other
gelöscht wurde. Was mache ich falsch?
Das Problem hier ist die Verwendung von Squash-Commits.
Wenn Sie merge --squash
ausführen, geben Sie den gesamten Verlauf einer Verzweigung auf. Sie haben den Zweig nicht wirklich zusammengeführt - Sie haben gerade eine verkürzte Darstellung seiner Geschichte angewendet. Wenn Sie also ein späteres merge --squash
ausführen, wird git die alle die Commits in der Zweighistorie erneut anwenden (da die beiden Zweige keinen gemeinsamen Vorgänger haben).
Wenn Sie das erste merge --squash
ausführen, erstellen Sie ein Commit für main
, das "Create one, two und three" enthält. Also ist die Geschichte von main
zuerst "create four", dann "create one, two und three".
Wenn Sie das zweite merge --squash
machen, fügen Sie ein Commit hinzu, das (in Wirklichkeit) "Create one, two und three" plus "Remove two" enthält. Das Netz dieser beiden Commits zusammen (gequetscht!) Ist "Create one and three". Das heißt, git führt das Commit für "Ein und Drei erstellen" automatisch mit dem aktuellen Repo-Status zusammen, so dass vier Dateien vorhanden sind. Die Inhaltszusammenführung ist automatisch erfolgreich, da die Dateien "Eins" und "Drei" auf beiden Seiten identisch sind.
Sie sollten "echte" Merges oder Cherry-Picking anstelle von Squash verwenden, wenn Sie ein Repo mit einer Fernbedienung auf dem neuesten Stand halten wollen. A merge --squash
ist nicht dasselbe wie "spiele alle neuen Commits in einem Remote-Repository ab und integriere sie hier".
Tags und Links git