Git 主库子库管理、分支合并策略
Git 主库子库管理、分支合并策略目录主库与子库的核心概念从零开始创建主库与子库常规开发流程提交与推送撤销操作指南分支与合并更新子库引用分支合并策略dev → test → master总结1. 主库与子库的核心概念主库Superproject总仓库记录子库的地址和所需的具体版本号Commit ID。子库Submodule独立仓库拥有自己的完整历史被主库引用。1.1 目录结构示例my-app/ # 主仓库根目录 ├── .git/ # 主仓库版本库 ├── .gitmodules # 子模块配置文件记录 url 和路径 ├── README.md # 主仓库自己的文件 ├── frontend/ # 子模块1独立仓库 │ ├── .git │ └── src/ └── backend/ # 子模块2独立仓库 ├── .git └── src/1.2 核心原理主库只记录“快照”主库不关心子模块内部文件的具体变化只记录子模块的一个Commit ID。当子模块有更新时主库会显示modified: frontend (new commits)表示子模块已有新版本需要更新主库的指针。1.3 职责分离角色负责不负责子模块开发者进入子模块目录add、commit、push子模块内部代码不修改主库的任何文件不在主库执行add/commit主库管理者在主库执行add 子模块目录更新版本指针然后commit、push不进入子模块内部修改代码不在子模块内执行add/commit/push一句话子模块管代码主库管指针。2. 从零开始创建主库与子库第一步创建主仓库并提交 READMEmkdirmy-appcdmy-appgitinitecho# My ApplicationREADME.mdgitaddREADME.mdgitcommit-mInitial: Add README第二步创建后端子仓库mkdir../backendcd../backendgitinitechoprint(Hello Backend)app.pygitaddapp.pygitcommit-mInitial backend commit第三步创建前端子仓库mkdir../frontendcd../frontendgitinitechoconsole.log(Hello Frontend);index.jsgitaddindex.jsgitcommit-mInitial frontend commit第四步将子模块添加到主仓库cd../my-appgitsubmoduleaddhttps://github.com/your-company/backend.git backendgitsubmoduleaddhttps://github.com/your-company/frontend.git frontendgitstatus# 看到 .gitmodules, backend, frontend 为 new file第五步提交主仓库结构gitadd.gitmodules backend frontendgitcommit-mProject setup: add submodulesgitpush origin main3. 常规开发流程提交与推送黄金规则先推送子模块再提交主模块。# 1. 进入子模块修改并推送cdmy-app/backendgitcheckout maingitpull# ... 编辑代码 ...gitaddapp.pygitcommit-mAdd new APIgitpush origin main# 先推送子模块# 2. 回到主库更新指针并推送cd..gitaddbackend# 记录子模块的新 Commit IDgitcommit-mUpdate backend submodulegitpush origin main可选配置让子模块自动追踪分支避免脱离 HEADgitconfig-f.gitmodules submodule.backend.branch maingitconfig-f.gitmodules submodule.frontend.branch maingitadd.gitmodulesgitcommit-mTrack branches4. 撤销操作指南4.1 只撤销主库的提交保留修改gitreset--softHEAD~1# 提交消失修改回到暂存区4.2 完全回退主库丢弃修改gitreset--hardHEAD~1# 提交和修改全部丢弃4.3 撤销子模块的本地修改cdbackendgitreset--hardHEAD4.4 撤销已推送的提交安全方式# 主库的引用回退产生一次新提交gitrevert HEADgitpush origin main# 子模块内部回退cdbackendgitrevert HEADgitpush origin maincd..gitaddbackend# 因为子模块 Commit ID 变了主库需重新记录gitcommit-mRevert backendgitpush4.5git checkout与git reset的区别命令用途是否移动分支指针是否易恢复git checkout commit临时查看或测试历史版本❌ 不移动进入分离 HEAD 状态✅ 切换回原分支即可恢复git reset --soft commit撤销提交保留修改✅ 移动指针到指定 commit✅ 可重新提交git reset --hard commit彻底丢弃后续提交和修改✅ 移动指针并覆盖工作区❌ 不可逆需用 reflog 找回示例gitcheckout a1b2c3d# 临时查看旧版本# 浏览代码...gitcheckout main# 恢复gitreset--harda1b2c3d# 永久回到旧版本丢弃之后所有提交5. 分支与合并更新子库引用当两个分支指向子模块的不同版本时合并会产生冲突。示例feature分支更新了backend现在合并回main。gitcheckout maingitmerge feature# 若冲突显示# HEAD# -Subproject commit a1b2c3d# # -Subproject commit e4f5g6h# feature# 手动选择最终版本如 e4f5g6hgitaddbackendgitcommitgitpush origin main6. 分支合并策略dev → test → master6.1 两种合并方式对比特性git merge普通合并git merge --squash压缩合并保留源分支历史✅ 保留所有 commit❌ 压缩成一个新 commit目标分支历史合并提交 所有源分支 commit仅一个最终快照提交适用场景需要详细追溯每次修改生产发布只需干净版本6.2 保留历史普通 mergegitcheckouttestgitmerge dev# 保留 dev 的所有提交gitpush origintest6.3 不保留历史squash mergegitcheckouttestgitmerge--squashdev# 只取 dev 最新代码快照gitcommit-mSquash dev into testgitpush origintest6.4 完整流程示例场景dev 有提交 A,B,C合并到 test 后test 上又有 D,E最后需要将 test 合入 master。方式一全程保留历史gitcheckouttestgitmerge dev# 产生 M1gitadd.gitcommit-mDgitadd.gitcommit-mEgitcheckout mastergitmergetest# 产生 M2最终 master 历史包含 A,B,C,M1,D,E,M2。方式二最终只保留一个提交gitcheckouttestgitmerge--squashdevgitcommit-mSquash dev into testgitadd.gitcommit-mDgitadd.gitcommit-mEgitcheckout mastergitmerge--squashtestgitcommit-mRelease v2.0最终 master 只有一个提交包含 dev 最新 D E。6.5 混合策略推荐dev → test普通merge保留历史便于定位 bug。test → mastermerge --squash生产发布只保留整体版本。gitcheckouttestgitmerge dev --no-ffgitpush origintest# test 上多次提交...gitcheckout mastergitmerge--squashtestgitcommit-mRelease v2.0gitpush origin master6.6 注意事项merge --squash不记录源分支关系再次合并可能重复冲突。建议 squash 后删除或重置源分支。多次从 dev 同步到 test 时普通 merge 更安全。7. 总结操作命令特点普通合并git merge dev保留完整历史压缩合并git merge --squash dev只生成一个快照提交撤销本地提交保留修改git reset --soft HEAD~1提交消失修改回到暂存区撤销已推送提交安全git revert HEAD新增反向提交不破坏历史强制回退危险git push --force覆盖远程历史临时查看历史版本git checkout commit分离 HEAD切换分支即恢复永久回退本地分支git reset --hard commit丢弃后续提交不可逆主库更新子模块版本git add 子模块目录commit更新指针核心原则子模块管代码主库管指针。需要完整历史用merge需要干净快照用merge --squash。推荐dev→test保留历史test→master压缩提交。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2562974.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!