Git – Wie wendet man selektiv Änderungen von einem Zweig auf einen anderen an?

Lesezeit: 6 Minuten

Ist es möglich, mit Git selektiv Änderungen von einem Branch auf einen anderen anzuwenden?

Genauer gesagt verwende ich ein öffentliches dev Branch für GitHub und eine private master Zweig für die Bereitstellung. Wenn Änderungen an einem Zweig vorgenommen werden, müssen sie auf den anderen angewendet werden, aber einige Codezeilen müssen unterschiedlich bleiben. In meinem Fall sind es ein paar CSS-Klassen und ein Feed.

Ich bin neu bei Git, aber ich habe meine Nachforschungen angestellt:

  • git merge --no-commit --no-ff kann verwendet werden, gefolgt von a git mergetool zu wählen, was ich im Falle eines Konflikts will. Das Problem ist, dass es nur für Konflikte funktioniert, die Git nicht automatisch zusammenführen kann. Was ich also anders halten möchte, wird ersetzt, bevor ich die Möglichkeit bekomme, mein Mergetool zu verwenden.

  • git difftool --cached ist nützlich, da ich die Unterschiede sehen kann, aber ich muss kopieren, was ich von dort behalten möchte, und es manuell durch einen Texteditor ersetzen, da ich nicht einfach auswählen und speichern kann, wie ich es mit Mergetool kann.

  • git cherry-pick scheint ein bestimmtes Commit auf ein anderes anzuwenden, aber was ich anders halten möchte, kann auf verschiedene Commits verstreut sein, und diese Commits können nicht nur das enthalten, was ich anders halten möchte. Ich kann mir nicht vorstellen, dass das funktioniert, es sei denn, ich mache Millionen von Commits, die mich verrückt machen würden.

Auch um klar zu sein, Ich möchte nicht, dass ein Zweig zu einem anderen wirdwas bei einer Verschmelzung der Fall zu sein scheint. Ich möchte zwei separate Zweige mit ihren jeweiligen Unterschieden und Änderungen von einem zum anderen anwenden.

Gibt es einen besseren Workflow, der es mir ermöglichen würde, eine Entwicklungs- und eine Bereitstellungsversion beizubehalten, indem ich ihre Änderungen übernehme und einige Unterschiede beibehalte? Es macht mir nichts aus, separate Repositorys oder verschiedene Tools zu verwenden, wenn dies zu einer Lösung führt.

  • Im Wesentlichen benötigen Sie also manchmal nur einen Teil des Commit, was von einigen Zeilen in einer einzelnen Datei bis zu einigen wenigen Dateien aus vielen in einem Commit reichen kann?

    – Nikhil Gupta

    13. März 2014 um 4:24 Uhr

  • Ich muss beim Zusammenführen ein paar Codezeilen unterschiedlich halten, zum Beispiel einen weißen Hintergrund in einem Zweig und einen schwarzen Hintergrund im anderen. Möglicherweise gibt es andere Änderungen in derselben Datei, die ich zusammenführen möchte, sodass Dateiausschlüsse nicht alle Situationen lösen würden.

    – Tukanb

    13. März 2014 um 4:33 Uhr

  • Mögliches Duplikat von Wie führen Sie ausgewählte Dateien mit Git-Merge zusammen?

    – Inigo

    30. April 2018 um 21:03 Uhr

Benutzer-Avatar
toucanb

Ich habe auch etwas über das Patchen herausgefunden:

So erstellen Sie den Patch: git diff dev > master.patch

Um es anzuwenden: patch < master.patch

  • Danke – positiv bewertet! Aber eine Anmerkung – weil mein git ist so konfiguriert, dass die wegwerfbaren imaginären Verzeichnisnamen abgelegt werden a/ und b/ In meinem Diff ist der zweite Befehl für mich etwas anders: patch -p1 < master.patch

    – Brandon Rhodes

    26. März 2015 um 16:14 Uhr


Profitieren Sie von der Tatsache, dass das Erstellen von Git-Branches kostengünstig ist und keine Auswirkungen auf den tatsächlichen Inhalt des Arbeitsverzeichnisses haben muss.

  1. Überprüfen Sie Ihren Quellzweig dev.
  2. Erstellen Sie einen temporären Zweig. Es wird auf das gleiche Commit verweisen dev tut: checkout -b for_master

    Vermutlich wissen Sie (oder können leicht herausfinden), welche Commit vor dem dev Filiale ist die letzte Vor die Änderungen, die Sie (teilweise) wünschen. Nehmen wir in diesem Beispiel an, dass dieser Commit den Hash hat 1457B4 (‘zuletzt vor’, verstanden?).

  3. Setze Dein __ zurück for_master zu diesem Commit verzweigen: git reset 1457B4. (Tun nicht benutze die --hard Schalter!)

    Jetzt haben Sie ein Arbeitsverzeichnis, das alle darin enthaltenen Änderungen enthält devaber aus dem POV der for_master -Zweig sind diese Änderungen nicht bereitgestellt und nicht festgeschrieben (während die dev branch zeigt immer noch auf Commits, die alle Änderungen aufzeichnen, sodass die Arbeit immer noch sicher ist).

  4. Interaktives Staging verwenden (git add -p und/oder git add -e), erstellen Sie einen Commit (oder mehr als einen, wenn Sie möchten), der alle enthält, und nurdie Änderungen, die Sie auf Ihre anwenden möchten master Zweig.

    Notieren Sie sich den Hash des letzten Commits (oder geben Sie ihm ein Tag). In diesem Beispiel sage ich, dass sein Hash ist C0DA.

  5. Kasse master.

  6. Wählen Sie die Commit(s), die Sie gerade gemacht haben, aus: git cherry-pick 1457B4..C0DA.

    (Beachten Sie, dass das Rosinenpicken eines Bereichs erst nach Git-Version 1.7.2 verfügbar ist. Andernfalls müssen Sie alle Commits, die Sie in Schritt 4 vorgenommen haben, einzeln aussuchen.)

    (Ebenfalls Beachten Sie, dass bei der Rosinenauswahl eines Bereichs der Beginn des Bereichs der Commit ist Vor der erste, der tatsächlich gepflückt wird.)

Dieser Prozess ist eine Art Umkehrung der Verwendung git checkout -p wie in der ausgewählten Antwort erwähnt. Es könnte für die Erstellung nützlich sein cherry-pick-fähige Commits zwischen zwei Zweigen, die einen Teil des Codes teilen, aber auch viele Unterschiede aufweisen (z. B. zwischen zwei Hauptversionen eines Projekts), und Sie möchten nicht viel Zeit damit verbringen müssen, irrelevante Dateien in einem Aufruf zu ignorieren git checkout -p.

Persönlich fand ich es praktisch, zwei verschiedene Worktree-Verzeichnisse für dasselbe Repository zu verwenden (eines für den Quellzweig und eines für das Ziel) und zwischen zwei Befehlsshells zu wechseln, von denen eine das Quellzweigverzeichnis (Worktree) und die andere verwendet Ziel. Aber wenn Sie sich nicht wohl fühlen git worktree Funktion, die möglicherweise nichts für Sie ist.

  • Hervorragende Technik. Hat mir geholfen, eine Reihe von einzelnen, klar umrissenen PRs aus ein paar Wochen chaotischer Commits neu zu ordnen, die mehrere Funktionen in einem einzigen Zweig abdecken (Schande über mich – wäre ein Albtraum gewesen, sie zu überprüfen!). Vielen Dank!

    – Matt Wanchap

    2. März 2021 um 0:42 Uhr


Benutzer-Avatar
Nikhil Gupta

Ich glaube nicht, dass es eine Möglichkeit gibt, Teile eines Commit aus derselben Datei auszuwählen. Ich würde sagen, Sie müssen Ihren Code einfach umgestalten, um solche Teile in andere Dateien zu verschieben.

Übrigens, wenn Sie einige Dateien aus einem Commit nehmen möchten, können Sie Cherry-Pick mit einer Kombination anderer Befehle verwenden, wie hier erklärt.

  • Tun git checkout -p branchname Wie in Ihrem Link erklärt, hat es funktioniert! Dadurch kann ich selektive Änderungen interaktiv aus dem anderen Zweig abrufen, ohne sie zusammenzuführen. Cherry-Pick könnte auch funktionieren, bekommt aber nur Änderungen pro Commits.

    – Tukanb

    13. März 2014 um 20:19 Uhr

  • :/ Es gibt offensichtlich einen Weg – es ist vielleicht nicht einfach.

    – z. Hd. rechts

    22. Mai 2020 um 13:40 Uhr

1092750cookie-checkGit – Wie wendet man selektiv Änderungen von einem Zweig auf einen anderen an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy