git协同开发与冲突解决

news2024/9/23 12:45:26

协同开发流程

  • 基本的使用方法

image-20240513215752115

# 1 多人开发同一个项目
	-张三:本地 版本库
    -李四:本地 版本库
    -我:  本地 版本库
    ----远程仓库:本地版本库内容--》推送到远程仓库-----
    
# 2 演示(我是项目管理员)
	-1 增加几个开发者
    -2 其它开发者:把代码拉到本地
    	git clone https://gitee.com/liuqingzheng/luffy_api.git
    -3 其它开发者:使用pycharm打开
    	-在utils-->init.py中第五行加入 print('111')
    -4 其它开发者:提交代码
    	git add .
        git commit -m '改了xxx'
        git push origin master # 正常能推上去
    -5 我:进入到仓库中,就能看到它的提交了
    -6 我:本地修改--utils---init.py
    	git add .
        git commit -m '改了xxx' 
        # git push origin master # 报错
        git pull origin master
        git push origin master

1. 作为项目管理员

1.1 添加开发者
  • 在Gitee项目设置中添加新的开发者,并为他们分配适当的权限。
1.2 初始设置
  • 如果你还没有本地仓库,可以使用

    git clone
    

    命令从远程仓库克隆代码到本地。

    git clone https://gitee.com/liuqingzheng/luffy_api.git
    
  • 在本地进行初始的开发和提交。

2. 其他开发者

2.1 克隆项目
  • 开发者使用

    git clone
    

    命令从远程仓库克隆代码到本地。

    git clone https://gitee.com/liuqingzheng/luffy_api.git
    
2.2 使用PyCharm打开项目
  • 打开PyCharm,选择“Open”选项,然后定位到刚才克隆下来的项目文件夹。
2.3 修改代码并提交
  • 在PyCharm中修改代码,例如在utils/init.py文件的第五行加入print('111')

  • 在PyCharm的VCS(Version Control System)工具窗口或使用命令行提交更改。

    git add .  
    git commit -m "在init.py中添加了打印语句"
    
  • 推送更改到远程仓库。

    git push origin <branch-name>  # 替换<branch-name>为你的分支名,例如master或feature-branch
    

3. 合并代码(管理员或其他有权限的开发者)

3.1 拉取最新代码
  • 在你的本地仓库中,拉取远程仓库的最新代码,确保你的本地仓库是最新的。

    git pull origin <branch-name>  # 替换<branch-name>为你要拉取的分支名
    
3.2 解决冲突(如果有)
  • 如果在拉取代码时遇到冲突,使用文本编辑器解决冲突,然后重新提交。
3.3 合并分支(如果需要)
  • 如果你在使用特性分支进行开发,并且该分支的代码已经通过测试并准备合并到主分支,你可以使用git merge命令或在Gitee等平台上进行合并请求(merge request)。
3.4 推送合并后的代码
  • 在合并后,将更改推送到远程仓库。

    git push origin <branch-name>  # 替换<branch-name>为你要推送的分支名
    

注意事项

  • 确保所有开发者都使用相同的分支策略和工作流程。
  • 定期与团队成员沟通,确保大家的工作不会互相干扰。
  • 使用特性分支来开发新功能或修复问题,而不是直接在主分支上工作。
  • 使用代码审查(code review)来确保代码质量。
  • 在合并代码之前,确保所有的测试都通过。

冲突解决

【 1 】简单的解决方法

# 1 由于有多人开发,一定会出冲突
# 2 出现冲突的原因如下:
	1 多人在同一分支开发:改了同样文件
    2 分支合并
  
# 注意:如果多人在同以分支开发,不想解决冲突
	-频繁拉取代码
# 3 演示:多人统一分支开发出冲突
	-1 张三改了 utils-init.py-->9行,并且提交了
    -2 我没有拉去代码,直接也改了第9行,并且提交到本地版本库
    -3 我拉去远程代码---》拉去下来--》本地代码合并----》一合并出冲突了
    -4 冲突样子
        <<<<<<< HEAD
        print('111222') # 我的代码
        =======
        print('111222') # 别人代码
        >>>>>>> d93673fc5144d64cb4c31cb34e7a16280fdcb39f
	-5 解决冲突
    	-保留两个人的代码
        -保留它的代码
        -保留我的代码,删除它的代码
	-6 本地提交
    -7 提交到远端
  • 具体演练

初始状态

假设 utils/init.py 文件的初始内容是:

# utils/init.py  
print("Initial content")

张三的操作

  1. 张三拉取代码(假设这是第一次,所以直接就是初始状态)
  2. 张三修改 utils/init.py
# utils/init.py  
print("Initial content")  
print("Added by Zhang San")
  1. 张三提交并推送到远程
git add utils/init.py  
git commit -m "Added a line by Zhang San"  
git push origin main

你的操作

注意:此时你没有拉取张三的更改。

  1. 你直接修改 utils/init.py
# utils/init.py  
print("Initial content")  
print("Added by You")
  1. 你尝试提交到本地(这一步是可选的,但展示了你的本地提交)
git add utils/init.py  
git commit -m "Added a line by You"

冲突出现

  1. 你尝试拉取远程代码
git pull origin main

Git 会提示有冲突,并告诉你需要手动解决。

解决冲突

  1. 打开 utils/init.py 文件
    你会看到类似这样的冲突内容:
# utils/init.py  
print("Initial content")  
<<<<<<< HEAD  
print("Added by You")  
=======  
print("Added by Zhang San")  
>>>>>>> main
  1. 手动解决冲突
    例如,你选择合并两个人的更改,但你可能需要修改一下以保持代码整洁:
# utils/init.py  
print("Initial content")  
print("Added by You")  
print("Also added by Zhang San")
  1. 保存文件并标记为已解决
    使用 git add 命令将已解决的冲突文件标记为已解决:
git add utils/init.py

提交并推送

  1. 提交更改
git commit -m "Resolved merge conflict in utils/init.py"
  1. 推送更改到远程
git push origin main

现在,你已经成功解决了冲突,并将更改推送到了远程仓库。

注意事项

  • 在实际开发中,冲突可能会更复杂,涉及多个文件的多个更改。但基本的解决步骤是相同的。
  • 使用版本控制系统(如 Git)时,重要的是要经常与团队成员沟通,并在开始工作之前拉取最新的代码。这有助于减少冲突的发生。
  • 当遇到冲突时,不要害怕。Git 提供了很好的工具来帮助你解决它们。

image-20240513221638844

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1938082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(二刷)代码随想录第21天|236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 递归三部曲&#xff1a; 1、确定参数和返回值&#xff1a; class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {} 2、确定中止条件&#xff1a; if (root null || root p || root q) { // 递归结…

lua 游戏架构 之 SceneLoad场景加载之 SceneBase (三)

谢谢大家关注一下啊我的微信 框架上 设计一个 基类 SceneLoad&#xff1a;BaseSceneLoad lua 游戏架构 之 SceneLoad场景加载&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/heyuchang666/article/details/140560014?spm1001.2014.3001.5501 设计多个 场景类&a…

无需业务改造,一套数据库满足 OLTP 和 OLAP,GaiaDB 发布并行查询能力

在企业中通常存在两类数据处理场景&#xff0c;一类是在线事务处理场景&#xff08;OLTP&#xff09;&#xff0c;例如交易系统&#xff0c;另一类是在线分析处理场景&#xff08;OLAP&#xff09;&#xff0c;例如业务报表。 OLTP 数据库擅长处理数据的增、删、改&#xff0c…

STM32测测速---编码电机读取速度的计算

1、首先先了解一下计算的公式 速度计算&#xff1a; 轮胎每转一圈的脉冲数取决于编码器的分辨率&#xff0c;可由下面公式进行计算&#xff1a; PPR是电机的线数 以GA25-370电机为例。 图片来源&#xff1a;第四节&#xff1a;STM32定时器&#xff08;4.JGA25-370霍尔编码器…

规范:前端工程代码规范

准备工作 前端工程化介绍 前端工程化是指将前端开发流程标准化、自动化和模块化的过程。以下是一些常见的步骤或配置&#xff1a; 代码版本控制&#xff1a;使用 Git 等版本控制系统来管理代码的变更和协作。 依赖管理&#xff1a;使用 npm 或 yarn 等包管理工具来管理项目依…

园区道路车辆智能管控视频解决方案,打造安全畅通的园区交通环境

一、背景需求分析 随着企业园区的快速发展和扩张&#xff0c;道路车辆管理成为了保障园区秩序、提升运营效率及确保员工安全的重要任务。针对这一需求&#xff0c;旭帆科技TSINGSEE青犀提出了一种企业园区道路车辆管控的解决方案&#xff0c;通过整合视频监控、智能识别等技术…

6.2 基础功能介绍

本节重点介绍 : 数据源操作新增一个数据源dashboard操作folder操作alerting操作用户和组操作 本节重点总结 : 数据源操作dashboard操作folder操作alerting操作用户和组操作

linux时间服务器——软件安装,配置时间服务器客户端 ,配置时间服务器服务端

1 、软件安装 # 设置当前时区 [rootlocalhost ~] # timedatectl set-timezone Asia/Shanghai [rootlocalhost ~] # yum install -y chrony [rootlocalhost ~] # systemctl enable --now chronyd [rootserver1 ~] # cat /etc/chrony.conf # 设置时间服务器的服务端名字 s…

ceph log内容解析

log内容构造 如osd的一条log 分别表示 时间戳 线程id 日志等级 子模块 内容实体 剖析源码实现 每条log都是由一个Entry构成 定义在src/log/entry.h中 Entry(short pr, short sub) :m_stamp(clock().now()), // 打印日志时的时间戳m_thread(pthread_self()), // 打印日志的线…

MySQL进阶_11.主从复制

文章目录 一、主从复制概述1.1、如何提升数据库并发能力1.2、主从复制的作用 二、主从复制的原理2.1、原理剖析2.2、原理剖析 一、主从复制概述 1.1、如何提升数据库并发能力 应用对数据库而言都是“ 读多写少 ”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有…

【Android】使用视图绑定ViewBinding来代替findViewById

文章目录 介绍作用用法开启ViewBinding功能自动生成绑定类在Activity中使用访问视图控件 区别 介绍 ViewBinding 是 Android 开发中的一个功能&#xff0c;它简化了访问视图的过程&#xff0c;避免了使用 findViewById 的繁琐步骤。它通过生成与布局文件相对应的绑定类&#xf…

【python基础】组合数据类型:元组、列表、集合、映射

文章目录 一. 序列类型1. 元组类型2. 列表类型&#xff08;list&#xff09;2.1. 列表创建2.2 列表操作2.3. 列表元素遍历 ing元素列表求平均值删除散的倍数 二. 集合类型&#xff08;set&#xff09;三. 映射类型&#xff08;map&#xff09;1. 字典创建2. 字典操作3. 字典遍历…

OV7670寄存器读出0x00或0xFF

文章目录 问题描述原因分析解决方案 问题描述 OV7670的输出图像异常&#xff0c;怀疑寄存器没有正确配置&#xff0c;在SignalTap中观察到SIO_D在读出阶段一直为高或低 寄存器读出0x00 寄存器读出0xFF 原因分析 在确保电源、时钟和读写时序没有问题的情况下&#xff0c;有…

mysql的索引、事务和存储引擎

目录 索引 索引的概念 索引的作用 作用 索引的副作用 创建索引 创建索引的原则和依据 索引的类型 创建索引 查看索引 删除索引 drop 主键索引 普通索引 添加普通索引 唯一索引 添加唯一索引 组合索引 添加组合索引 查询组合索引 全文索引 添加全文索引 …

K12智慧校园智能化解决方案

1. 项目背景 “十三五”期间&#xff0c;教育信息化工作旨在为教育改革发展提供动力与手段&#xff0c;目标是到2020年建成与国家教育现代化发展目标相适应的教育信息化体系。 2. 建设需求 智慧校园系统框架解析与建设目标分析&#xff0c;旨在实现教育信息化目标任务。 3.…

利用双端队列 实现二叉树的非递归的中序遍历

双端队列&#xff1a;双向队列&#xff1a;支持插入删除元素的线性集合。 java官方文档推荐用deque实现栈&#xff08;stack&#xff09;。 pop(): 弹出栈中元素&#xff0c;也就是返回并移除队头元素&#xff0c;等价于removeFirst()&#xff0c;如果队列无元素&#xff0c;则…

QDockWidget

详细描述 QDockWidget 类提供了一个小部件&#xff0c;它可以停靠在QMainWindow内部&#xff0c;也可以作为桌面上的顶级窗口浮动。 QDockWidget 提供了停靠部件的概念&#xff0c;也称为工具调色板或实用窗口。停靠窗口是放置在 中央部件 周围的停靠部件区域中的辅助窗口&am…

多商户商城系统源码解析及直播电商APP开发指南

本篇文章&#xff0c;笔者将详细解析多商户商城系统的源码结构&#xff0c;并提供开发直播电商APP的指南。 一、多商户商城系统源码解析 系统架构设计 多商户商城系统的架构设计通常分为前端、后端和数据库三个部分&#xff1a; 前端 后端 数据库 核心模块分析 多商户商…

SpringMVC源码深度解析(上)

今天&#xff0c;聊聊SpringMVC框架的原理。SpringMVC属于Web框架&#xff0c;它不能单独存在&#xff0c;需要依赖Servlet容器&#xff0c;常用的Servlet容器有Tomcat、Jetty等&#xff0c;这里以Tomcat为例进行讲解。老规矩&#xff0c;先看看本项目的层级结构&#xff1a; 需…

ETAS RTM配置及使用-CPU Load测量/task时间测量/Isr时间测量

文章目录 前言RTM配置RtmControlRtmGeneralRtmMonitorOS配置RTE配置集成与测试初始化主函数函数执行测量测试CPU LoadTask MonitorISR Monitor函数监控总结前言 一般对CPU Load的测量,task及runnable的监控等有两种方案: 1.需要使用带trace功能的调试器,且硬件也需要支持对…