Git ignoriert gelöschte Dateien bei der Zusammenführung

8

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:

%Vor%

Fügen Sie other zu main als Remote hinzu.

%Vor%

Verschmelzen Sie den Inhalt.

%Vor%

Es fügt die Dateien korrekt hinzu. Entferne nun eine Datei in other .

%Vor%

Änderungen in main zusammenführen.

%Vor%

Nach der Zusammenführung git status sagt:

%Vor%

Ich würde erwarten, dass die Zusammenführung two löscht, da sie in other gelöscht wurde. Was mache ich falsch?

    
Gergo Erdosi 15.01.2013, 17:50
quelle

1 Antwort

6

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".

    
Borealid 15.01.2013, 17:54
quelle

Tags und Links