大家好这里是Eric。今天写一篇文章记录下平时工作中在使用Git和GitHub遇到的问题,以免忘记。
在程序员实际开发过程中绕不过Git、GitHub这两样东西的。本文章是自己实际开发当中遇到的一些问题以及解决思路,在此做一个记录。文章简单介绍Git、GitHub以及在实际开发中如何配合实用,帮助自己管理代码以及团队协作。
GitHub
GitHub是什么?
GitHub是一个代码托管平台,你可以在平台上管理你的代码,保存你的代码。
- 软件开源,编写软件对所有人开源
- 方便团队协作:在团队开发过程中,GitHub(国内可以使用Gitee)可以帮助我们管理代码,查看提交人员,修改的模块等
Github的基本使用
注册与登录
1. 首先进入GitHub官网(GitHub)
2. 登录
注册之后通过邮箱(用户名)和密码登录 
3. 注册
输入邮箱注册,并且到邮箱内部验证 
仓库创建与密钥处理
在实际开发当中,一个大型项目往往需要多个版本不断地迭代更新,我们每一个版本都可以通过Git指令将代码推送到GitHub仓库当中管理。
1. 创建仓库 
注意点:
- 项目命名:笔者习惯是大驼峰加上中、下划线,例如:Student_System或者Student-System
- 项目描述:简单描述项目
2. 进入仓库
注意点
- GitHub默认地分支是main,而Git的默认分支是master
- 修改GitHub中的默认分支为master(在Settings中修改)
- 创建一个新的本地分支main进行管理
- SSH与HTTPS
- SSH(
git@github.com:用户名/juejin.git):22端口,需要本地生成SSH密钥对,再把公钥上传到服务器,速度慢,适合内部访问。 - 如果需要在此电脑提交到其他账号仓库,那么就需要当前帐号的账户已经配置了本地的ssh-key才能有权限访问。
- HTTPS(
https://github.com/用户名/juejin.git):443端口,需要用户名和密码授权(每次都要登录),比较快,属于匿名访问适合开源项目。
- SSH(
3. 配置ssh-key
打开首页——>右上角头像打开设置——>找到
SSH and GPS Keys——>打开git bash——>查看当前密钥——>复制到当前页面中添加
如果没有SSH Key,那么就生成一下,相关指令
# 进入ssh目录
cd ~/.ssh/
# 查看文件列表
ls
# 查看密钥
cat id_rsa.pub
# 生成密钥
# 这里可以不断回车,然后再回到第一步查看密钥
ssh-keygen -t rsa -C "邮箱地址"
个人开发与团队协作
个人开发
当仓库创建完成后,此时远程仓库Remote已经搭建好了,我们就需要将本地的代码推送,这里采用juejin.html文件进行演示。
- 先进行初始化,添加git仓库:
git init,当前目录会创建.git文件夹 - 在文件内修改代码,并且通过
git add .将所有文件添加到暂存区
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>这里是本地代码v1.0</div>
</body>
</html>
-
查看当前项目当前状态:
git status。到这里会发现git提示“要提交的修改”已经存在当前添加进去的文件了。
-
提交代码到本地仓库:
git commit -m 'this is local modified-v1.0'
-
添加远程仓库:
git remote add origin git@github.com:用户名/juejin.git。这里远程仓库名称:origin。 -
将代码进行推送:
git push -u origin master。origin:远程仓库名(远程主机名) master:当本地分支名和远程分支名一致时,可以简写。这个命令是将本地的分支推送到origin主机的master分支上,与git push -u origin master:master一致
-
到这个时候已经完成了一次代码的推送,可以到GitHub上刷新查看

团队协作
1. 分支问题
在团队协作中会出现许多情况,由于一个仓库是由多个人进行维护、开发的,那么就需要规定好各种二氧的分支。笔者在团队开发时一般会以当前分支作为默认标准:
master:主分支。经过测试没有bug可以部署生产环境的分支,只能由release和htfix分支合并。develop:开发的分支。平行于master分支。功能模块开发交给feature分支,测试给release合并。- 例如:现在需要开发一个新的功能login,这时候需要从
develop分支上创建检出feature分支fb-login,在功能完成之后merge到develop分支上。(这里可以使用git hooks钩子,这里后面补充解释)。
- 例如:现在需要开发一个新的功能login,这时候需要从
feature:功能模块开发分支。在团队开发中每个人都需要维护一个自己的feature分支,并进行开发工作,开发完成之后会将此分支merge到develop分支上。一般用于开发新功能和项目维护。创建分支名称一般是:feature/login_module或者feature-login_module- 例如:小王小明分别开发login和register功能,那么就需要在主分支上检出,两个功能开发完成之后合并到
develop。
- 例如:小王小明分别开发login和register功能,那么就需要在主分支上检出,两个功能开发完成之后合并到
hotfix:热修复分支。由master分支检出,进行线上版本的bug修复,修复完成之后需要merge回develop和master分支,之后可以删除,属于临时分支。fix:补丁分支。用于检修develop分支的bug,修复完成后需合并回develop分支。relase:发布分支。从develop分支检出,用于发布前的测试,可以进行简单的bug修复。bug复杂的时候需要merge回develop分支进行修改。测试完成之后也需要merge到master和develop分支上。
2. 加入组织或者协作者
打开设置页面——>Access/Collaborators——>Add People
添加协作者之后,协作者可以访问仓库
团队开发协作流程(具体情况就公司规定执行,这里只是大概流程)
从上面的团队协作当中已经说明的非常的清楚了。在团队开发当中我们一般不会在develop和master两个分支上进行开发。
这里我通过画图进行一个简单的示范
流程如下:
- 项目
master分支中创建一个新的分支叫develop - 当有新功能开发时,从
develop分支创建一个新的功能分支,也就是前面提到的feature,例如假设公司中有AB员工:- A员工开发一个新的功能叫create-form,那么现在他创建了一个新的功能分支
create-form进行开发 - B员工开发一个新的功能叫create-page,那么现在他创建了一个新的功能分支
create-form进行开发
- A员工开发一个新的功能叫create-form,那么现在他创建了一个新的功能分支
- 此时B员工先开发完成,所以他先提交:
- 首先拉取
develop分支,获得最新状态,然后以此创建临时分支temp1,然后将自己开发的代码合并到这个临时分支temp1当中去,并且解决冲突 - 冲突解决完成后将临时分支
temp1再合并到develop分支中去(这个过程中还是建议再拉取,因为期间也有可能被提交了新的内容,也可能会面临同时提交的情况)
- 首先拉取
- 而后,A员工也开发完成了,由于B员工已经成功的将新功能添加到了develop分支中去,所以此时
develop分支已经包含了B员工开发的新代码:- A员工也是重复上述工作,先拉取
develop分支保证状态最新,然后创建临时分支,之后合并到临时分支 - 冲突解决完成后将临时分支合并到
develop分支中
- A员工也是重复上述工作,先拉取
- 合并完成后临时分支可以删除,然后以此重复步骤,合并到master分支
注意事项:
- 在实际开发当中不是开发完成后就立马将其合并到
develop的这个需要注意,而需要提交到对应的分支或者等待测试人员测试,确认代码无误后再合并 - 创建临时分支就是避免之间在
develop分支上合并以及解决冲突,避免无法处理的冲突导致deveop分支内的代码混乱 - 不要在
develop和master上直接进行开发!!!! - 记得
git pull!!!记得git pull!!!记得git pull!!! - 如果出现无法解决的冲突,则需要商量看看最后需要保存哪一版本的代码,然后再重新合并
- 在合并的时候不要选择
变基,而是选择合并merge
Git
什么是Git
官方解释是这样的: Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git (git-scm.com)
翻译过来就是:他是一个分布式版本控制系统,作用是快速的管理大小型项目代码。他可以通过指令直接对代码进行上传、拉取等操作
Git的作用以及状态
状态:
- 已修改:modified(修改了文件但是没有将其提交到缓存区)
- 已暂存:staged(对当前版本做标记,存在下次提交列表中)
- 已提交:committed(字面意思)
用图示表示如下:
Git 工作区、暂存区和版本库 | 菜鸟教程 (runoob.com) 
Git的基础指令
git add [filename]:添加指定文件到缓存区
git add .:添加当前目录中所有文件到缓存区
git commit -m '[your message]':提交代码到本地仓库
git commit -a:直接跳过暂存区,从工作区–>Git仓库。此时文件处于未修改的状态(最终状态)
git remote add [远程仓库名称] [远程仓库地址]:添加并绑定远程仓库
git push -u [远程仓库名称] [当前提交的分支]:[远程仓库分支]:将代码提交到远程仓库。
-u:表示默认指定主机,后面可以不需要添加任何参数使用git push -all将本地所有分支推送到远程主机
git push [远程仓库名称] --delete [远程分支名称]
git merge [当前分支]:将当前选中的分支合并到当前分支。
--no-ff:保留信息的合并
例如:当前分支是master,存在分支dev,那么git merge dev:将dev分支合并到master分支
git status -s:精简方式展现文件状态
git status –short:精简方式
git checkout -b [本地分支名称] [远程仓库名称]/[远程仓库分支名称]:从远程仓库中把对应的远程分支下载到本地,并把下载的本地分支进行重命名
推荐工具
- git可视化工具
- VSCode + git graph