【技巧】如何为开源社区做贡献

2023-05-16

预计阅读时间: 6分钟

Github 这东西怎么用?相信有很多人还没有自己操作过,这下面给大家推荐一位大佬的文章,希望有所帮助。

之前有幸参与到一个开源项目中,该项目是一个算法知识的汇总仓库(OI-Wiki),放在 Github 上由大家一起完善。公众号的上篇文章:

如果你不想看下去了,我直接强调一个很重要,但又很容易忽视的问题:一定要认真配置用户信息,否则的话你的贡献就是匿名提交,不会被计入贡献者名单。

怎么配置用户信息?以我的账户为例(我的用户名是 fudonglai),在 shell 输入如下命令:

git config --global user.name fudonglai
git config --global user.email labuladong@gmail.com

然后输入如下命令检查一下:

git config --list

如图,已经配置上了:

640?wx_fmt=png

网上很多文章都没有强调这一步的重要性,因为我们大部分时候就是建个仓库,没事找点东西往上传,纯属自嗨,有没有配置信息问题不大。

但是如果你花了很多心血做的东西,想分享给大家混个脸熟,最后发现你是匿名贡献,尴不尴尬?

来看看不配置的后果。这种知识仓库类型的项目一般不允许你在提交的内容中添加作者信息,但是会通过技术手段在文末维护一个作者列表,链接向你的 Github 主页。我就没认真写用户名,就出现了这种情况:

640?wx_fmt=jpeg

我估计系统是把我的用户名配置前面添加上路径:https://github.com/ 来定位到用户主页,如果不配置用户名,默认用户名是“Your Name”,含有空格,是个无效的地址了。

另外,在你的仓库界面也可以看出你的用户名信息是否配置正确,如果正确的话应该显示你的头像,如下两张图可以对比出来:

640?wx_fmt=jpeg

头像显示失败:

640?wx_fmt=jpeg

这一点就是我最想强调的一点。另外,每次更换到新的 Git 环境,比如说换了台电脑,都要重新配置本地的 Git 信息,以免如上问题发生。

好了,接下来,根据我这次的实操经历写下为开源项目做贡献的基本流程。

第一步,看项目的公告。比如说我这个项目要求贡献者在准备内容时需要开一个 issue,说明自己在补充哪一部分内容,让其他贡献者看到,以免多个贡献者同时修改同一部分内容,否则会造成冲突,而且造成了无谓的工作量。

第二步,把该项目 fork 到自己的 Github 仓库,然后下载(clone)到本地,然后就可以直接在本地进行修改补充了。

第三步,比如说两天之后,我完成了想提交的内容,从本地将新增内容 push 到自己的 Github 仓库,然后就可以点击 pull request 按钮申请向该项目的主分支合并内容了。

如果没人跟我修改了同一个文件,就可以自动合并,等待维护者审核内容就行了。

640?wx_fmt=png

但是,如果有人未遵守公告,和我修改了相同文件,那么我的合并将会出现冲突怎么解决呢?

640?wx_fmt=png

首先,要明白出现冲突的原因。在我往项目里添加内容的这两天,很多贡献者在贡献内容,导致现在的项目内容和我当时 fork 到我的仓库里的项目内容有了不同。

比方说我当时 fork 过来的版本是 1.0,结果现在该项目更新了 3 次,经历了版本 1.1, 1.2,到达了版本 1.3,但我仓库里 fork 过来的项目又不会同步更新,仍然为 1.0 版本。

640?wx_fmt=jpeg

而且我在版本 1.0 的基础上完成了我的内容添加之后,将这些添加 push 到了我的 Github 仓库,就是说我的 Github 仓库里现在的版本是一个全新的项目版本,权且称为 my1.1 版本。

画个图理解一下状况:

640?wx_fmt=png

所谓冲突就是,如果 1.2 版本中的修改部分和我的 my1.1 版本的修改部分有重叠,那么 Git 就不知道应该以 my1.1 为准还是以 1.2 版本为准了,无法自动合并,这就是冲突。

如果出现冲突,如何让我的 my1.1 版本和该项目的最新版本 1.3 融合呢?我这样操作的:把我的仓库也更新成 1.3 版本,然后在 1.3 版本的基础上修改提交。

如何把我的版本更新成项目最新版本?最简单的办法就是删了仓库重新 fork 最新仓库。

主要讲下不删库的方法,稍微麻烦些,但能更深入理解 Git:先把 my1.1 退回到公共版本 1.0,从 1.0 可以无冲突更新到版本 1.3,然后在 1.3 的基础上进行我的内容添加,形成版本 my1.3,这时候请求合并就能跳过刚才那个冲突了。

首先,把 my1.1 中添加的内容保存一个副本,以便手动合并到 1.3 版本上。然后把我的 my1.1 版本回退成 1.0 版本,以便和最新版 1.3 合并。如下命令在本地回退版本:

git reset --hard HEAD^

HEAD 就是本地仓库最新版本 my1.1 ,加个 ^ 就是前一个版本 1.0 。然后对我的 Github 仓库也进行版本的强行退回:

git push -f

PS:一般不建议使用 reset 和 -f 的命令的。因为这种退回版本的方法容错性很差,一旦回退失误就不能再穿越回去了,有替代方案,可以搜索【廖雪峰的 Git 教程】。

然后用原项目的地址,添加一个原项目分支,名字就叫“upstream”吧,拉取项目的最新 1.3 版本:

git remote add upstream https://github.com/24OI/OI-wiki.git
git fetch upstream

现在我的 master 分支和 upstream 分支是可以自动合并的,把 upstream 合并到 master 之后就是最新版本了:

git merge upstream/master

现在把我修改的文件放进最新版本,推送进我的仓库,就形成了 my1.3 版本,就能跳过之前的冲突,和 1.3 版本合并了。

640?wx_fmt=png

至此,冲突解决完毕,Git 可以自动合并,等待维护者审核即可。

文末写一个说话的技巧吧:尽量把“你们怎么搞得?”替换成“是我哪里做错了吗?”。

这次我不是没设置用户信息,后来发现贡献者列表没有我吗,然后我就去开了个 issue 问项目维护者:“整篇文章都是我写的,为啥偏偏没有我的名字?请尊重贡献者的成果。”

这么问倒是挺正当的,毕竟出问题了呀!但明显是带着情绪,有点“你们怎么搞得?”的意思。结果几个维护者就回复了我的 issue,告知了我原因是我的 Git 配置有问题,还允许我在文末手动添加了作者。

工作、生活中也是一样,很多时候负面情绪都是无知导致的,对小白来说尤其如此。同样的问题用点“话术”表达,听起来就完全不一样了。所以作为新人,放低点身段,给对方个台阶,表达委婉点,没坏处。

       文 章 推 荐 ?      

你的点赞是对我的鼓励。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【技巧】如何为开源社区做贡献 的相关文章

随机推荐

  • Linux USB (目录)

    1 USB 总线简介 2 USB 协议分析 3 USB Host 详解 4 USB Device 详解 5 usbip USB Over IP 使用实例 6 USB HC UDC 测试 7 Linux 配置 ADBD
  • Linux usb 5. usbip (USB Over IP) 使用实例

    文章目录 0 简介1 Server 配置2 Client 配置参考资料 0 简介 USB Over IP 是一种应用很多的场景 xff0c 目前已经有现成的解决方案 usbip linux 和 windows 环境下都有配套软件 xff0c
  • 最全随机抽样算法(从N个数中抽取M个等)集合

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 欢迎大家star xff0c 留言 xff0c 一起学习进步 1 从N个数中等概率抽取M个数 从N个样本
  • Linux usb 6. HC/UDC 测试

    文章目录 1 背景介绍2 Device gadget zero 2 1 96 gadget zero 96 创建2 2 SourceSink Function2 3 Loopback Function 3 Host usbtest ko 3
  • Linux usb 7. Linux 配置 ADBD

    文章目录 1 简介2 ADBD 源码3 Gadget Device 配置3 1 functionfs3 2 legacy 方式配置 functionfs3 3 configfs 方式配置 functionfs3 4 adb 使用配置 参考资
  • HW-RTOS 概述

    文章目录 1 背景介绍1 1 OS 实时难题1 2 Linux 实时补丁1 3 Xenomai 43 Linux 双内核1 4 HW RTOS1 5 More 2 优化点1 xff1a API2 1 原理介绍2 1 1 Software A
  • RISCV MMU 概述

    1 背景简介 Linux 内存管理包含很多内容 xff0c 主要知识点可以参考 Linux Mem 本文只描述其中的一个知识点 Paging and MMU 本文以全志 D1 为例 xff0c 包含了平头哥出品的一颗 Riscv64 的 C
  • 主流 RTOS 评估

    1 RT Thread RT Thread 是国内出产的一款非常优秀的 RTOS 它和 FreeRTOS uCos 等经典 RTOS 最大的不同是 xff1a 它不仅仅是一个实时内核 xff0c 还具备丰富的中间层组件 它提供了一个完整的软
  • Linux mem 2.8 Kfence 详解

    1 原理介绍 Kfence Kernel Electric Fence 是 Linux 内核引入的一种低开销的内存错误检测机制 xff0c 因为是低开销的所以它可以在运行的生产环境中开启 xff0c 同样由于是低开销所以它的功能相比较 KA
  • Linux Phy 驱动解析

    文章目录 1 简介2 phy device2 1 mdio bus2 2 mdio device2 3 mdio driver2 4 poll task2 4 1 自协商配置2 4 2 link 状态读取2 4 3 link 状态通知 3
  • 程序媛工作几年后的感受!体验?

    黑客技术 点击右侧关注 xff0c 了解黑客的世界 xff01 Java开发进阶 点击右侧关注 xff0c 掌握进阶之路 xff01 Python开发 点击右侧关注 xff0c 探讨技术话题 xff01 作者 xff1a hq nuan 来
  • ubuntu 通过 apt-get 安装软件失败时的解决方案

    最近在 vmware上的ubuntu系统下安装 软件时出现安装失败情况 xff0c 在网上搜了一通 xff0c 终于找到了解决方案 遇到的问题和解决方案如下 xff1a 一 apt get install vim二 apt get upda
  • JAVA自学之路 三:要动手

    原创 尚学堂科技 马士兵老师 JAVA自学之路 三 要动手 转载请注明出处 http www bjsxt com zixue zixuezhilu 3 html 无论如何 xff0c 请坚持不懈的动手实验 xff01 学习Java要动手 x
  • Eigen库的安装

    运行命令 xff1a sudo apt get install libeigen3 dev 假设默认安装到 usr local include里 可在终端中输入locate eigen3查看位置 xff0c 若实际中默认安装到了 usr i
  • 搭建自己的简易服务器(公网)

    大部分时候做嵌入式开发的 xff0c 如果是wifi 可以工作在局域网 xff0c 至于物联网设备 xff0c 插手机卡的那种就需要公网ip 测试起来相对比较麻烦 xff0c 电信宽带用户有的可以映射使用 xff0c 但是ip会改变 xff
  • CPP服务器08--http请求响应实现

    http服务设计 对于静态页面服务器来说 xff0c 其工作流程如下 xff1a 接收客户端消息 解析出http请求报文 业务逻辑 xff0c 拼装响应报文 发送给客户端结果 http连接类 设计目标 xff1a 将客户端唯一文件描述符封装
  • Linux C Socket 编程

    以下内容转载自 https www cnblogs com PikapBai p 13964866 html 闪念基因2020 11 20 12 01 20 本文作者 xff1a 她爱喝水 本文链接 xff1a https www cnbl
  • Linux中ROS风格的物理PWM引脚控制,C++代码

    背景 xff1a 拿到一个舵机 xff0c 一个安装了linux和ROS的 小黑盒子 以及一个干干净净啥也不会的脑子 xff0c 然后我从零开始学的 xff0c 总算找到了个能操作舵机的程序 现在只是能跑的状态 xff0c 提供一种思路 x
  • ROS二次开发需要用到的大部分Linux命令

    背景 xff1a 拿到了一架有机载电脑的全部开源的无人机 xff0c 机载电脑安装了ubuntu20 04 xff0c ROS1 xff0c 上面已经在运行了一些程序 我以前只是听过linux xff0c 根本不知道ROS 那么现在需要快速
  • 【技巧】如何为开源社区做贡献

    预计阅读时间 xff1a 6 分钟 Github 这东西怎么用 xff1f 相信有很多人还没有自己操作过 xff0c 这下面给大家推荐一位大佬的文章 xff0c 希望有所帮助 之前有幸参与到一个开源项目中 xff0c 该项目是一个算法知识的