C++_win_QT6学习《3》_结合qt项目开发学习git仓库相关知识

前言:

  • 假设有2给开发人员,需要共同开发一个qt项目,使用gitee当中的仓库,主要是了解gitee中多人配合制作项目的流程。

git基础知识

add_常用关键字

  • origin 只是 Git 给"默认远程仓库"起的一个别名,可以当成一个地址缩写来用。
  • 第一次 git clone <仓库地址> 时,Git 自动把那个地址登记到本地,并默认命名成 origin(相当于 origin = https://gitee.com/xxx/xxx.git)。
  • origin可以保存远程地址,省得每次推拉都敲长串 URL。
  • origin/main、origin/dev 这些"远程跟踪分支"就是存在你本地的"快照",用来和真正的远程分支对比、合并。
  • HEAD 就是 "我现在正站在哪条分支、哪次提交" 的指针。HEAD 指向哪里,你的工作区、下次提交就基于哪里。
  • 使用流程说明:
  • git不同区域命令说明
  • gitbash中会联网涉及到远程仓库的命令
  • gitbash中不会联网,只涉及本地操作的命令

add_git本地相关工作区的结构

add_两种删除情况说明

  • 在本地新建一个文件夹再删除掉操作
  • 远程仓库不会对比"变动是否重大",它只接收你这次提交里包含的所有树对象:新增、修改、删除一律照单全收。
  • "不小心新建又删除"且从未 add/commit,对远程零影响;一旦 add/commit 了,远程就会如实记录你的新建/删除。

add_如何进行多人开发

  • 项目开发最好就是在main/master之外再创建要给分支dev作为所有人共同merge的分支,每个人自己开发部分在分支dev-a,dev-b中开发,开发完成就和dev进行merge,然后每个人每次开发,都先把仓库内容拉取下来,然后把dev分支的内容和自己开发的分支进行合并,再进行开发。
  • Git 协作开发中非常经典且推荐的 "主干保护 + 开发分支隔离" 模式:把 master/main 设为"只读",任何人都不允许直接 push;所有修改必须走「个人功能分支 → 代码审查/CI → 合并请求(MR/PR)→ 自动 merge」流程,从而保证主干永远可部署、历史可审计。
  • 假设有两个开发者A和B,如果A是管理员,只有A有合并权限,A负责加法模块,B负责减法模块,那么从项目建立到提交第一个完整版本的时序图。

add_多人多分支开发注意事项:

  • 普通开发人员
    1、开始工作前,先 git fetch origin 把远程最新状态拉回来;
    2、切到自己开发的分支,然后合并最新内容,确保你的代码是基于最新"主线"继续开发的;
    4、别人的功能分支通常不需要合并到你分支,除非你们两人明确要协作同一功能。
  • 管理人员
    1、先切换到主分支
    2、将自己开发的部分合并到主分支(解决冲突)
    3、将别人开发的部分合并到主分支(解决冲突)
    4、将合并之后的主分支提交到远程仓库:git push origin master
    注意:其实管理员合并,也是在本地切换到主分支在本地拉取所有分支最新内容进行合并的,合并之后在提交主分支。

git远程同步问题

一、前期准备会用到的操作:

1、仓库初始化(核心)

  • 创建 Gitee 仓库:
    管理员登录 Gitee → 「新建仓库」,填写仓库名(如 qt-simple-calculator)、描述,选择「私有 / 公开」,勾选「初始化仓库」(可选添加 README.md、.gitignore(选 Qt 模板)、LICENSE)。
  • 配置仓库权限:
    仓库 → 「管理」→「协作者」→ 「添加协作者」,输入另一名开发者的 Gitee 账号,授予「写权限」(或「管理员权限」,视信任度),确保两人都能推送代码。
  • 统一开发环境:
    两人同步 Qt 版本(如 Qt 6.5.0)、编译器(MinGW/GCC/MSVC)、系统(Windows/Linux),避免因环境差异导致代码运行异常;
    建议在仓库根目录添加 README.md 说明环境要求、编译步骤。

2、克隆仓库到本地(两人都需操作)

  • 已配置 SSH 免密的前提下,克隆仓库:
bash 复制代码
# 两人都执行(SSH 方式,免密)
git clone git@gitee.com:xxx/qt-simple-calculator.git
cd qt-simple-calculator
  • 分支规范(推荐)
  • 初始化开发分支(管理员操作)
bash 复制代码
# 从 master 切出 dev 分支并推送到远程
git checkout -b dev 
# git checkout <源分支> -b <新分支>:以"源分支"当前快照为起点,立刻创建并切换到一条全新的本地分支。创建完成后自动切换进这条新分支,HEAD 指向它。

git push -u origin dev
# git push -u <远程名> <本地分支名>:把本地分支 <本地分支名> 推送到远程 <远程名> 的同名分支;若远程不存在该分支则自动创建。-u(--set-upstream)一次性建立跟踪关系:以后在当前分支执行 git push / git pull 时,Git 会自动对应到 远程名/本地分支名,无需再写全名。

3、两人统一拉取 dev 分支(基础开发分支)

bash 复制代码
git fetch origin
# git fetch <远程名>:从远程仓库拉取所有分支的最新提交到本地远程跟踪分支(如 origin/dev),不自动合并或修改工作区。

git checkout dev
# git checkout <分支名>:切换到已存在的本地分支 <分支名>;若不存在但远程有同名分支,Git 会提示用 git switch -c <分支名> origin/<分支名> 创建并跟踪。

git pull origin dev
# git pull <远程名> <远程分支名>:等价于 git fetch <远程名> <远程分支名> + git merge origin/<远程分支名>:获取远程更新并自动合并到当前分支,工作区文件可能因此改变。

二、日常开发会用到的操作:

1.1、分支操作

  • 以「开发者 A 开发功能 A、开发者 B 开发功能 B」为例,流程完全一致,仅分支名不同。
  • 创建功能分支(单人操作,避免污染 dev)
bash 复制代码
# 确保当前 dev 分支是最新的
git pull origin dev
# 创建并切换到功能分支(命名规范:feature/功能名)

git checkout -b feature/calculator-add  
# git checkout -b <新分支名>以当前分支/提交为起点,立即创建一条名为 <新分支名> 的本地分支。
  • 如果B已经创建了分支dev-b,该如何拉取A的dev-a的内容到B的分支dev-b
    方法:拉取远程dev-a的更新 → 合并到本地dev-b,全程不影响 B 已写的代码(若有)
    ①、如果 B 已经在dev-b写了部分运算逻辑,先提交本地修改
bash 复制代码
# 查看本地修改(确认要提交的文件)
git status

# 提交本地修改(备注清晰,便于追溯)
git add .
git commit -m "dev-b: 暂存未完成的运算逻辑代码"

②、B 拉取dev-a分支的最新代码(远程→本地)

bash 复制代码
# 拉取远程仓库中dev-a分支的最新代码(仅拉取,不切换分支)
git fetch origin dev-a

③、B 将dev-a的代码合并到本地dev-b

bash 复制代码
# 确保当前在dev-b分支(若不在,执行:git checkout dev-b)
git checkout dev-b

# 合并远程dev-a的最新代码到本地dev-b
git merge origin/dev-a
# git merge <远程名>/<远程分支名>把远程分支 <远程名>/<远程分支名> 的最新快照取回并直接合并到当前所在分支。
# origin/dev-a 只是一个远程跟踪分支(存在你本地的 .git/refs/remotes/origin/dev-a)。
# 

1.2、操作


三、具体案例:

  • 结合设计一个Qt项目,实现计算器功能

1、仓库设计:

  • 解释:单管理员(A)+ 单协助开发者(B) 的小型项目协作模式,仅设 master、dev-a、dev-b 三个分支:由 A 初始化远程仓库并创建所有分支,在 dev-a 分支开发项目框架与主要项目模块并推送至远程;B 拉取远程 dev-a 代码合并到本地 dev-b 分支,基于该基础开发辅助模块,后推送至远程 dev-b;A 拉取远程 dev-b 代码审核、合并到本地 dev-a 并完成整体联调测试,确认无误后将 dev-a 合并到 master主干分支,打版本标签并推送,实现第一个完整版本的发布,全程由 A 掌控分支合并与版本发布权限,B 仅负责辅助模块开发。

2、Qt中程序设计

  • Qt 的开发习惯是"先 UI 后逻辑" ;

3、推送阶段可能会遇到的问题

  • 调用远程分支合并到本地自己的分支【参考本文二中的1.1分支操作】
  • 本地分支HEAD和远程跟踪分支不一致
bash 复制代码
11252@DESKTOP-LI5D69R MINGW64 /d/Qt_project/qt-simple-calculator (dev-b)
$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:dev-a

To push to the branch of the same name on the remote, use

    git push origin HEAD

To choose either option permanently, see push.default in 'git help config'.
  • 本地当前分支叫 dev-b,但上游(upstream)原来指向的是远程的 dev-a,名字对不上,因此拒绝默认推送。
  • 解决办法:
    1、推到同名的远程分支(远程没有就新建):git push origin HEAD 【git push <远程名> HEAD[:<远程分支名>],[:<远程分支名>] 可选目标分支;省略时→推送到与本地分支同名的远程分支,并自动建立上游跟踪】
    2、仍然推到原来的 dev-a(覆盖远程 dev-a):git push origin HEAD:dev-a【git push origin <本地来源>:<远程目标>】

4、最后由管理员合并

  • 合并操作的前提还是先拉取仓库主分支最新情况,然后在本地切换到主分支,在本地合并,再推送远程更新,这样既安全(冲突在本地解决)、又符合"主干保护"思想(不直接在远程做合并)。
  • dev-b完成了逻辑部分程序的开发;
  • dev-b提交的程序已经由a拉取到本地,并且合并到自己本地dev-a分支了,这个版本审核无误,接下来该合并到主分支master
  • A需要把本地 dev-a 快进合并到本地 master → 打标签 → 推送主干和标签
  • 先切换到主分支:git switch master
  • 相关命令解释
    1、git merge --ff-only <源分支>:合并命令,--ff-only表示仅执行「快进合并(Fast-Forward)」,不创建合并提交,只有当「目标分支」是「源分支」的直接祖先时才会合并成功,如果有冲突 / 需要合并提交,直接报错(保证分支历史线性);
    2、git tag -a <标签名> -m "<标签描述>" :创建 / 管理版本标签(标签是提交的 "快照标记",绑定特定版本),-a参数:创建「附注标签(Annotated Tag)」(包含标签作者、时间、备注,推荐生产环境用),-m备注信息
    3、git push <远程仓库别名> <目标分支>:将本地分支的提交推送到远程仓库
  • 仓库状态
  • 仓库网络图

相关推荐
minji...1 小时前
Linux 基础IO(一) (C语言文件接口、系统调用文件调用接口open,write,close、文件fd)
linux·运维·服务器·网络·数据结构·c++
第二只羽毛1 小时前
C++ 高性能编程要点
大数据·开发语言·c++·算法
Clarence Liu2 小时前
redis学习 (1) 基础入门
数据库·redis·学习
qq_571099352 小时前
学习周报二十五
学习
崇山峻岭之间2 小时前
C++ Prime Plus 学习笔记027
c++·笔记·学习
赖small强2 小时前
【Linux C/C++开发】Linux C/C++ 堆栈溢出:原理、利用与防护深度指南
linux·c语言·c++·stack·堆栈溢出
爱学习的梵高先生2 小时前
C++:基础知识
开发语言·c++·算法
oioihoii2 小时前
C++对象生命周期与析构顺序深度解析
java·开发语言·c++
xlq223222 小时前
24.map set(下)
数据结构·c++·算法