当前位置: 首页 > news >正文

图解Git——分布式Git《Pro Git》

分布式工作流程

Centralized Workflow(集中式工作流)

  • 所有开发者都与同一个中央仓库同步代码,每个人通过拉取、提交来合作。
  • 如果两个开发者同时修改了相同的文件,后一个开发者必须在推送之前合并其他人的更改。

Integration-Manager Workflow(集成管理者工作流)

  • 每个开发者拥有自己仓库的写权限,主仓库由维护者管理。
  • 开发者通过 fork 主仓库,推送更改到自己的仓库后,向维护者请求合并。
  • 维护者拉取开发者的更改,进行测试和合并后,推送回主仓库。

Dictator and Lieutenants Workflow(主管与副主管工作流)

  • 适用于大型项目,尤其是多个维护者的项目。项目中的 Dictator 负责最终的合并,Lieutenants 负责各自模块。
  • 开发者在自己的分支上工作,提交到 Lieutenant 的分支,再由 Lieutenant 合并到主分支,最终由 Dictator 合并到中央仓库。

向一个项目做贡献

向一个项目贡献代码的过程涉及到几个关键的因素,其中每个因素都可能影响贡献的方式、流程以及最终效果。以下是一个稍微详细的描述,包括了如何贡献代码、涉及的困难以及如何有效管理提交。

1. 活跃贡献者的数量

项目的活跃贡献者数量直接影响代码贡献的难易程度。对于小型项目,活跃的贡献者可能只有几位,每天的提交次数不多。而对于大型开源项目,贡献者可能成千上万,提交的频率也非常高。随着贡献者增多,代码的合并和应用会面临更多挑战:

  • 问题:当多个贡献者提交改动时,代码可能会发生冲突。不同的开发者可能修改相同的文件或功能,导致合并时出现冲突或代码不兼容。
  • 解决方案:使用频繁的拉取最新代码(git pull解决合并冲突的技巧非常重要。合并冲突必须在本地解决,确保最终代码与其他人提交的代码兼容。

2. 项目使用的工作流程

项目的工作流程通常取决于项目的大小和复杂度。以下是常见的几种工作流:

  • 集中式工作流:所有贡献者都拥有对主分支(master)的写入权限,可以直接提交代码。这种工作流简单,适用于小团队或私有项目。
  • 分支工作流:每个开发者在自己的分支上工作,修改完成后通过**拉请求(pull request)合并请求(merge request)**向主分支提交代码。这是更常见的工作流,尤其是对于开源项目。
  • 维护者工作流:对于大型项目,维护者或核心开发人员负责审查和合并来自其他开发者的代码,外部贡献者需要通过提交拉请求来提供自己的改动。

影响:你需要明确自己所参与的项目采用哪种工作流程。如果是分支工作流,你可能需要在自己完成代码后,推送到自己的分支上,再通过拉请求的方式提交合并。

3. 提交权限

提交权限的管理是一个重要的因素,它决定了你如何将代码提交到项目中:

  • 有写权限:如果你有直接的写权限,可以直接提交代码到主分支或者其他分支。
  • 没有写权限:如果没有写权限,通常需要通过提交拉请求或合并请求的方式贡献代码。维护者将审核你的代码,并决定是否合并。

影响:如果没有直接的写权限,你需要了解项目是否有贡献指南,遵循规定的流程来提交代码。

4. 如何确保代码合并成功

代码合并的过程中,通常会涉及以下步骤:

  • 拉取最新代码:确保你的本地分支与远程仓库的代码是同步的。
git pull origin master

如果有人提交了新的改动,你需要合并他们的代码到自己的分支。

  • 解决冲突:在合并时,如果出现冲突,Git 会提示你冲突的文件。你需要手动解决这些冲突。
git mergetool

使用适当的工具来解决冲突。

  • 推送代码:将你的代码提交到远程仓库。对于有写权限的用户,可以直接推送到主分支;对于没有写权限的用户,推送到自己的分支并发起拉请求。
git push origin my-feature-branch

5. 提交准则和提交信息规范

提交信息是贡献中非常重要的一部分,合理的提交信息有助于项目维护者理解你的改动,并在后期进行回溯时找到问题。以下是一些常见的提交准则:

  • 避免空白错误:在提交代码前,运行 git diff --check 检查代码是否有空格或其他格式错误。
  • 保持提交逻辑清晰:每个提交应该是一个逻辑上独立的变更集。避免将多个不相关的功能或修复合并成一个提交。你可以通过 git add --patch 来分拆提交,确保每次提交都是相关的、功能明确的。
  • 提交信息的格式:通常,提交信息应包含以下部分:
    • 简洁的摘要:不超过 50 个字符,简要描述改动内容。
    • 详细描述:如果需要,可以提供更多的背景信息,包括为什么要进行这个改动,改动的动机以及如何影响代码的行为。

示例:

Add user authentication logicImplement login and registration features with validation and error handling.
This change introduces a new User model and modifies the authentication flow.

6. 常见的合并和冲突处理

在多人协作的项目中,冲突是不可避免的。以下是一些处理冲突的技巧:

  • 频繁同步:尽量在自己提交之前拉取远程的最新代码,并解决冲突。
  • 避免长时间拖延合并:如果开发周期较长,尽量频繁将自己的修改与主分支合并,减少出现复杂冲突的概率。

7. 私有小型团队的工作流程

  • 在一个小型私有团队中,可能会采用集中式的工作流。在这种情况下,团队成员通常拥有直接的写权限,可以直接将代码推送到主分支。这种工作流程较为简单,适用于团队成员较少且沟通较为直接的项目。
  • 示例:Git - 向一个项目贡献

8. ⭐私有管理团队的工作流程

  • 在大型私有团队中,通常会有一个整合者(例如项目经理或核心开发人员)来负责代码的合并工作。开发者会在自己创建的分支上进行工作,完成后通过拉请求(pull request)或合并请求(merge request)提交代码。这种工作流更为规范,适用于需要高质量代码管理的大型团队。
  • 示例:Git - 向一个项目贡献

9. 派生的公开项目

在许多公开项目中,你无法直接向主仓库提交代码,因为你没有写入权限。这时,派生(Fork)是常用的操作,具体步骤如下:

  1. 派生原项目:
    • 首先,你需要从原项目的页面点击“Fork”按钮。这样会创建一个你自己的仓库副本,通常在 GitHub、GitLab、BitBucket 等平台上。
  1. 克隆到本地:
    • 使用 git clone 克隆你派生的仓库到本地:
git clone <your-fork-url>
cd <project-directory>
  1. 创建一个新分支进行开发:
    • 在本地仓库中,创建一个新的分支来进行开发,避免直接在 master 分支上工作:
git checkout -b feature-branch
  1. 在新分支上做修改并提交:
    • feature-branch 上进行开发,提交修改:
git add .
git commit -m "Add feature A"
  1. 将修改推送到派生的仓库:
    • 修改完成后,你将分支推送到你自己的远程仓库:
git push origin feature-branch
  1. 创建拉取请求(Pull Request,PR):
    • 然后,前往 GitHub 或其他平台,进入你自己派生的仓库,在该仓库上创建一个 Pull Request。你需要选择将修改合并到原项目的 master 或其他目标分支。
    • 在 PR 描述中,清楚地说明你所做的更改,维护者会基于此来审查你的修改。
  1. 维护者审查和合并:
    • 项目的维护者会审查你的修改,可能会要求你进一步修改,或者直接合并你的工作。如果审查通过,维护者会将你的更改合并到原仓库。
  1. 总结
    1. 派生 是贡献代码的标准方式,尤其是在没有直接写入权限的情况下。
    2. 创建 Pull Request 是你提交修改的正式方式,维护者会在合并之前审查你的工作。
    3. 变基和冲突解决是常见的流程,以确保你的提交与原项目兼容。

10. 变基(Rebase)与冲突解决

  • 变基(Rebase): 如果在提交 PR 之前,原项目的 master 分支发生了更新,可能会出现合并冲突。这时,你可以通过 git rebase 将你的分支基于最新的 master 分支重新应用提交,避免冲突:
git checkout feature-branch
git fetch upstream
git rebase upstream/master

这会将你的更改基于最新的原仓库的 master 分支上,冲突解决后再推送。

  • 合并(Merge): 你也可以选择通过合并(git merge)来解决冲突,具体选择取决于项目的惯例。

结论

向一个项目贡献代码的流程是多种多样的,取决于项目的规模、工作流、贡献者的角色以及提交权限。最重要的是理解项目的工作流、遵循项目的提交准则,并保持代码的清晰与规范。在实际开发中,良好的协作和沟通是确保代码顺利合并和项目成功的关键。

相关文章:

图解Git——分布式Git《Pro Git》

分布式工作流程 Centralized Workflow&#xff08;集中式工作流&#xff09; 所有开发者都与同一个中央仓库同步代码&#xff0c;每个人通过拉取、提交来合作。如果两个开发者同时修改了相同的文件&#xff0c;后一个开发者必须在推送之前合并其他人的更改。 Integration-Mana…...

Linux内核编程(二十一)USB应用及驱动开发

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…...

什么是数据仓库?

什么是数据仓库&#xff1f; 数据仓库&#xff08;Data Warehouse&#xff0c;简称DW&#xff09;是一种面向分析和决策的数据存储系统&#xff0c;它将企业中分散的、异构的数据按照一定的主题和模型进行集成和存储&#xff0c;为数据分析、报表生成以及商业智能&#xff08;…...

计算机网络 (48)P2P应用

前言 计算机网络中的P2P&#xff08;Peer to Peer&#xff0c;点对点&#xff09;应用是一种去中心化的网络通信模式&#xff0c;它允许设备&#xff08;或节点&#xff09;直接连接并共享资源&#xff0c;而无需传统的客户端-服务器模型。 一、P2P技术原理 去中心化架构&#…...

SK海力士(SK Hynix)是全球领先的半导体制造商之一,其在无锡的工厂主要生产DRAM和NAND闪存等存储器产品。

SK海力士&#xff08;SK Hynix&#xff09;是全球领先的半导体制造商之一&#xff0c;其在无锡的工厂主要生产DRAM和NAND闪存等存储器产品。以下是SK海力士的一些主要产品型号和类别&#xff1a; DRAM 产品 DDR4 DRAM 特点: 高速、低功耗&#xff0c;广泛应用于PC、服务器和移…...

FunASR 在Linux/Unix 平台编译

第一步拉取镜像并生成容器&#xff1a; ### 镜像启动 通过下述命令拉取并启动FunASR软件包的docker镜像&#xff1a; shell sudo docker pull \ registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.12 mkdir -p ./funasr-runtime-…...

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…...

物联网网关Web服务器--Boa服务器移植与测试

1、Boa服务器介绍 BOA 服务器是一个小巧高效的web服务器&#xff0c;是一个运行于unix或linux下的&#xff0c;支持CGI的、适合于嵌入式系统的单任务的http服务器&#xff0c;源代码开放、性能高。 Boa 嵌入式 web 服务器的官方网站是http://www.boa.org/。 特点 轻量级&#x…...

vue3学习日记8 - 一级分类

最近发现职场前端用的框架大多为vue&#xff0c;所以最近也跟着黑马程序员vue3的课程进行学习&#xff0c;以下是我的学习记录 视频网址&#xff1a; Day2-17.Layout-Pinia优化重复请求_哔哩哔哩_bilibili 学习日记&#xff1a; vue3学习日记1 - 环境搭建-CSDN博客 vue3学…...

前端实习第二个月小结

时间飞快&#xff0c;第一次实习已经过去两个多月&#xff0c;作一些简单的总结和分享。 注&#xff1a;文章整体会比较轻松&#xff0c;提及的经历、经验仅作参考。 一、关于实习/工作内容 1、工作内容 近期做的是管理后台方面的业务&#xff0c;技术栈&#xff1a;前端re…...

深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术

深入了解卷积神经网络&#xff08;CNN&#xff09;&#xff1a;图像处理与深度学习的革命性技术 导语 卷积神经网络&#xff08;CNN&#xff09;是现代深度学习领域中最重要的模型之一&#xff0c;特别在计算机视觉&#xff08;CV&#xff09;领域具有革命性的影响。无论是图…...

b站视频(网页加客户端)+本地视频 生成回链

b站视频(网页加客户端)本地视频 生成回链 引言 基于上一篇博客方案 本地视频进度加入笔记根据进度快速锁定视频位置 我想着只有本地的话, 那b站上的视频, 不是每次都得下载下来吗? 如果是一套课程, 直接下载, 然后视频处理成mp3,还好, 如果只是一个视频, 每次这样处理就有点…...

3.数据库系统

3.1数据库的基本概念 3.1.1:数据库体系结构 3.1.1.1集中式数据库系统 数据是集中的 数据管理是集中的 数据库系统的素有功能(从形式的用户接口到DBMS核心)都集中在DBMS所在的计算机 3.1.1.2C/S结构 客户端负责数据表示服务服务器主要负责数据库服务 数据库系统分为前端和后端…...

红米k40s设备驱动设备驱动树

github地址# 链接https://github.com/autoandroida/vendor_xiaomi_munch...

Linux-C/C++--文件 I/O 基础

在 Linux 中&#xff0c;文件 I/O 是指通过系统调用或命令对文件进行的输入输出操作。Linux 操作系统提供了强大的文件操作功能&#xff0c;使得用户和程序可以方便地对文件进行读取、写入、修改和管理。文件 I/O 指的是对文 件的输入/输出操作&#xff0c;说白了就是对文件的读…...

HarmonyOS NEXT开发进阶(六):HarmonyOS NEXT实现嵌套 H5 及双向通信

文章目录 一、前言二、鸿蒙应用加载Web页面2.1 加载网络地址页面2.2 加载本地H5页面 三、实现Web组件 H5 层与鸿蒙应用层进行相互通讯3.1 鸿蒙应用向 H5 页面发送数据3.2 H5页面向鸿蒙应用发送数据 四、拓展阅读 一、前言 随着HarmonyOS NEXT的快速发展&#xff0c;越来越多的…...

【Flink系列】4. Flink运行时架构

4. Flink运行时架构 4.1 系统架构 Flink运行时架构——Standalone会话模式为例 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager是一个Flink集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。也就是说&#xff0c;每个应用都应该被…...

动态主机配置协议 (DHCPv4)介绍,详细DHCP协议学习笔记

定义 动态主机配置协议 (DHCP) 是一种用于集中对用户 IPv4 地址进行动态管理和配置的技术。为与 IPv6 动态主机配置协议 (DHCPv6) 进行区分&#xff0c;本文统一将动态主机配置协议称为 DHCPv4。 DHCPv4 协议由 RFC 2131 定义&#xff0c;采用客户端/服务器通信模式&#xff…...

Vue.js组件开发-如何处理跨域请求

在Vue.js组件开发中&#xff0c;处理跨域请求&#xff08;CORS&#xff0c;即跨来源资源共享&#xff09;通常不是直接在Vue组件中解决的&#xff0c;而是需要后端服务器进行相应的配置&#xff0c;以允许来自不同源的请求。不过&#xff0c;前端开发者也需要了解一些基本的COR…...

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

智警杯备赛--excel模块

数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中&#xff0c;点击确定 这是最终结果&#xff0c;但是由于环境启不了&#xff0c;这里用的是自己的excel&#xff0c;真实的环境中的excel根据实训…...

break 语句和 continue 语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…...