Git操作

1、Git子模块

在工程构建中,往往存在一些通用模块或功能稳定、特定用途的模块。推荐将这类模块独立为一个 Git 仓库进行管理。使用时,可以将其作为 Git 子模块导入主工程,主工程仅需记录子模块对应的 commit id,即可实现版本锁定与依赖管理。

1.1 给现有工程加入子模块

有一个工程Project,我想在Project/lib目录下加入一个模块moduleA,这个模块在git上是现成的,可以直接拿来用,这个时候有以下两个选择:

  • **方法A:**直接把模块下载下来放到Project/lib/moduleA目录下
  • **方法B:**把这个模块作为子模块存放Project/lib/moduleA目录下,实际只记录一个commit id

先说优劣:

方法A很直观,直接复制拷贝工程源码,大部分人一开始都是这么做的,好理解也方便,但是这种方法无法和原来仓库建立联系,后期有更新了也不能感知到,如果作为基础模块,项目中很多地方使用,而且这个模块后期经常变动不建议用这种方法,如果模块几乎不会变动,建议使用这种方法。

方法B相关麻烦一些,初学者容易操作失误,但是适用于经常升级的模块,具体操作如下:

python 复制代码
# 进入要加子模块的目录下
cd Project/lib
# 给当前工程加子模块,源码自动存放到moduleA文件夹中
git submodule add http://192.168.1.100:8888/common/docker_image/moduleA ./moduleA
# 如果这个子模块内部还嵌套有其它子模块
cd moduleA
git submodule update --init --recursive

1.2 github仓库改成gitlib子仓库方法

个人代码在gitlib仓库,但是其中某个功能实际上是github上的仓库,提交代码的时候,提示我有子仓库。这时有两个选择:

1、直接删掉github相关信息,将代码合并到当前工程,当然这样简单粗暴,但是丢失相关提交记录

2、将github地址改成gitlib地址,然后作为子模块被当前工程管理

方法1操作方法:

python 复制代码
rm -rf /home/sam3/code/SAM3-TensorRT/.git
git rm --cached code/SAM3-TensorRT
git add code/SAM3-TensorRT/

方法2的操作步骤如下:

第 1 步:在你的 GitLab 上创建空项目

在 GitLab 上新建一个空仓库(如 sam3-tensorrt),不要勾选初始化 README。记下地址,格式类似:

python 复制代码
git@your-gitlab.com:your-group/sam3-tensorrt.git

第 2 步:推送到你的 GitLab

python 复制代码
cd /home/sam3/code/SAM3-TensorRT

# 添加你的 GitLab 作为新 remote
git remote add gitlab git@your-gitlab.com:your-group/sam3-tensorrt.git

# 推送所有分支和标签到你的 GitLab
git push gitlab --all
git push gitlab --tags

第 3 步:转为 submodule

python 复制代码
cd /home/sam3

# 1. 先从 git 暂存区移除(不删文件)
git rm --cached code/SAM3-TensorRT

# 2. 删除内层 .git 目录(submodule 会通过自己的方式管理)
rm -rf code/SAM3-TensorRT/.git

# 3. 临时移走目录(submodule add 要求目录不存在或为空)
mv code/SAM3-TensorRT /tmp/SAM3-TensorRT-backup

# 4. 添加 submodule(用你的 GitLab 地址)
git submodule add git@your-gitlab.com:your-group/sam3-tensorrt.git code/SAM3-TensorRT

# 5. 恢复你的本地改动(如果有未提交的修改)
cp -r /tmp/SAM3-TensorRT-backup/* code/SAM3-TensorRT/

# 完成后 .gitmodules 文件会自动生成:
[submodule "code/SAM3-TensorRT"]
    path = code/SAM3-TensorRT
    url = git@your-gitlab.com:your-group/sam3-tensorrt.git

后续使用

python 复制代码
# 克隆主仓库时自动拉取子模块
git clone --recurse-submodules <主仓库地址>

# 已有仓库更新子模块
git submodule update --init --recursive

# 同步上游更新(将来需要时)
cd code/SAM3-TensorRT
git fetch origin          # 从 GitHub 上游拉取
git push gitlab main      # 推到你的 GitLab

2、代码回退

2.1 场景1

修改了一个文件onnx_inference.cpp,提交到Git,对应的commitid199fa20* , 但是因为某些原因我发现我没有必要修改这个文件,我想回退到上个版本对应的代码,应该怎么操作?

Git命令如下:

C++ 复制代码
git restore --source=199fa20^ -- src/onnx_inference.cpp

执行完命令打开onnx_inference.cpp和远端仓库代码对比,代码已经变成这次提交前的状态,只需要再提交一次覆盖本地提交即可。上面命令的详细解释如下:

参数 含义
git restore Git 命令,用于恢复工作区文件到某个状态
--source=199fa20^ 指定恢复的来源。199fa20 是提交哈希,^ 表示"该提交的父提交",即 199fa20^ = 199fa20 的前一个提交
-- 分隔符,表示后面的参数都是文件路径,防止路径被误解为选项
src/onnx_inference.cpp 要恢复的文件路径

通俗理解:

C++ 复制代码
git restore --source=<从哪里恢复> -- <恢复哪个文件>

这个命令的意思是:从提交 199fa20 的父提交中,恢复 src/onnx_inference.cpp 文件到当前工作区。

3、常规命令

获取代码的git仓库地址

忘记仓库远端地址,可以通过下面命令查看:

python 复制代码
git remote get-url origin

待补充...

相关推荐
恋喵大鲤鱼1 小时前
git pull
git·git pull
咖啡星人k3 小时前
MonkeyCode 的 Git 集成:AI编程如何与版本控制无缝协作
git·ai编程·monkeycode
恋喵大鲤鱼4 小时前
git remote
git·git remote
恋喵大鲤鱼5 小时前
git cherry-pick
git·git cherry-pick
恋喵大鲤鱼5 小时前
git push
git·git push
stevenzqzq6 小时前
androidstudio 上配置git
git
向日葵.7 小时前
linux & qnx & git 命令 2
linux·运维·git
恋喵大鲤鱼7 小时前
git log
git·git log
阿明68 小时前
Git的原理与使用
git