Informationen zum Mergen von Unterbäumen
Typischerweise wird eine Subtree-Zusammenführung verwendet, um ein Repository innerhalb eines anderen Repositorys zu enthalten. Das „Unterrepository“ wird in einem Ordner des Haupt-Repositorys gespeichert.
Der beste Weg, das Zusammenführen von Unterbäumen zu erklären, ist, es anhand eines Beispiels zu zeigen. Wir werden:
- Erstellen eines leeren Repositorys namens
test, das unser Projekt repräsentiert. - Einfügen eines anderen Repositorys als Subtree namens
Spoon-Knife. - Das Projekt
testwird dieses Unterprojekt so verwenden, als sei es ein Teil desselben Repositorys. - Updates von
Spoon-Knifein unsertest-Projekt übernehmen.
Ein leeres Repository für das Zusammenführen eines Subtrees einrichten
-
Öffne TerminalTerminalGit Bash.
-
Erstelle ein neues Verzeichnis und navigiere zu diesem.
mkdir test cd test -
Initialisieren Sie ein neues Git-Repository.
$ git init > Initialized empty Git repository in /Users/octocat/tmp/test/.git/ -
Erstelle und committe eine neue Datei.
$ touch .gitignore $ git add .gitignore $ git commit -m "initial commit" > [main (root-commit) 3146c2a] initial commit > 0 files changed, 0 insertions(+), 0 deletions(-) > create mode 100644 .gitignore
Ein neues Repository als Subtree hinzufügen
-
Füge eine neue Remote-URL hinzu, die auf das separate Projekt von Interesse verweist.
$ git remote add -f spoon-knife https://github.com/octocat/Spoon-Knife.git > Updating spoon-knife > warning: no common commits > remote: Counting objects: 1732, done. > remote: Compressing objects: 100% (750/750), done. > remote: Total 1732 (delta 1086), reused 1558 (delta 967) > Receiving objects: 100% (1732/1732), 528.19 KiB | 621 KiB/s, done. > Resolving deltas: 100% (1086/1086), done. > From https://github.com/octocat/Spoon-Knife > * [new branch] main -> Spoon-Knife/main -
Merge das
Spoon-Knife-Projekt in das lokale Git-Projekt. Dadurch wird keine deiner Dateien lokal geändert, aber Git wird auf den nächsten Schritt vorbereitet.Bei Verwendung von Git 2.9 oder höher:
$ git merge -s ours --no-commit --allow-unrelated-histories spoon-knife/main > Automatic merge went well; stopped before committing as requestedBei Verwendung von Git 2.8 oder älter:
$ git merge -s ours --no-commit spoon-knife/main > Automatic merge went well; stopped before committing as requested -
Erstelle ein neues Verzeichnis namens spoon-knife, und kopiere den Git-Verlauf des
Spoon-Knife-Projekts in dieses Verzeichnis.$ git read-tree --prefix=spoon-knife/ -u spoon-knife/main > fatal: refusing to merge unrelated histories -
Erstelle einen Commit der Änderungen, um sie zu sichern.
$ git commit -m "Subtree merged in spoon-knife" > [main fe0ca25] Subtree merged in spoon-knife
Hier wurde nur ein Unterprojekt hinzugefügt. Du kannst jedoch eine beliebige Anzahl an Unterprojekten in ein Git-Repository integrieren.
Tipp
Wenn du in Zukunft ein neues Klon des Repositories erstellst, werden die von dir hinzugefügten Remote-Verbindungen nicht für dich erstellt. Du musst sie erneut mithilfe des git remote add-Befehls hinzufügen.
Synchronisieren mit Aktualisierungen und Änderungen
Wenn ein Subprojekt hinzugefügt wird, wird es nicht automatisch mit den vorgelagerten Änderungen synchronisiert. Du musst das Subprojekt mit dem folgenden Befehl aktualisieren:
git pull -s subtree REMOTE-NAME BRANCH-NAME
Im Beispiel oben würde dies so aussehen:
git pull -s subtree spoon-knife main
Weitere Informationen
-
[Das Kapitel „Advanced Merging“ (Erweitertes Mergen) aus dem _Pro Git_-Buch](https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging) -
[Wie man die Teilbaum-Mergestrategie verwendet](https://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html)