Ist es möglich, nur die Änderungen für ein Unterverzeichnis von einem lokalen Git-Zweig zu einem entfernten Git-Zweig zusammenzuführen, oder ist es "alles oder nichts"?
Zum Beispiel habe ich:
branch-a
- content-1
- dir-1
- content-2
und
branch-b
- content-1
- dir-1
- `content-2
Ich möchte nur den Inhalt von Zweig-a-Verzeichnis-1 mit dem Inhalt von Zweig-b-Verzeichnis-1 zusammenführen.
Antworten:
Als Alternative zur SO-Frage " Wie fügst du selektive Dateien mit Git-Merge zusammen? " Habe ich gerade diesen GitHub-Thread gefunden, der besser zum Zusammenführen eines ganzen Unterverzeichnisses angepasst werden könnte, basierend auf dem Git-Lesebaum :
(Dies führt eine Zusammenführung durch, indem die Strategie "Unsere" (
-s ours
) verwendet wird, mit der Änderungen aus dem Quellzweig verworfen werden. Dadurch wird die Tatsache aufgezeichnet, dieinfochimps/master
zusammengeführt wurde, ohne dass tatsächlich eine Datei im Zielzweig geändert wird. )Dies liest den Baum nur für das erforderliche Quell-Unterverzeichnis, dh
cookbooks/cassandra
im Upstream-Zweig des Quell- Repositorys.Beachten Sie, dass der Name des Ziel- Unterverzeichnisses auch lauten sollte
cookbooks/cassandra
, sonst würden Sie sehen:Nachtrag
Es ist bizarr, [mich bearbeiten] - aber der
read-tree
Schritt kann möglicherweise so fehlschlagen:... auch wenn beide Dateien identisch sind . Dies könnte helfen:
Aber natürlich überprüfen Sie manuell, ob dies das tut, was Sie wollen.
quelle
<rev>:<path>
, zum BeispielHEAD:README
,:README
,master:./README
git read-tree
Schritt schlägt für mich fehl:error: Entry 'foo/bar/baz.php' overlaps with 'bar/baz.php'. Cannot bind.
overlaps with
oben erwähnte Fehler auch bei identischen Dateien auf . Wie komisch ist das?infochimps/master
ohne jedoch eine Datei im Zielzweig zu ändern . Denn im nächsten Schrittgit read-tree --prefix=cassandra
wird die Änderung vorgenommen. Das endgültige Commit zeichnet den tatsächlichen "Zusammenführungs" -Inhalt auf.Nehmen wir in meinem Beispiel an, Sie haben eine Zweigstelle 'Quelle' und eine Zweigstelle 'Ziel', die beide Upstream-Versionen von sich selbst widerspiegeln (oder nicht, wenn nur lokal) und auf den neuesten Code gezogen werden. Angenommen, ich möchte das Unterverzeichnis im Repository namens newFeature, das nur im Zweig 'source' vorhanden ist.
Es ist deutlich weniger verworren als alles andere, was ich gesehen habe, und das hat perfekt für mich funktioniert, hier zu finden .
Beachten Sie, dass dies keine echte Zusammenführung ist, sodass Sie nicht die Festschreibungsinformationen zu newFeature im Zielzweig haben, sondern nur die Änderungen an den Dateien in diesem Unterverzeichnis. Da Sie aber vermutlich den gesamten Zweig später wieder zusammenführen oder verwerfen werden, ist dies möglicherweise kein Problem.
quelle
Ich habe dies von einem Forenthread bei Eclipse erhalten und es hat wie ein Zauber funktioniert:
quelle
checkout
macht die Ordner gleich => Unterschied ist nur Unordnercheckout
=>merge
Unterschied. Es ist eine gültige Strategie.Angesichts des OP-Szenarios, in dem sie zwei Zweige haben, aber nur die Historie von dir-1 von Zweig-a in Zweig-b zusammenführen möchten :
quelle
Erstellen Sie ein Git-Repository, das sowohl Zweig-a als auch Zweig-b enthält:
quelle
Verwenden
git cherry-pick
Sie diese Option, um die gewünschten Commits auszuwählen und nur diese Commits zusammenzuführen. Der wichtigste Trick dabei ist, diese Commits auf einfache Weise zu erhalten (damit Sie sie nicht herausfinden müssen, indem Sie das Git-Protokoll manuell überprüfen und von Hand eingeben). So geht's: Verwenden Siegit log
diese Option, um die SHA-1- ID des Commits wie folgt zu drucken :'commit-a' ist das Commit unmittelbar vor dem Startpunkt des zusammenzuführenden Zweigs, und 'commit-b' ist das letzte Commit für den zusammenzuführenden Zweig. '--reverse' druckt diese Commits in umgekehrter Reihenfolge, um sie später zu pflücken.
Dann mach es wie:
Es ist zwei Schritte, einfach und stabil!
quelle
Two steps, simple and stable!
überhaupt nicht einfach :)git
, der eine schreckliche Schnittstelle und ein schreckliches mentales Modell voller Geheimnisse und zufälliger Namen und Bedeutungen hat.