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.

2voto

hygtfrde Punkte 11

Dasselbe Problem mit git. Ich habe an einem Feature in einem Zweig gearbeitet, dann hat mein Job beschlossen, das Feature auf später zu verschieben. Daher wurden die relevanten Funktionsdateien aus dem Master-Zweig gelöscht, um die Bereitstellung der Anwendung ohne unnötige Dateien zu ermöglichen ... vorerst. Jetzt muss ich die alte Funktion fertigstellen, und wenn ich versuche, den alten Zweig in den aktuellen Master-Zweig einzubinden, werden die Dateien, die ich brauche, gelöscht.

Die schnelle Lösung ist: Ändern Sie die Dateien, die Sie in Ihrem Funktionszweig behalten wollen, fügen Sie sie hinzu und übertragen Sie sie, und führen Sie sie dann mit Ihrem Master zusammen. Dies wird nun einen Zusammenführungskonflikt verursachen, im Gegensatz zum Löschmodus beim Zusammenführen. Jetzt können Sie "unsere" Änderungen an den Dateien beibehalten.

Das Problem ist, dass Git das Löschen einer Datei im HEAD als nicht geändert ansieht und standardmäßig in den Löschmodus wechselt. Genauer gesagt: deleted in master and modified in HEAD wird ausgegeben, nachdem Sie die benötigten Dateien geändert haben.

Reproduzieren Sie die Lösung:

  1. Zurücksetzen eines Zweigs auf die ältere Version mit gelöschten Dateien: git reset --hard origin/old_branch
  2. Ändern Sie die Dateien, die Sie behalten wollen. Lassen Sie sie nicht unverändert.
  3. Führen Sie Ihren aktuellen Master in den Funktionszweig ein: git merge master

Automatisches Zusammenführen fehlgeschlagen; beheben Sie Konflikte und übertragen Sie dann das Ergebnis.

  1. Behalten Sie "unsere" Änderungen bei, wenn Sie Konflikte beheben.
  2. git add . y git commit -m "fix deleted HEAD"
  3. Beenden Sie die Zusammenführung: git merge master

1voto

Cloud Cho Punkte 1242

Anstatt das Zusammenführen rückgängig zu machen, könnten Sie die Datei(en) von kurz vor der Übergabe in den aktuellen zusammengeführten Zweig auschecken ( Benutzer Todd Vorschlag der Kommission):

  git checkout <commit hash or branch name> -- path/to/file

Zum Beispiel,

  git checkout 08ac9cf08f -- classify.cpp

und dann können Sie Ihren Zweig veröffentlichen.

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