codecamp

GitHub 关于 Git 子树合并

如果需要管理单一仓库中的多个项目,可以使用子树合并来处理所有引用。

通常,子树合并用于在仓库中包含仓库。 “子仓库”存储在主仓库的文件夹中。

解释子树合并的最佳方式是举例说明。 我们将:

  • 创建一个名为 test 的空仓库,表示我们的项目
  • 将另一个仓库 Spoon-Knife 作为子树合并到其中。
  • 如果该子项目属于同一仓库,test 项目会使用它。
  • Spoon-Knife 提取更新到 test 项目。

创建用于子树合并的空仓库

  1. 打开 Git Bash。

  1. 创建一个新目录并找到它。

   $ mkdir test
   $ cd test

  1. 初始化新的 Git 仓库。

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

  1. 创建并提交新文件。

   $ touch .gitignore
   $ git add .gitignore
   $ git commit -m "initial commit"
   > [master (root-commit) 3146c2a] initial commit
   >  0 files changed, 0 insertions(+), 0 deletions(-)
   >  create mode 100644 .gitignore

新增一个仓库为子树

  1. 新增指向我们感兴趣的单独项目的远程 URL。

   $ git remote add -f spoon-knife git@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 git://github.com/octocat/Spoon-Knife
   >  * [new branch]      master     -> Spoon-Knife/master

  1. Spon-Knife 项目合并到当地 Git 项目。 这不会在本地更改任何文件,但会为下一步准备 Git。

如果您使用的是 Git 2.9 或更高版本:

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

如果您使用的是 Git 2.8 或更低版本:

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

  1. 创建新目录 spoon-knife 并将 Spoon-Knife 项目的 Git 历史记录复制到其中。

   $ git read-tree --prefix=spoon-knife/ -u spoon-knife/master

  1. 提交更改以确保其安全。

   $ git commit -m "Subtree merged in spoon-knife"
   > [master fe0ca25] Subtree merged in spoon-knife

虽然我们只添加了一个子项目,但是可在 Git 仓库中加入任意数量的子项目。

提示:如果以后创建仓库的全新克隆,不会为您创建您添加的远程 Url。 您需要再次使用 the git remote add 命令添加它们

同步更新和更改

添加子项目时,它不会自动与上游更改保持同步。 您需要使用以下命令更新子项目:

$ git pull -s subtree remotename branchname

对于上述示例,将是:

$ git pull -s subtree spoon-knife master

延伸阅读

GitHub 解决 Git 变基后的合并冲突
GitHub 将子文件夹拆分成新仓库
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

GitHub 身份验证

在 GitHub 上管理订阅和通知

在 GitHub 上管理活动的订阅

GitHub 组织和团队

GitHub 管理对组织仓库的 Git 访问

GitHub 计费和付款

GitHub 使用议题和拉取请求进行协作

GitHub 在具有代码质量功能的仓库上进行协作

管理在 GitHub 上的工作

GitHub 建立强大的社区

GitHub 管理仓库

GitHub 自定义 GitHub 工作流程

在 GitHub Marketplace 中购买并安装应用程序

通过 GitHub Jobs 寻找人才

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }