Git: Checkout in anderen Branch ohne gepushte Änderungen zu übernehmen



  • Hallo zusammen,

    ich ärger mich grade etwas über Git. Vlt kann mir ja einer von euch da weiterhelfen.

    Die Situation:
    Ich habe zwei Branches (Sagen wir, Master und Branch1). Ich habe den Master geklont, dann Branch1 angelegt und den Branch dann auf Remote gepusht, so dass beide auf dem Sever (gitlab) liegen. Jetzt habe ich an Branch1 gearbeitet und diverse Änderungen vorgenommen und Dateien hinzugefügt. Die Sachen sind comitted und gepusht.
    Mir ist jetzt an anderer Stelle ein Problem aufgefallen, dass ich im Master beheben wollte (hat nichts mit meinem Branch1 zu tun). Also habe ich mit Checkout den Branch gewechselt.

    Das Problem:
    Jetzt übernimmt Git ja lokale Änderungen bei einem Checkout soweit wie möglich mit den anderen Branch. Aber offensichtlich nicht neu hinzugefügte Dateien, die im anderen Branch noch nicht im Index sind. Folglich lässt sich mein Master Branch nicht mehr kompilieren, denn die include Zeilen wurden übernommen, die Dateien die dazugehören aber nicht.

    Gibt es dazu eine elegante Lösung? Kann man bei einem Checkout angeben, dass Änderungen nicht mitgenommen werden sollen?
    Ich könnte natürlich mit einem cherry-pick die Dateien rüber holen, aber eigentlich ist das ja nicht Sinn der Sache.


  • Mod

    edit: Hier stand etwas, gegen das git Sicherungsmaßnahmen hat und daher unmöglich ist. Stattdessen die Gegenfrage: Benutzt du irgendeine Oberfläche über reinem git, die versucht besonders schlau zu sein und das beschriebene Verhalten auslöst? Denn eigentlich sollte es nicht so sein.



  • Ich benutze Tortoise Git.

    Was sollte genau nicht sein? Das Änderungen mitgenommen werden?

    git checkout <branch>

    To prepare for working on <branch>, switch to it by updating the index and the files in the working tree, and by pointing HEAD at the branch. Local modifications to the files in the working tree are kept, so that they can be committed to the <branch>.

    Quelle: https://git-scm.com/docs/git-checkout#git-checkout-emgitcheckoutemltbranchgt

    Das verstehe ich so, dass die Änderungen an den Dateien beibehalten werden.

    Beim Wechsel zu einem anderen Branch übernimmt git checkout Änderungen an Working Tree und Index soweit möglich mit in den Ziel-Branch. Dazu wird ein Patch erstellt und versucht, diesen auf dem Ziel-Branch anzuwenden. Dieses Verhalten ist nützlich um die Arbeit an einer im aktuellen Branch begonnenen Änderung in einem neuen Branch fortzusetzen

    Quelle: https://www.ralfebert.de/git/stash/

    Hier wird das Verhalten auch beschrieben.



  • Ich denke die Unklarheit ist im Bezug auf die fehlenden Dateien. Git löscht beim Wechsel des Branches keine Dateien die nicht in der Versionsverwaltung sind. Wenn du natürlich in deinen aktuellen Änderungen Dateien referenzierst, die es nur in den aktuellen Branch gibt, kann dir Git nicht helfen, weil es diese Referenzen nicht kennt.

    Das was du suchst hast du aber auch schon selber verlinkt: git stash. Speichert deine Änderungen und resettet deine working copy. Danach kannst du ohne Änderungen den Branch wechseln. Wenn du wieder zurück bist kannst du deine Änderungen wieder holen. Ansonsten geht auch einfach temporär committen (nicht pushen) und dann später per --amend einen vernünftigen Commit draus machen.



  • Dank für die Hilfe. Funktioniert 👍


Log in to reply