it-swarm.com.de

git merge: Dateien entfernen, die ich behalten möchte!

Wie können zwei Zweige in git zusammengeführt werden, wobei needed -Dateien eines Zweiges erhalten bleiben?

Wenn beim Zusammenfügen zweier Zweige eine Datei in einem Zweig und nicht in einem anderen Zweig gelöscht wurde, wird die Datei letztendlich gelöscht.

Zum Beispiel:

  • Eine Datei ist im Master vorhanden, wenn Sie eine neue Verzweigung erstellen
  • sie entfernen die Datei vom Master, da wir sie (noch) nicht benötigen
  • sie nehmen Änderungen in der Verzweigung vor, um ein Feature hinzuzufügen, , das auf der vorhandenen Datei basiert.
  • Du machst Fehler in Master (kann nicht verworfen werden)
  • sie verschmelzen eines Tages und die Datei ist weg!

Wie zu reproduzieren:

  1. Erstellen Sie ein Git-Repo mit einer Datei.

    git init
    echo "test" > test.txt
    git add .
    git commit -m "initial commit"
    
  2. Erstellen Sie einen Zweig

    git branch branchA
    
  3. Löschen Sie die Datei im Master

    git rm test.txt
    git commit -m "removed file from master"
    
  4. Nehmen Sie ALLE Änderungen in branchA vor, die die gelöschte Datei nicht berühren (sie muss unverändert bleiben, um Konflikte zu vermeiden).

    git checkout branchA
    touch something.txt
    git add .
    git commit -m "some branch changes"
    

Von hier aus kann die test.txt-Datei auf beliebige Weise zum Zusammenführen dieser beiden Zweige gelöscht werden. Wenn wir davon ausgehen, dass wir auf branchA auf die Datei angewiesen sind, ist dies ein großes Problem.


Fehlgeschlagene Beispiele:

Zusammenführen 1

git checkout branchA
git merge master
ls test.txt

Zusammenführen 2

git checkout master
git merge branchA
ls test.txt

Neubasis 1

git checkout branchA
git rebase master
ls test.txt
49
drfloob

Dies ist ein interessantes Thema. Da Sie die Datei nach der Erstellung von BranchA gelöscht haben und anschließend master in BranchA zusammenführen, bin ich mir nicht sicher, wie Git erkennen könnte, dass ein Konflikt vorliegt.

Nach der fehlerhaften Zusammenführung können Sie den Vorgang rückgängig machen und dann erneut zusammenführen, die Datei jedoch wieder hinzufügen:

git checkout [email protected]{1} .
git merge --no-commit master
git checkout master test.txt
git add test.txt
git commit
27
cmcginty

Für eine schnelle Lösung in diesem Fall "git revert" das Commit, mit dem die Datei gelöscht wurde.

Wenn diese Situation in der Zukunft auftritt, ist der beste Weg, um damit umzugehen, indem sichergestellt wird, dass die neue Datei auf dem Zweig erstellt wird. Dann wird es beim Zusammenfügen auf master hinzugefügt, aber Sie haben die Datei in der Zwischenzeit nicht im master herumliegen.

6
Phil

Casey 's Beispiel funktionierte in meinem Fall nicht - ich konnte test.txt nicht von master auschecken, da es nicht mehr in diesem Zweig war

$ git checkout master test.txt
error: pathspec 'test.txt' did not match any file(s) known to git.

Glücklicherweise konnte ich die Datei aus branchAs eigenen HEAD ziehen:

$ git checkout branchA
$ git merge --no-commit master
$ git checkout HEAD test.txt
$ git add test.txt
$ git commit
4
Alex Dean

Sie müssen die Datei in der Verzweigung ändern, sodass ein Konflikt mit der Löschung im Trunk auftritt.

Das Gleiche wird passieren, wenn Sie beispielsweise eine Deklaration für etwas in einer Header-Datei im Trunk löschen (da dies nicht erforderlich ist) und eine Abhängigkeit von dieser Deklaration zu einigen Nicht-Header-Dateien im Zweig hinzufügen. Beim Zusammenführen wird die Deklaration gelöscht, da der Zweig die Kopfzeile nicht berührt (dh diesen Teil der Komponente), und die Dinge werden beschädigt.

Immer, wenn Sie an mehreren Stellen Sachen haben, die voneinander abhängig sind und synchron gehalten werden müssen, ist es sehr einfach für eine Fusion, Probleme in den Hintergrund zu stellen. Dies ist nur eines der Dinge, die Sie beim Zusammenführen kennen und prüfen sollten. Im Idealfall verwenden Sie Kompilierungsassertierungen oder andere Build-Time-Prüfungen, die Fehler sofort sichtbar machen.

2
Chris Dodd

Meine Lösung für dieses Problem bestand darin, die Dateien, die ich behalten wollte, einfach zu ändern (einen ohnehin benötigten Kommentar hinzuzufügen) und diese Änderungen auf dem Zielzweig festzuschreiben, wodurch ein Zusammenführungskonflikt erzeugt wurde, der leicht mit einem git add und einem normalen Commit gelöst werden konnte.

Meine Geschichte ging in etwa so weiter. Zweignamen wurden geändert, um die Unschuldigen zu schützen.

  1. erstellen und Festschreiben von Dateien für eine neue Funktion zum Master
  2. beachten Sie, dass dieser Zusatz mehr involviert sein wird als ursprünglich geplant, also zu feature_branch verzweigt
  3. Dateien vom Master entfernt, um den normalen Arbeitsablauf mit RBs und dergleichen nicht zu stören
  4. Die Zeit vergeht, mehr Commits für Master, keine für feature_branch
  5. Die Arbeit an der Funktion fortsetzen, git merge master an feature_branch bewirkt, dass die Originaldateien (natürlich), git reset --hard vor der Zusammenführung entfernt werden
  6. Die oben beschriebene Lösung wurde angewendet
1
Alex S