git踩坑 及 一些需要注意的地方

Git常见问题与解决
本文总结了使用Git过程中遇到的一些常见问题及解决方案,包括推送被远程仓库拒绝、SSH密钥配置错误等,并提供了排查问题的方法及推荐的学习资源。

踩的坑:

一、Push XXX(本地的一个仓库) to origin/XXX(远程的一个仓库分支) was rejected by remote

如过同时使用两种不同的Git,比如Github和码云、

1、要上传不同的ssh key。用习惯了github,不要忘了码云(或者其他平台)可能也需要设置/上传ssh key(rsa_pub)

2、会有三种级别的配置文件。仓库>全局>系统。出问题的时候分别查看不同的配置文件和日志

3、push的时候出现reject的情况,有可能是不同代码管理平台的账号密码混淆了。这时候一定要检查清楚配置文件里使用的账号:

[user]
name = 
email = 

二、


三、一些比较好的git博客/文章

http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

http://blog.youkuaiyun.com/zxncvb/article/details/22153019

<think> 嗯,用户问的是"git submodule命令是干啥的",这是一个关于Git版本控制工具的具体功能问题。用户可能正在管理一个包含多个子项目的代码库,遇到了需要复用外部代码但又要保持独立版本控制的需求。 从技术角度看,这个问题需要清晰解释submodule的核心功能:作为嵌套子仓库的指针。重点要强调它和直接复制代码的区别——submodule维护了与原始仓库的链接关系,允许独立更新。用户可能遇到过这样的场景:主项目依赖某个第三方库,但直接复制代码会导致更新困难;或者团队协作时,不同成员对子模块的修改需要同步。 考虑到用户的技术水平(能问到submodule说明有一定Git基础),解释时需要包含典型工作流程但避免过于基础的操作。我特意加了注意事项和限制的部分,因为这是实际使用中最容易地方——比如忘记初始化子模块导致编译失败,或者提交了未更新的子模块指针。 最后设计相关问题时要覆盖不同层次:第一个问题针对基础概念(和subtree的区别是常见困惑点);第二个是操作场景(适合刚接触的用户);第三个偏高级应用(权限管理和协作问题);第四个涉及故障排查(实际开发中的高频问题);最后一个延伸思考(适合架构设计场景)。这样无论用户是初学者还是有一定经验,都能找到对应的延伸方向。 注意到用户要求中文回答,所有技术术语都保持了英文原名但附中文说明,比如"commit"译为"提交记录"而非直译"承诺",更符合开发者习惯。示例命令中的路径用方括号标注,这是Git的标准写法,用户复制时直接替换内容即可。 </think>`git submodule` 命令用于在 **一个 Git 仓库内部嵌套另一个独立的 Git 仓库**。它允许你将另一个仓库作为当前项目的一个子目录引入,同时保持这两个仓库历史的完全独立和可追踪性。 **核心功能和用途:** 1. **代码复用与依赖管理:** 当你需要在项目中包含并使用另一个项目(如第三方库、共享组件、内部工具)的特定版本,但又希望保持该依赖项的独立开发历史和版本控制时,使用子模块非常合适。 2. **精准版本控制:** 子模块指向的是它所引用的仓库中一个 **特定的提交(commit SHA-1)**,而不是分支名(如 `main`)。这确保了你的主项目依赖的是依赖项的一个 **确定不变的状态**,即使依赖项仓库后续有新的提交。 3. **分离历史记录:** 主仓库(称为“超级项目”)只记录它引用了哪个子模块仓库的哪个提交。子模块仓库自身的提交历史完全独立于主仓库的历史。对子模块内部文件的修改需要在子模块目录下单独进行 Git 操作(`add`, `commit`, `push`, `pull`)。 4. **克隆协作:** 当其他人克隆包含子模块的主项目仓库时,默认情况下只会得到一个包含子模块路径但为空(或指向提交但无实际文件)的目录。需要使用 `git submodule update --init`(或克隆时加 `--recurse-submodules`)来真正拉取子模块仓库的代码并检出主项目所指向的那个特定提交。 **基本工作流程:** 1. **添加子模块:** ```bash git submodule add <repository_url> [<path>] ``` * 将位于 `<repository_url>` 的仓库添加为当前仓库的子模块。 * `<path>` (可选) 指定子模块在项目中的存放路径(目录名)。如果不指定,默认使用仓库名。 * 此命令会做两件事: * 克隆指定的远程仓库到指定的本地路径。 * 创建一个名为 `.gitmodules` 的文件(如果不存在则创建),并在其中记录子模块的路径和 URL。 * 将子模块的路径和当前的 `HEAD` (最新检出提交) 记录在主仓库的暂存区(需要后续 `git commit`)。 2. **克隆包含子模块的项目:** ```bash git clone --recurse-submodules <repository_url> ``` * `--recurse-submodules` 选项告诉 Git 在克隆主项目后立即初始化并更新所有子模块(检出正确的提交)。这是最推荐的方式。 * 如果克隆时忘记加 `--recurse-submodules`,可以后续执行: ```bash git submodule init # 初始化本地配置文件(读取.gitmodules) git submodule update # 检出子模块仓库中主项目记录的提交 ``` 或者合并为: ```bash git submodule update --init ``` 如果子模块还嵌套了子模块,则需要 `--recursive`: ```bash git submodule update --init --recursive ``` 3. **在子模块上工作:** * 进入子模块目录:`cd path/to/submodule` * 像在普通 Git 仓库中一样操作:`git status`, `git add`, `git commit`, `git push`, `git pull`, `git checkout` 等。这些操作只影响子模块仓库本身。 * **重要:** 在子模块中做了修改并提交推送后,需要回到主项目目录,执行 `git add path/to/submodule` 然后 `git commit`。这会将主项目指向子模块的 **新提交**。其他协作者更新主项目后,再用 `git submodule update` 就能检出这个新提交。 4. **更新子模块到其远程的最新提交:** * 进入子模块目录:`cd path/to/submodule` * 拉取并合并远程更改:`git pull origin main` (或其他分支名) * 回到主项目目录:`cd ..` * 添加并提交子模块路径的更新:`git add path/to/submodule` + `git commit -m "Update submodule to latest"` **注意事项与限制:** * **复杂性:** 子模块增加了项目结构的复杂性,需要开发者理解其工作机制。 * **权限:** 克隆或更新包含子模块的项目需要拥有对子模块仓库的访问权限。 * **提交锁定:** 子模块指向的是固定提交。要使用依赖项的新功能或修复,需要显式更新子模块到新的提交并在主项目中提交这次更新。 * **`.gitmodules` 文件:** 这个文件需要被提交到主仓库,它记录了子模块的映射关系(路径和 URL)。 * **修改跟踪:** 主仓库的 `git status` 会显示子模块目录的状态是 `modified`(如果当前检出的提交与主仓库记录的提交不同)或 `new commits`(如果子模块有新的提交未被主仓库记录)。 **总结:** `git submodule` 是 Git 提供的用于管理项目依赖(作为独立的 Git 仓库)的强大工具,特别适合需要精确控制依赖项版本且依赖项独立开发的场景。它通过存储指向依赖项特定提交的引用来实现模块化和版本稳定性,但需要开发者遵循特定的工作流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值