使用 GIT 和 GITHUB 提高开发效率
GITHUB
Pull Request
Pull Request
是指开发者在本地对源代码进行修改后,向github中托管的git仓库请求合并的功能。
对特定用户进行评论
@用户名
,对方就可以接到通知,查看Issue
@组织名/团队
,可以让该团队的所有成员收到通知。用户名/仓库名# 编号
,链接到指定仓库所对应的Issue编号。# 编号
,连接到当前仓库对应的Issue编号。
Github Flavored Markdown
- github中,所有文字输入功能都可以用Github Flavored Markdown(GFM)语法进行描述。还可以在评论中添加文字表情。
社会化编程(SOCIAL CODING)
不要闭目塞耳,要接触不同的文化。注意社区那些日新月异的源代码、技术、设计以及文化,会对自己编写的源代码成果带来巨大影响。
看facebook、twitter能了解一个人的品行,而看github能了解一个程序员的实力。
在github上,看
New Feed
可以看到你关注的人正在做的开发,能同时关注代码与人。
github提供的主要功能
git仓库,免费建立任意个github提供的git仓库。
Organization,使用公开仓库可以免费创建organization账户,以交流群或者IT小团体形式进行软件开发可以试试。
Issue,将一个任务或问题分配给一个Issue进行跟踪和管理的功能。在github上,没当进行pull request都会同时创建一个Issue。在Git 的提交信息中写上Issue 的ID(例如“#7”),GitHub 就会自动生成从Issue 到对应提交的链接。
WiKi,这个功能常用在开发文档或手册的编写中(GFM语法)。通过wiki功能,任何人都能随时对一篇文章进行更改和保存,因此可以多人共同完成一篇文章。wiki也是作为git仓库进行管理的。
pull request,通过pull request功能向别人的仓库提出申请,请求对方合并。还可以对pr和源代码差别进行评论。
GIT的导入
版本管理:就是管理更新的历史记录。
版本管理系统:集中型,分散型。
集中型:将数据集中放在服务器之中,只存在一个仓库,有利于管理。但一直需要网络,否则无法获取最新的源代码。服务器故障就导致数据消失。
分散型:将仓库fork给每一个用户,fork出来的仓库与原仓库是两个不同的仓库,开发者可以对fork出来的仓库随意编辑。
由于本地的开发环境就有仓库,所以不必连接到远程仓库就可以进行开发。设置姓名和邮箱地址:
1
2$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email@example.com"设置SSH Key:github上连接已有仓库时的认证是通过使用SSH的公开秘钥认证方式进行的。
$ ssh-keygen -t rsa -C "your_email@example.com"
,id_rsa是私有秘钥,id_rsa.pub是公开秘钥。在github中添加公开秘钥(id_rsa.pub),今后就可以用秘钥进行认证了。watch功能获取最新的开发信息。如果你经常使用某个软件或者框架进行开发,可以去watch一下。
github以及git命令的使用
README.md:一般会在这个文件中表明本仓库所包含的软件的概要、使用流程、许可协议等信息。
.gitignore,这个文件用来描述git仓库中不需要管理的文件与目录。
clone已有仓库:
git clone URL
查看当前的仓库的状态:
git status
将文件添加到暂存区【文件提交之前的一个临时区域】:
git add filename
将文件提交到仓库:
git commit -m "msg"
【加-m表示简述一条提交信息,不加则需要详细信息。】查看提交历史【包括提交或合并,以及前后的差别】:
git log
【--pretty=short
,只让程序显示第一行简述信息;<file>
,只显示该目录或文件的历史;-p
,显示提交前后的差别;--graph
,以图表形式查看分支
】git diff
,查看工作树、暂存区、最新提交之间的差别。的差别【HEAD
,查看与最新提交的差别。】提交到github中:
git push
公开时的许可协议:有BSD,Apache许可协议,最常用的是MIT许可协议。实际使用时,只需将LICESE文件加入仓库,并在README.md文件中声明使用了何种许可协议即可。
实际操作——GIT
- 初始化仓库:
git init
,会生成一个.git目录,可以称这个目录为“附属于该仓库的工作树”,用于管理文件的历史快照。
分支的操作
- 不同分支中,可以同时进行完全不同的作业。等该分支的作业完成之后再与master分支合并。
显示分支表:
git branch
,星号表示我们当前所在的分支。创建、切换分支:
git checkout -b branchName
[切换则不用-b,-是切换回上一个分支]只要创建多个分支,就可以在不互相影响的情况下同时进行多个功能的开发。
特性分支(Topic branch):当今大部分工作流程都用到了特性分支。特性分支是集中实现单一特性(主题),除此之外不进行任何作业的分支。在日常开发中,往往需要创建多个特性分支,同时在此之外再保留一个随时可以发布软件的稳定分支。稳定分支通常就是master分支了。我们创建了feature-A,除了对feature-之外不进行任何作业。即便在开发过程中发现了BUG,也要再创建新的分支进行修正。
基于特定主体的作业在特性分支中进行,主体完成后再与master分支合并。只要保持这样的开发流程,就能保证master分支可以随时供人查看。其他开发人员也能放心从master分支创建新的特性分支。
git merge——合并分支
:假设我们的feature已经是实现完毕,想要将他合并到主分支master中。步骤如下:
先切换到master分支:git checkout master
再进行合并feature-A分支:git merge --no-ff branchName
[–no-ff表示在历史记录汇总明确记录下本次分支合并]
以图表形式查看分支:git log --graph
更改提交的操作
借助分散仓库的优势,可以在不影响其他仓库的前提下对历史版本进行操作。以下创建一个fix-B用于回溯历史版本。
回溯到指定的状态:
git reset --hard hashValue
【哈希值只要输入4位以上就可以执行】git reflog
:查看当前仓库的操作日志。跟git log
的区别在于,git log只能查看当前分支状态为重点的历史日志。用reflog恢复到回溯前的历史状态。
消除冲突
========
以上的部分就当前HEAD的内容,以下部分就是想要合并的分支的内容,需要解决冲突,不然无法完成合并。解决冲突后在提交一次。修改上一条提交信息:
git commit --amend
压缩历史
压缩历史:提交一个修改,然后将这个修改包含到前一个提交中,压缩成一个历史记录。
git rebase -i HEAD~2
,选定当前分支中包含HEAD(最新提交)在内的两个最新历史记录为对象,也就是把两个请求合为一个请求,将pick改为fixup
推送至远程仓库
远程仓库,是与我们本地仓库相对独立的另一个仓库。
添加远程仓库:
git remote add origin url
推送到master分支:
git push -u origin master
注意:空目录不可以push推送至master以外的分支:
git push -u origin branchName
【
关于git push 需要注意的点:
1.如果是第一次推送则必须加上-u origin branch
,加了-u下次就可以直接push了
2.如果是从远程仓库中获取下来则表示已经跟远程仓库连接上了,直接push就可以
】使用HTTPS协议添加仓库,每次push都要输入密码。使用SSH协议则不用。
git remote -v
查看git远程推送的方式。
从远程仓库获取
git branch
,查看当前分支的相关信息,添加-a
参数可以同时显示本地仓库和远程仓库的分支信息。获取远程分支,
git checkout -b branchName oringin/branchName
【第一个branchName是本地仓库的分支名】
获取最新的远程仓库分支
git pull origin branchName
获取最新的远程仓库分支
【git pull需要注意的地方和git push同理,除了第一次更新,其他直接pull即可】
GITHUB网站功能
站内可以用快捷键(
shift+/
查看快捷键)Explore,介绍热门的软件
Gist,用于管理以及发布一些没必要保存在仓库中的代码,比如笑的代码片段。
wiki,记录开发者之间应该共享的信息或者软件文档。
pulse,显示仓库最近的活动信息。
releases,显示仓库的标签列表。
RAW,通过HTTPS协议获取文件。
Blame,按行显示最新提交的信息。
通过修改URL查看差别
issue可以通过标签(label)来进行整理。
还可以添加里程碑来管理issue。
在仓库根目录添加CONTRIBUTING.md文件,可以在描述issue的时候显示出来,用以规范issue的内容。
Tasklist语法
1
2
3
4# 本月要做的任务
- [x] 完成图片
- [ ] 完成部署工具的设置
- [ ] 完成抽签功能Close Issue,如果一个处于open状态的issue已经处理完毕,只要在提交中以下列格式描述提交信息,对应的issue就会被close掉。
1
2
3
4
5
6
7
8
9fix #1
fixes #1
fixed #1
close #1
closes #1
closed #1
resolve #1
resolves #1
resolved #1
WIKi
wiki在git仓库中有自己的git管理,需要clone,在本地开发再push
pulse
体现仓库软件开发活跃程度的功能
Pull Request
Pull Request 是用户修改代码后向对方仓库发送采纳请求的功能。这个功能使众多开发者能协同合作。
养成创建特性分支后再修改代码的好习惯。在github上发送pull request时,一般都是发送特性分支。
一般PR过程,Fork到本地,修改完成再发送PR。
在开发过程中发送PR进行讨论,Fork到本地,修改一部分就立刻发送PR,跟作者进行交流,添加WIP表明正在开发中。提交过的PR,下次再push一样是直接在PR中更新。
不进行Fork直接从分支发送PR【需要团队编辑权限】
如何让源代码仓库保持最新状态
- 通过git fetch命令获取最新的数据。需要配合git merge使用。[用在fork和clone的仓库]
日常git命令
- 修改分支名称:git branch -m old new