1812 Stimmen

Wie kann ich in Git selektiv Änderungen aus einem anderen Zweig zusammenführen oder auswählen?

Ich verwende Git für ein neues Projekt, das zwei parallele - aber derzeit experimentelle - Entwicklungszweige hat:

  • master Import der bestehenden Codebasis plus einige Änderungen, bei denen ich mir im Allgemeinen sicher bin
  • exp1 : Versuchszweig #1
  • exp2 : Versuchszweig #2

exp1 y exp2 stehen für zwei sehr unterschiedliche Architekturansätze. Solange ich nicht weitergekommen bin, kann ich nicht wissen, welcher Ansatz (wenn überhaupt) funktionieren wird. Wenn ich in einem Zweig Fortschritte mache, habe ich manchmal Bearbeitungen, die im anderen Zweig nützlich wären, und möchte genau diese zusammenführen.

Was ist der beste Weg, um selektive Änderungen von einem Entwicklungszweig in einen anderen zusammenzuführen und dabei alles andere zurückzulassen?

Ansätze, die ich in Betracht gezogen habe:

  1. git merge --no-commit gefolgt von der manuellen Freigabe einer großen Anzahl von Bearbeitungen, die ich nicht zwischen den Zweigen austauschen möchte.

  2. Manuelles Kopieren von gemeinsamen Dateien in ein temporäres Verzeichnis, gefolgt von git checkout um in den anderen Zweig zu wechseln und dann mehr manuelles Kopieren aus dem temporären Verzeichnis in den Arbeitsbaum.

  3. Eine Abwandlung des obigen Beispiels. Verzichten Sie auf die exp Zweigen und verwenden Sie zwei zusätzliche lokale Repositories für Experimente. Dies macht das manuelle Kopieren von Dateien viel einfacher.

Alle drei Ansätze erscheinen mühsam und fehleranfällig. Ich hoffe, dass es einen besseren Ansatz gibt; so etwas wie einen Filterpfad-Parameter, der die git-merge wählerischer.

10voto

Felipe Punkte 16402

Es ist nicht genau das, wonach Sie gesucht haben, aber es war nützlich für mich:

git checkout -p <branch> -- <paths> ...

Es ist eine Mischung aus einigen Antworten.

7voto

Wade Punkte 3427

Ich mag die vorherige git-interactive-merge', aber es gibt eine einfachere Lösung. Lassen Sie Git dies für Sie tun, indem Sie eine Rebase-Kombination aus interactive und onto verwenden:

      A---C1---o---C2---o---o feature
     /
----o---o---o---o master

Es ist also der Fall, dass Sie C1 und C2 aus dem "Feature"-Zweig (Verzweigungspunkt "A") haben wollen, aber vorerst nichts vom Rest.

# git branch temp feature
# git checkout master
# git rebase -i --onto HEAD A temp

Wie in der vorherigen Antwort gelangen Sie in den interaktiven Editor, wo Sie die Zeilen für C1 und C2 auswählen (wie oben). Speichern Sie und beenden Sie das Programm, dann wird der Rebase fortgesetzt und Sie erhalten den Zweig "temp" sowie HEAD bei master + C1 + C2:

      A---C1---o---C2---o---o feature
     /
----o---o---o---o-master--C1---C2 [HEAD, temp]

Dann können Sie einfach den Master-Zweig auf HEAD aktualisieren und den temporären Zweig löschen, und Sie sind startklar:

# git branch -f master HEAD
# git branch -d temp

7voto

GarryOne Punkte 1238

Für mich, git reset --soft branch ist der einfachste Weg, die Änderungen aus einem anderen Zweig selektiv auszuwählen, da dieser Befehl alle Diff-Änderungen in meinen Arbeitsbaum einfügt und ich leicht auswählen oder rückgängig machen kann, welche ich brauche.

Auf diese Weise habe ich die volle Kontrolle über die übertragenen Dateien.

7voto

kenorb Punkte 134883

Sie können verwenden read-tree um z.B. einen bestimmten entfernten Baum in den aktuellen Index einzulesen oder zusammenzuführen:

git remote add foo git@example.com/foo.git
git fetch foo
git read-tree --prefix=my-folder/ -u foo/master:trunk/their-folder

Um die Zusammenführung durchzuführen, verwenden Sie -m stattdessen.

Siehe auch: Wie führe ich ein Unterverzeichnis in Git zusammen?

7voto

lumpidu Punkte 672

Ich würde eine

git diff commit1..commit2 filepattern | git-apply --index && git commit

Auf diese Weise können Sie den Bereich der Übertragungen für ein Dateimuster aus einem Zweig einschränken.

Es wird gestohlen von Re: Wie kann man nur ein paar Dateien von einem Zweig in einen anderen ziehen?

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