89 Stimmen

git merge: Ich entferne Dateien, die ich behalten will!

Wie können Sie zwei Zweige in Git zusammenführen, ohne dass erforderlich Dateien aus einer Verzweigung?

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

Zum Beispiel:

  • Eine Datei ist im Master vorhanden, wenn Sie einen neuen Zweig erstellen
  • Sie entfernen die Datei aus dem Master, da wir sie (noch) nicht benötigen.
  • Sie nehmen Änderungen an der Verzweigung vor, um eine Funktion hinzuzufügen, die sich auf die vorhandene Datei stützt
  • Sie nehmen Fehlerbehebungen im Master vor (kann nicht weggeworfen werden)
  • Sie fusionieren eines Tages, und die Datei ist weg!

Wie man sich fortpflanzt:

  1. Erstellen Sie ein Git Repo mit einer Datei.

    git init
    echo "test" > test.txt
    git add .
    git commit -m "initial commit"
  2. Eine Verzweigung erstellen

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

    git rm test.txt
    git commit -m "removed file from master"
  4. Jegliche Änderungen in ZweigA vornehmen, 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 an wird die Datei test.txt bei jeder Möglichkeit, die ich gefunden habe, um diese beiden Zweige zusammenzuführen, gelöscht. Angenommen, wir würden die sich auf die Datei pour branchA ist dies ein großes Problem.


Fehlende Beispiele:

Verschmelzen 1

git checkout branchA
git merge master
ls test.txt

Verschmelzen 2

git checkout master
git merge branchA
ls test.txt

Rebase 1

git checkout branchA
git rebase master
ls test.txt

0 Stimmen

Ich glaube, dass Sie dieses Problem lösen können, indem Sie ZweigA (solange er nicht öffentlich ist) vor dem Zusammenführen von der letzten Master-Version umbasen. Ein interaktives Rebase gibt Ihnen die Möglichkeit, Git mitzuteilen, dass Sie die Datei unbedingt haben wollen, dann sollte das Zusammenführen ohne Probleme vonstatten gehen.

36voto

cmcginty Punkte 106764

Dies ist ein interessantes Thema. Weil Sie die Datei gelöscht haben, nachdem BranchA erstellt wurde, und dann zusammengeführt werden master en BranchA Ich bin mir nicht sicher, wie Git erkennen kann, dass es einen Konflikt gibt.

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

git checkout HEAD@{1} .
git merge --no-commit master
git checkout master test.txt
git add test.txt
git commit

9voto

Alex Dean Punkte 14925

Casey Beispiel hat in meinem Fall nicht funktioniert - ich konnte nicht auschecken test.txt von master weil er nicht mehr in dieser Branche tätig 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 der branchA eigene HEAD :

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

6voto

Phil Punkte 4557

Für eine schnelle Lösung in diesem Fall, "git revert" den Commit, der die Datei gelöscht hat.

Wenn diese Situation in Zukunft eintritt, ist es besser, dafür zu sorgen, dass die neue Datei auf dem Zweig erstellt wird. Dann wird sie beim Zusammenführen zum Master hinzugefügt, aber die Datei liegt in der Zwischenzeit nicht im Master herum.

5voto

Alex S Punkte 23971

Meine Lösung bestand darin, einfach die Dateien zu ändern, die ich behalten wollte (ich fügte einen Kommentar hinzu, der ohnehin benötigt wurde) und diese Änderungen auf dem Zielzweig zu übertragen, wodurch ein Zusammenführungskonflikt entstand, der leicht mit einem git add und eine normale Übergabe.

Meine Geschichte verlief in etwa so. Die Namen der Zweige wurden zum Schutz der Unschuldigen geändert.

  1. Erstellen und Übertragen von Dateien für eine neue Funktion an Master
  2. erkennen, dass dieser Zusatz aufwändiger wird als ursprünglich geplant, daher zu feature_branch verzweigt
  3. Dateien aus dem Master entfernt, um den normalen Arbeitsablauf mit RBs und dergleichen nicht zu stören
  4. Zeit vergeht, weitere Übertragungen auf master, keine auf feature_branch
  5. Nehmen Sie die Arbeit an dem Feature wieder auf, git merge master auf feature_branch bewirkt, dass die Originaldateien entfernt werden (natürlich), git reset --hard vor der Zusammenführung
  6. Anwendung der oben beschriebenen Lösung

2voto

Chris Dodd Punkte 2886

Sie müssen die Datei in der Verzweigung ändern, so dass ein Zusammenführungskonflikt mit dem Löschen im Stamm besteht.

Genau dasselbe wird passieren, wenn Sie zum Beispiel eine Deklaration für etwas in einer Headerdatei im Stamm löschen (weil sie nicht benötigt wird) und eine Abhängigkeit von dieser Deklaration zu einer oder mehreren Nicht-Headerdateien im Zweig hinzufügen. Wenn Sie zusammenführen, wird der Zweig die Deklaration einfach löschen, da der Zweig den Header (oder einen Teil davon) nicht berührt, und alles wird kaputt gehen.

Wenn man an mehreren Stellen Dinge hat, die voneinander abhängig sind und synchron gehalten werden müssen, kann eine Zusammenführung sehr leicht unbemerkt Probleme verursachen. Das ist nur eines der Dinge, die Sie wissen und überprüfen müssen, wenn Sie zusammenführen. Idealerweise verwendet man Kompilierzeit-Asserts oder andere Build-Time-Checks, die jeden Fehler sofort sichtbar machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X