# Informationen zum Zusammenführen von Git-Subtrees

Wenn du mehrere Projekte innerhalb eines einzigen Repositorys verwalten musst, kannst du einen Teilstrukturmerge verwenden, um alle Referenzen zu berücksichtigen.

## 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 `test` wird dieses Unterprojekt so verwenden, als sei es ein Teil desselben Repositorys.
* Updates von `Spoon-Knife` in unser `test`-Projekt übernehmen.

## Ein leeres Repository für das Zusammenführen eines Subtrees einrichten

1. Öffne <span class="platform-mac">Terminal</span><span class="platform-linux">Terminal</span><span class="platform-windows">Git Bash</span>.

2. Erstelle ein neues Verzeichnis und navigiere zu diesem.

   ```shell
   mkdir test
   cd test
   ```

3. Initialisieren Sie ein neues Git-Repository.

   ```shell
   $ git init
   > Initialized empty Git repository in /Users/octocat/tmp/test/.git/
   ```

4. Erstelle und committe eine neue Datei.

   ```shell
   $ 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

1. Füge eine neue Remote-URL hinzu, die auf das separate Projekt von Interesse verweist.

   ```shell
   $ 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
   ```

2. 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:

   ```shell
   $ git merge -s ours --no-commit --allow-unrelated-histories spoon-knife/main
   > Automatic merge went well; stopped before committing as requested
   ```

   Bei Verwendung von Git 2.8 oder älter:

   ```shell
   $ git merge -s ours --no-commit spoon-knife/main
   > Automatic merge went well; stopped before committing as requested
   ```

3. Erstelle ein neues Verzeichnis namens **spoon-knife**, und kopiere den Git-Verlauf des `Spoon-Knife`-Projekts in dieses Verzeichnis.

   ```shell
   $ git read-tree --prefix=spoon-knife/ -u spoon-knife/main
   > fatal: refusing to merge unrelated histories
   ```

4. Erstelle einen Commit der Änderungen, um sie zu sichern.

   ```shell
   $ 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.

> \[!TIP]
> 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](/de/get-started/git-basics/managing-remote-repositories) 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:

```shell
git pull -s subtree REMOTE-NAME BRANCH-NAME
```

Im Beispiel oben würde dies so aussehen:

```shell
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)