Github 这东西怎么用?相信有很多人还没有自己操作过,这下面给大家推荐一位大佬的文章,希望有所帮助。
之前有幸参与到一个开源项目中,该项目是一个算法知识的汇总仓库(OI-Wiki),放在 Github 上由大家一起完善。公众号的上篇文章:
如果你不想看下去了,我直接强调一个很重要,但又很容易忽视的问题:一定要认真配置用户信息,否则的话你的贡献就是匿名提交,不会被计入贡献者名单。
怎么配置用户信息?以我的账户为例(我的用户名是 fudonglai),在 shell 输入如下命令:
git config --global user.name fudonglai
git config --global user.email [email protected]
然后输入如下命令检查一下:
git config --list
如图,已经配置上了:
网上很多文章都没有强调这一步的重要性,因为我们大部分时候就是建个仓库,没事找点东西往上传,纯属自嗨,有没有配置信息问题不大。
但是如果你花了很多心血做的东西,想分享给大家混个脸熟,最后发现你是匿名贡献,尴不尴尬?
来看看不配置的后果。这种知识仓库类型的项目一般不允许你在提交的内容中添加作者信息,但是会通过技术手段在文末维护一个作者列表,链接向你的 Github 主页。我就没认真写用户名,就出现了这种情况:
我估计系统是把我的用户名配置前面添加上路径:https://github.com/ 来定位到用户主页,如果不配置用户名,默认用户名是“Your Name”,含有空格,是个无效的地址了。
另外,在你的仓库界面也可以看出你的用户名信息是否配置正确,如果正确的话应该显示你的头像,如下两张图可以对比出来:
头像显示失败:
这一点就是我最想强调的一点。另外,每次更换到新的 Git 环境,比如说换了台电脑,都要重新配置本地的 Git 信息,以免如上问题发生。
好了,接下来,根据我这次的实操经历写下为开源项目做贡献的基本流程。
第一步,看项目的公告。比如说我这个项目要求贡献者在准备内容时需要开一个 issue,说明自己在补充哪一部分内容,让其他贡献者看到,以免多个贡献者同时修改同一部分内容,否则会造成冲突,而且造成了无谓的工作量。
第二步,把该项目 fork 到自己的 Github 仓库,然后下载(clone)到本地,然后就可以直接在本地进行修改补充了。
第三步,比如说两天之后,我完成了想提交的内容,从本地将新增内容 push 到自己的 Github 仓库,然后就可以点击 pull request 按钮申请向该项目的主分支合并内容了。
如果没人跟我修改了同一个文件,就可以自动合并,等待维护者审核内容就行了。
但是,如果有人未遵守公告,和我修改了相同文件,那么我的合并将会出现冲突。怎么解决呢?
首先,要明白出现冲突的原因。在我往项目里添加内容的这两天,很多贡献者在贡献内容,导致现在的项目内容和我当时 fork 到我的仓库里的项目内容有了不同。
比方说我当时 fork 过来的版本是 1.0,结果现在该项目更新了 3 次,经历了版本 1.1, 1.2,到达了版本 1.3,但我仓库里 fork 过来的项目又不会同步更新,仍然为 1.0 版本。
而且我在版本 1.0 的基础上完成了我的内容添加之后,将这些添加 push 到了我的 Github 仓库,就是说我的 Github 仓库里现在的版本是一个全新的项目版本,权且称为 my1.1 版本。
画个图理解一下状况:
所谓冲突就是,如果 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 版本合并了。
至此,冲突解决完毕,Git 可以自动合并,等待维护者审核即可。
文末写一个说话的技巧吧:尽量把“你们怎么搞得?”替换成“是我哪里做错了吗?”。
这次我不是没设置用户信息,后来发现贡献者列表没有我吗,然后我就去开了个 issue 问项目维护者:“整篇文章都是我写的,为啥偏偏没有我的名字?请尊重贡献者的成果。”
这么问倒是挺正当的,毕竟出问题了呀!但明显是带着情绪,有点“你们怎么搞得?”的意思。结果几个维护者就回复了我的 issue,告知了我原因是我的 Git 配置有问题,还允许我在文末手动添加了作者。
工作、生活中也是一样,很多时候负面情绪都是无知导致的,对小白来说尤其如此。同样的问题用点“话术”表达,听起来就完全不一样了。所以作为新人,放低点身段,给对方个台阶,表达委婉点,没坏处。
文 章 推 荐 ?