图解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)来解决冲突,具体选择取决于项目的惯例。

结论

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

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

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

相关文章

【高阶数据结构】布隆过滤器(BloomFilter)

1. 概念 1.1 背景引入 背景&#xff1a;在计算机软件中&#xff0c;一个常见的需求就是 在一个集合中查找一个元素是否存在 &#xff0c;比如&#xff1a;1. Word 等打字软件需要判断用户键入的单词是否在字典中存在 2. 浏览器等网络爬虫程序需要保存一个列表来记录已经遍历过…

【json_object】mysql中json_object函数过长,显示不全

问题&#xff1a;json只显示部分 解决&#xff1a; SET GLOBAL group_concat_max_len 1000000; -- 设置为1MB&#xff0c;根据需要调整如果当前在navicat上修改&#xff0c;只有效本次连接和后续会话&#xff0c;重新连接还是会恢复默认值1024 在my.ini配置文件中新增或者修…

计算机网络 (52)秘钥分配

一、重要性 在计算机网络中&#xff0c;密钥分配是密钥管理中的一个核心问题。由于密码算法通常是公开的&#xff0c;因此网络的安全性主要依赖于密钥的安全保护。密钥分配的目的是确保密钥在传输过程中不被窃取或篡改&#xff0c;同时确保只有合法的用户才能获得密钥。 二、方…

第35天:安全开发-JavaEE应用原生反序列化重写方法链条分析触发类类加载

时间轴&#xff1a; 序列化与反序列化图解&#xff1a; 演示案例&#xff1a; Java-原生使用-序列化&反序列化 Java-安全问题-重写方法&触发方法 Java-安全问题-可控其他类重写方法 Java-原生使用-序列化&反序列化 1.为什么进行序列化和反序列化&#xff1…

MindAgent:基于大型语言模型的多智能体协作基础设施

2023-09-18 &#xff0c;加州大学洛杉矶分校&#xff08;UCLA&#xff09;、微软研究院、斯坦福大学等机构共同创建的新型基础设施&#xff0c;目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准&#xff0c;调度多智…

Excel 技巧17 - 如何计算倒计时,并添加该倒计时的数据条(★)

本文讲如何计算倒计时&#xff0c;并添加该倒计时的数据条。 1&#xff0c;如何计算倒计时 这里也要用公式 D3 - TODAY() 显示为下面这个样子的 然后右键该单元格&#xff0c;选 设置单元格格式 然后点 常规 这样就能显示出还书倒计时的日数了。 下拉适用到其他单元格。 2&a…

rocketmq基本架构

简介 Name server 负责broker注册、心跳&#xff0c;路由等功能&#xff0c;类似Kafka的ZKname server节点之间不互相通信&#xff0c;broker需要和所有name server进行通信。扩容name server需要重启broker&#xff0c;不然broker不会和name server建立连接producer和consum…

国产编辑器EverEdit - 大纲视图

1 大纲视图 1.1 应用场景 在编辑较长代码文件时&#xff0c;使用大纲视图可以方便的检视当前文件的变量、函数等信息&#xff0c;方便在不同函数间跳转&#xff0c;对整个文档的全貌了然于胸。   在编辑XML文档时&#xff0c;通过展示XML文件的层次结构、节点布局&#xff0…

Linux中的基本指令(一)

一、Linux中指令的存在意义 Linux中&#xff0c;通过输入指令来让操作系统执行&#xff0c;以此达到控制操作系统的目的&#xff0c;类似于Windows中的双击&#xff0c;右键新建文件&#xff0c;新建文件夹等 1.补&#xff1a;关于屏幕的几个操作指令 ①清屏指令 clear 回…

2025/1/21 学习Vue的第四天

睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候&#xff0c;普通得定义一个对象与属性。 <!DOCTYPE html> <h…

Go Map 源码分析(一)

Go语言中的map是通过哈希表实现的&#xff0c;其底层结构和实现机制如下&#xff1a; 一、hash 结构 hmap结构体&#xff1a;是map的头部结构&#xff0c;主要字段及含义如下&#xff1a; count&#xff1a;表示当前哈希表中的元素数量&#xff0c;与len()函数相对应。flags…

Linux-C/C++--深入探究文件 I/O (上)(文件的管理、函数返回错误、exit()、_Exit()、_exit())

经过上一章内容的学习&#xff0c;相信各位读者对 Linux 系统应用编程中的基础文件 I/O 操作有了一定的认识和理解了&#xff0c;能够独立完成一些简单地文件 I/O 编程问题&#xff0c;如果你的工作中仅仅只是涉及到一些简单文件读写操作相关的问题&#xff0c;其实上一章的知识…

【机器学习实战中阶】音乐流派分类-自动化分类不同音乐风格

音乐流派分类 – 自动化分类不同音乐风格 在本教程中,我们将开发一个深度学习项目,用于自动化地从音频文件中分类不同的音乐流派。我们将使用音频文件的频率域和时间域低级特征来分类这些音频文件。 对于这个项目,我们需要一个具有相似大小和相似频率范围的音频曲目数据集…

Walrus Learn to Earn计划正式启动!探索去中心化存储的无限可能

本期 Learn to Earn 活动将带领开发者和区块链爱好者深入探索 Walrus 的技术核心与实际应用&#xff0c;解锁分布式存储的无限可能。参与者不仅能提升技能&#xff0c;还能通过完成任务赢取丰厚奖励&#xff01;&#x1f30a; 什么是 Walrus&#xff1f; 数据主权如今正成为越…

git 常用命令 git archive

git archive 是 Git 中用于创建一个包含指定提交或分支中所有文件的归档文件&#xff08;如 .tar 或 .zip&#xff09;的命令。这个命令非常适合用于分发项目快照、备份代码库或导出特定版本的文件。 git archive --formatzip --outputproject.zip HEAD …

Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)

本文讲了如何在Excel中抠图头像&#xff0c;换背景色。 1&#xff0c;如何在Excel中抠图头像&#xff0c;换背景色 大家都知道在PS中可以很容易抠图头像&#xff0c;换背景色&#xff0c;其实Excel中也可以抠简单的图&#xff0c;换背景色。 ※所用头像图片为百度搜索&#x…

持续升级《在线写python》小程序的功能,文章页增加一键复制功能,并自动去掉html标签

增加复制按钮后的界面是这样的 代码如下&#xff1a; <template><view><x-header></x-header><view class"" v-if"article_info"><view class"kuai bgf"><view class"ac fs26"><img sr…

FPGA与ASIC:深度解析与职业选择

IC&#xff08;集成电路&#xff09;行业涵盖广泛&#xff0c;涉及数字、模拟等不同研究方向&#xff0c;以及设计、制造、封测等不同产业环节。其中&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;和ASIC&#xff08;专用集成电路&#xff09;是两种重要的芯片类型…

【Linux】Linux入门(三)权限

目录 前提权限概念whoami指令 Linux权限管理文件访问者的分类&#xff08;人&#xff09;file指令权限信息权限的表示方法 chmod指令 更改权限chown指令 修改文件&#xff0c;文件夹所属用户和用户组 权限掩码umask&#xff08;权限掩码&#xff09; 粘滞位 前提 请先看下面这…

蓝桥与力扣刷题(73 矩阵置零)

题目&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&…