Git学习和使用

5.2 .gitmodules 用法

  • 项目应用:毫米波雷达(优点:模块开发人员只维护模块即可)
  • 路径示例:
    • base:配置.gitmodules
    • module1:
    • module2:
# add and commit
git submodule add https://github.com/user/frontend.git frontend
git add .gitmodules frontend 
git commit -m "Added frontend submodules"

# clone 
git clone xxx.git --recursive
# git submodule update --init --recursive 

# update all submodule
git submodule update --remote --recursive

# init (first add, clone, update .gitmodules)
git submodule init --all

5.2.1 .gitmodules 用法

.gitmodules 文件是 Git 仓库中用于管理子模块的一个配置文件。当你在 Git 仓库中使用子模块时,可以有一个或多个子模块,每个子模块对应 .gitmodules 文件中的一个条目。以下是如何使用 .gitmodules 文件来管理多个子模块的详细介绍和示例。

1. 初始化父仓库

首先,确保你有一个初始化的 Git 仓库作为父仓库。

mkdir parent-repo
cd parent-repo
git init

2. 添加子模块

使用 git submodule add 命令来添加子模块。你可以一次性添加多个子模块。例如,假设你想添加两个子模块,一个是用于前端资源的 frontend,另一个是用于后端逻辑的 backend

git submodule add https://github.com/user/frontend.git frontend
git submodule add https://github.com/user/backend.git backend

这两条命令会将远程仓库 frontendbackend 分别作为子模块添加到当前父仓库的 frontendbackend 目录下。

3. .gitmodules 文件的生成

执行上述子模块添加命令后,Git 会自动为你创建 .gitmodules 文件,并填入类似下面的配置:

[submodule "frontend"]
    path = frontend
    url = https://github.com/user/frontend.git

[submodule "backend"]
    path = backend
    url = https://github.com/user/backend.git

每个 [submodule "name"] 条目都对应一个子模块,其中 path 是子模块在父仓库中的相对路径,url 是子模块的 Git 仓库地址。

4. 提交子模块

在添加了子模块并生成了 .gitmodules 文件后,你需要将这些更改提交到你的父仓库:

git add .gitmodules frontend backend
git commit -m "Added frontend and backend submodules"

5. 克隆含多个子模块的仓库

当你克隆一个包含多个子模块的父仓库时,可以使用 --recurse-submodules 选项来同时克隆父仓库和所有子模块:

git clone --recurse-submodules https://github.com/user/parent-repo.git

如果你想在之后某个时间点更新子模块,可以运行:

git submodule update --init --recursive

这将初始化所有子模块,并从它们的远程仓库拉取最新的内容。

6. 管理子模块更新

当你的子模块有更新时,你可以在子模块的目录中使用 Git 命令来更新它,然后提交更改到父仓库:

cd frontend
git fetch origin
git checkout new-branch-or-commit
cd ../..

git add frontend
git commit -m "Updated frontend submodule to new-branch-or-commit"

记得对每个需要更新的子模块重复这个过程。

7. 推送到远程仓库

当你的父仓库和子模块都有本地更改时,你可以将这些更改推送到远程仓库:

git push origin main

这里假设你正在推送到远程仓库的 main 分支。

注意事项

  • 使用子模块时,要确保 .gitmodules 文件和子模块目录下的 .git 配置都正确无误。
  • 更新子模块可能涉及解决合并冲突,尤其是在子模块频繁更新的情况下。
  • 子模块可以嵌套使用,即一个子模块也可以包含自己的子模块。

通过使用 .gitmodules 文件,你可以有效地管理多个 Git 子模块,使得代码重用和项目结构管理变得更加方便。

5.2.2 纯本地用法

如果你希望体验 Git 子模块(submodule)的功能,但是没有特定的本地或远程仓库 URL,你可以通过以下方式进行:

  1. 使用示例仓库
    你可以使用 GitHub 上的公共仓库作为子模块的示例。例如,Git 官方的测试仓库或任何其他公开的、你感兴趣的项目。

  2. 创建测试仓库
    在 GitHub 或其他 Git 托管服务上创建一个新的仓库,用于测试子模块功能。

  3. 本地模拟
    即使你没有远程仓库,也可以在本地模拟子模块的行为。创建两个本地仓库,一个作为父仓库,另一个作为子模块。

以下是使用本地仓库模拟子模块的步骤:

步骤 1: 创建父仓库

mkdir parent-repo
cd parent-repo
git init

步骤 2: 创建子模块仓库

mkdir ../child-repo
cd ../child-repo
git init

在子模块仓库中添加一些文件并提交:

touch README.md
git add README.md
git commit -m "Initial commit"

步骤 3: 将子模块仓库添加为父仓库的子模块

回到父仓库目录:

cd ..[parent-repo]

添加子模块:

git submodule add ../child-repo child-repo

这会将 ../child-repo 作为子模块添加到父仓库的 child-repo 目录下。

步骤 4: 提交并查看子模块

初始化并提交 .gitmodules 文件:

git submodule init
git add .gitmodules child-repo
git commit -m "Added child-repo as a submodule"

步骤 5: 克隆含子模块的仓库

克隆父仓库时,使用 --recurse-submodules 选项以克隆子模块:

git clone --recurse-submodules [parent-repo-url]

如果你在本地操作,可以使用相对路径作为 URL:

git clone --recurse-submodules ..[parent-repo] parent-repo

步骤 6: 更新子模块

模拟远程子模块更新,可以简单地在子模块仓库中进行新的提交:

cd child-repo
touch new-file.txt
git add new-file.txt
git commit -m "Add new file"

然后,在父仓库中更新子模块:

cd ..[parent-repo]
git submodule update --remote child-repo
git add child-repo
git commit -m "Updated child-repo submodule"

通过这些步骤,你可以在本地环境中体验 Git 子模块的添加、更新和克隆等基本操作,而无需访问远程服务器。这对于学习和测试子模块功能非常有帮助。

5.2.3 git submodule init

  • git submodule init 什么时候用,多个子模块怎么用

git submodule init 命令用于初始化子模块的配置,它是 git submodule update 命令的一部分,通常与 --recursive 选项一起使用来初始化仓库中的所有子模块。当你有多个子模块时,这个命令会为每个子模块设置正确的配置。

以下是 git submodule init 的使用场景和方法:

使用场景:

  1. 首次添加子模块后:当你首次在父仓库中添加子模块后,需要运行 git submodule init 来初始化子模块的配置。

  2. 克隆含子模块的仓库后:如果你克隆了一个包含子模块的仓库,并且使用了 --recurse-submodules 选项,Git 会自动为你初始化所有子模块。如果没有使用这个选项,你可以在克隆后运行 git submodule init 来初始化子模块。

  3. 更新子模块配置:如果子模块的 .gitmodules 文件被更新(例如,更改了子模块的 URL),你需要运行 git submodule init 来应用这些更改。

使用方法:

对于单个子模块,你可以这样初始化:

git submodule init <submodule-path>

其中 <submodule-path> 是子模块在父仓库中的路径。

对于多个子模块,你可以:

  1. 逐个初始化:如果你只想初始化特定的子模块,可以重复上述命令,为每个子模块调用一次。

  2. 使用 --all 选项:如果你想一次性初始化所有子模块,可以使用 --all 选项:

    git submodule init --all
    
  3. 结合 --recursive 选项:如果你的子模块中还包含了嵌套的子模块,并且你想要递归地初始化所有层级的子模块,可以结合使用 --recursive 选项:

    git submodule init --recursive
    

这将初始化当前仓库中的所有子模块,并且如果这些子模块中有任何嵌套的子模块,它们也会被递归地初始化。

初始化后的常见操作:

  • 更新子模块:初始化子模块后,通常需要更新子模块到最新的提交,可以使用 git submodule update 命令。

  • 提交更改:初始化子模块后,需要将 .gitmodules.gitconfig 文件的更改添加到父仓库并提交。

示例:

假设你有一个父仓库,里面有两个子模块 backendfrontend,你可以这样初始化它们:

git submodule init backend
git submodule init frontend

如果你想要一次性初始化所有的子模块,可以使用:

git submodule init --all

记得在初始化子模块后,使用 git submodule update 命令来获取子模块的内容,并在完成后提交更改到父仓库。

5.2.4 git clone 子分支不是最新(有的是有的不是、配置没指定)

git clone xxx.git --recursive 有多个字库,其他两个都可以是最新,其中一个不是最新版本

git clone xxx.git 直接clone不是最新的库,下来是最新的

.gitmodules 没有指定版本,只配置了url

这是为什么?详细解释和解决

如果你使用 git clone --recursive 克隆一个包含多个子模块的 Git 仓库,理论上所有的子模块都应当被克隆并更新到 .gitmodules 文件中指定的状态。然而,如果其中一个子模块没有更新到最新版本,这可能是由以下原因造成的:

  1. 子模块的初始提交
    如果子模块在 .gitmodules 中没有指定特定的分支或提交,Git 会默认检出子模块的 mainmaster 分支的 HEAD。如果该分支的 HEAD 不是最新的提交,那么你可能需要更新子模块。

  2. 子模块的状态
    如果子模块之前被检出到一个特定的提交(detached HEAD 状态),即使 .gitmodules 没有指定版本,子模块也不会跟踪任何分支,导致无法获取最新的更新。

  3. 缓存的 Git 配置
    有时候,Git 可能会缓存一些关于子模块的旧配置,这可能影响到克隆过程中的状态。

  4. 网络或权限问题
    可能存在网络连接问题或权限问题,导致 Git 无法从远程仓库拉取子模块的最新内容。

  5. Git 版本差异
    如果你使用的 Git 版本与仓库维护者使用的版本不同,可能会因为 Git 特性的差异导致克隆行为不一致。

要解决这个问题,你可以按照以下步骤操作:

检查子模块状态

首先,检查有问题的子模块的状态:

cd path/to/submodule
git status

这将显示子模块的当前状态,包括它指向的分支或提交。

更新子模块

如果子模块落后于远程仓库,你可以手动更新它:

cd path/to/submodule
git fetch origin
git reset --hard origin/main

这里假设 origin 是远程仓库的名称,main 是你想要跟踪的分支。请根据实际情况替换这些名称。

重新初始化子模块

如果手动更新不起作用,可以尝试重新初始化子模块:

cd path/to/parent-repo
git submodule deinit -f path/to/submodule
git submodule init path/to/submodule
git submodule update --recursive

这将重新初始化并更新所有子模块。

清理和重新克隆

如果问题依旧存在,考虑清理当前的克隆,并重新开始:

cd ..
rm -rf path/to/parent-repo
git clone --recursive xxx.git

检查 SSH 密钥和权限

确保你的 SSH 密钥设置正确,并且你有权访问所有子模块的远程仓库。

使用最新版本的 Git

确保你的 Git 客户端是最新版本,以避免可能的兼容性问题。

通过上述步骤,你应该能够解决子模块不是最新版本的问题。如果问题依然存在,可能需要进一步检查仓库的具体情况,或者联系仓库的维护者以寻求帮助。

git clone 指定分支

一、Git 介绍

  1. Git下载和安装
  2. Git命令行环境搭建(配合vscode使用)
  3. Git创建本地仓库
  4. 添加远程仓库,比如Gitlab(GitLab配置SSH密钥)

1.2 Git 使用教程

  1. Git 菜鸟教程
  2. Git 教程
  3. Git使用教程

1.3 Git 查看和设置用户名和邮箱

问题:一台硬件服务器,若只有一个linux用户,

  • vscode ssh 配置:文件、用户权限 (离线配置)
  • vscode ssh 密钥登录配置:
  • vscode git:不要每次输入用户名和密码(指定带用户名和密码的URL)

git如何查看和修改用户名和邮箱

问题:一台硬件服务器、只有一个linux用户、多个小伙伴同事使用该用户时,默认会导致使用同一个git用户提交上去

二、Git 使用

2.0 项目实例

下载代码:从局域网GitLab服务器当指定分支代码

git clone ssh://git@xxx.git
cd standard/
git branch -a
git fetch origin v2.3.1			# 都git clone了,这句代码还有用么?
git checkout v2.3.1
git pull origin v2.3.1

补充说明:

git branch -a					#查看所有分支
git fetch origin v2.3.1			#从远程的origin仓库的v2.3.1分支下载代码到本地的origin v2.3.1
git checkout v2.3.1				#切换到v2.3.1分支		
git pull origin v2.3.1

首先,操作之前一定要看清分支!!

其次,提交代码之前一定要先更新代码!!

git branch -----查看当前分支

git pull -----更新代码到本地

提交代码:

0、提交代码前,先更新远程仓库的代码:git pull 或更新拉取指定分支的代码

1、在本地修改相应文件(或者文件新旧替换)

2、git add //文件名 (文件修改路径)(注意路径要写对)

3、git status ----查看当前本地文件信息

4、 git commit -m “更改信息备注”

5、git push --------提交代码到当前分支
(我一般git push 之前会看一下commit状态:git status)

到此Git提交代码就完成啦!

2.1 Git 本地仓库添加gitee远程仓库

已初始化本地仓库,新添加gitee远程仓库:

  1. 首先在 gitee 上新建一个空仓库(注意必须是空仓库)
  2. 然后按下面操作建立关系

在这里插入图片描述

2.2 GIT合并某一次提交到其他分支

将一个分支上的某个commit合并到另一个分支,可用使用cherry-pick命令实现。

比如将dev分支上commit_id为f99f2b57b7ee72d55a08e699fbeec34cbac96cb8的提交合并到master分支:

1)切换到master分支:git checkout master

2)执行cherry-pick命令:git cherry-pick f99f2b57b7ee72d55a08e699fbeec34cbac96cb8

3)推送到远程master仓库:git push

注意master上新的commit id与dev上的id并不相同,即只是将dev上的修改拷贝过来作为一个新的提交,这就会带来一个问题:cherry-pick之后,dev想再次merge到master,要先对dev分支进行rebase变基或拉取master分支最新代码。

如果用的是gitlab,也可以直接在页面上操作:
在这里插入图片描述

2.3 git 直接当指定分支代码

在没有git clone之前,你可以使用以下命令来查看远程仓库的分支列表:

git ls-remote --heads <remote-url>

要将指定分支的代码直接获取到本地,可以使用以下命令:

git clone -b <branch_name> <repository_url>

# 示例
git clone -b development https://github.com/username/repository.git

2.4 git patch的使用方法和场景


问题:

  1. 其他分支更新同步到当前分支
  2. GIT合并分支后原分支还在不在
  3. https://blog.csdn.net/JACKSONMHLK/article/details/125458704

Git 基本操作

git merge 合并分支

  1. git merge合并分支

Git是什么?为什么要使用Git?

git是一个免费且开源的分布式版本控制系统,可以快速高效地应用于从小型到大型的项目,其实就是一个高级一点的版本控制系统。

https://blog.csdn.net/weixin_39902085/article/details/111204420

五、其他问题

push或者commint之后恢复

创建/操作/删除分支

参考资料

  1. git ---- 没有 .ssh 文件的解决方法
  2. git add和commit的区别
  3. git add 多个文件和文件夹的方法
  4. git push和git push origin
  5. git pull 和 git pull origin develop 的区别
  6. git branch && git checkout常见用法
  7. git checkout用法详解
  8. git merge合并分支
  9. git fetch 和 git fetch origin v2.3.1
  10. git fetch和git pull之间的区别

https://blog.csdn.net/dddxxxx/article/details/88545596
https://blog.csdn.net/weixin_30699831/article/details/101982286

二、简易的命令行入门教程

Git 全局设置:

git config --global user.name "mayue"
git config --global user.email "7656128+ma__yue@user.noreply.gitee.com"

创建 git 仓库:

mkdir testtest
cd testtest
git init 
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/ma__yue/testtest.git
git push -u origin "master"

已有仓库?

cd existing_git_repo
git remote add origin https://gitee.com/ma__yue/testtest.git
git push -u origin "master"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值