通常,子树合并用于在存储库内包含存储库。“子存储库”存储在主存储库的文件夹中。
解释子树合并的最佳方法是通过示例展示。我们将
- 创建一个名为
test
的空存储库,代表我们的项目。
- 将另一个存储库合并到其中,作为名为
Spoon-Knife
的子树。
test
项目将使用该子项目,就好像它是同一存储库的一部分。
- 从
Spoon-Knife
获取更新到我们的test
项目中。
-
打开终端终端Git Bash。
-
创建一个新目录并导航到该目录。
mkdir test
cd test
-
初始化一个新的 Git 存储库。
$ git init
> Initialized empty Git repository in /Users/octocat/tmp/test/.git/
-
创建并提交一个新文件。
$ 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
-
添加一个指向我们感兴趣的单独项目的新远程 URL。
$ 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
-
将Spoon-Knife
项目合并到本地 Git 项目中。这不会更改您本地的任何文件,但它会为 Git 准备下一步。
如果您使用的是 Git 2.9 或更高版本
$ git merge -s ours --no-commit --allow-unrelated-histories spoon-knife/main
> Automatic merge went well; stopped before committing as requested
如果您使用的是 Git 2.8 或更低版本
$ git merge -s ours --no-commit spoon-knife/main
> Automatic merge went well; stopped before committing as requested
-
创建一个名为spoon-knife的新目录,并将Spoon-Knife
项目的 Git 历史记录复制到其中。
$ git read-tree --prefix=spoon-knife/ -u spoon-knife/main
> fatal: refusing to merge unrelated histories
-
提交更改以确保其安全。
$ git commit -m "Subtree merged in spoon-knife"
> [main fe0ca25] Subtree merged in spoon-knife
虽然我们只添加了一个子项目,但可以将任意数量的子项目合并到 Git 存储库中。
添加子项目后,它不会自动与上游更改保持同步。您需要使用以下命令更新子项目
git pull -s subtree REMOTE-NAME BRANCH-NAME
对于上述示例,这将是
git pull -s subtree spoon-knife main