快速入门GitHub
GitHub在程序开发领域家喻户晓,现在几乎整个互联网的开发者都将版本管理工具GitHub作为版本控制的首选,甚至像笔者这样非开发者,一名每天和数据打交道的人也在使用GitHub
,目的主要有:
- 查找资料:GitHub上有很多国内外大神开源的数据挖掘、机器学习的资料、代码,笔者直接fork或者clone下来学习
- 技术交流:通过对开源项目提出issue,能够起到技术交流的效果
- 个人展示:现在互联网领域中,如果一个程序员在GitHub上有一个很好的开源项目,必定是会备受关注。因此GitHub实际上是一个很好的展示个人实力的舞台,或许它能够让你受到招聘人员的青睐
可以说,正式GitHub,让社会化全员编程成为了现实。
既然好处颇多,作为互联网界的一员,没有理由不学好GitHub😄本文将详细介绍GitHub的相关基础操作,带你快速入门GitHub
版本管理
版本管理就是管理更新的历史记录。Git出现之前,人们主要是使用Subversion(简称为SVN)作为版本控制的工具。
SVN
SVN是属于集中型的版本管理系统,其特点是将仓库集中存放在服务器中,所以只存在一个仓库。集中型将所有特点是方便管理,但是如果开发者所处的环境无法联网,则无法获取到最新的源码,进而无法进行开发工作。
Git
Git是分散型的版本管理系统。从下图中我们可以观察出来,GitHub将仓库fork给每个用户。fork的仓库和原始的仓库是两个不同的仓库,开发者是可以随意编辑的。
Fork的过程其实就是将某个仓库复制到自己的账户下
什么GitHub
GitHub是一个基于Git的代码托管平台。如果是付费用户可以建立自己的私人仓库,一般用户的话只能建立公用仓库,也就是说仓库的代码必须是公开的。到底Git和GitHub有什么区别呢?
在Git中,开发者将源代码存入名叫“Git仓库”的资料库中,方便使用;而GitHub则是在网络上提供Git仓库的一项服务
GitHub上公开的源代码都是通过Git进行管理的。
安装与配置Git
安装
现在笔者使用的MacOS
系统,是自带Git
的。关于Windows系统下安装,请参考网上某位博主的文章,讲解的非常详细。
Windows系统Git安装教程(详解Git安装过程):https://www.cnblogs.com/xueweisuoyong/p/11914045.html
配置
首先需要设置使用Git时候的名字和邮箱,名字需要使用英文
1 | git config --global user.name "Firstname Lastname" # 名称 |
需要注意的是:
- GitHub上公开仓库的时候,名字和邮箱会一同被公开,所以请不要使用不便公开的隐私信息
- 程序员来自世界各地,请使用英文,不要使用汉字;如果不想使用真名,可以使用网站的昵称
如何提高命令输出的可读性?
1 | git config --global color.ui auto # 将color.ui 设置成auto |
创建账户
进入创建用户的页面:http://github.com/join,填写如下的信息在点击Create an accout
即可
配置SSH
GitHub上连接现有仓库的认证,是通过使用了SSH的公开密钥认证方式进行的。现在我们需要创建公开密钥所需的SSH Key,并将其添加到GitHub。
1 | ssh-keygen -t rsa -C # 创建SSH Key |
接下来需要输入两次密码,最终会生成两个文件:
- id_rsa:私有密钥
- id_rsa.pub:公开密钥
下面我们需要在GitHub中添加公开密钥,今后就可以使用私有密钥进行认证。点击右上角的账户设定按钮:
进入settings之后,添加新的SSH Key
接下来会出现Title和Key两个输入框,在Title中输入适当的密钥名称,Key部分复制上面id_rsa.pub文件中的内容
1 | cat ~/.ssh/id_rsa.pub # 查看内容 |
添加完成之后,会在我们的邮箱中收到一封提示“公开密钥添加完成”的邮件,确认即可。这样便完成了整个手中的私人密钥和GitHub的认证和通信问题,验证一下:
1 | ssh -T git@github.com |
在接下来的页面中输入密码和yes即可完成验证。
建立仓库
首先我们必须明白一点:仓库有两种
- 远程在GitHub上的仓库:远程仓库
- 在自己本地的仓库:本地仓库
本文是以MacOS系统为例,基于Linux;如果是想学习Windows下的仓库创建,请参考下文,讲解的很详细:
Git使用(10分钟入门):https://www.jianshu.com/p/09f243768cf6
远程仓库
1、建立远程仓库需要我们先登陆自己的GitHub账号,再进行建仓。
2、我们创建一个git_start
的仓库
- 仓库的名字
- 仓库的简单描述
- 不要在远程仓库添加README.md文件。我们使用手动push的方式来添加
3、仓库解释
打开上面我们创建好的仓库,会出现如下的内容(先写上注释,后面慢慢解释)
1 | echo "# git_start" >> README.md # 往README.md中写入内容 |
本地仓库
1、建立本地仓库
所谓的本地仓库,就是你自己电脑客户端的仓库。同样地,笔者在本地建立了同样名字的本地仓库
git_start
,其实就是个文件夹
1 | mkdir git_start # 创建文件夹,即仓库 |
2、初始化操作
1 | echo "学习GitHub的使用,快速入门" >> README.md # 往文件中写入内容,后面可以更改 |
初始化之后会在当前目录下自动生成一个.git
的文件。这个文件下存储着管理当前目录内容所需要的仓库数据
3、查看待提交文档
通过ls
查看已经有了README.md
文档
1 | git status # 查看待提交的文档 |
4、提交文档
我们将上面的README.md
文档和生成的.git
文档一并提交
1 | git add . # 提交全部文件 |
注意:执行了add操作,文件还没有被上传到Git远程仓库中,只是提交到了缓存区域
git commit -m "2021-1-1"
才是真正地提交内容,同时写上备注:将文件从缓存区提交到远程
5、建立远程仓库连接并推送
1 | git remote add origin git@github.com:peter/git_start.git # 建立连接 |
6、检查
此时我们刷新远程仓库的页面,会发现页面更新了,也有了内容:
7、查看提交日志
1 | git log # 查看提交日志 |
commit
栏旁边显示的是指向这个提交的哈希值。Git的其他命令中,在指向提交时会用到这个哈希值- Author栏旁边是Git设置的用户名和邮箱地址
- Date栏显示的是执行日期和时间
- 最下面是提交信息,-m参数后面的信息
8、修改README.md
文件
通过vim编辑器修改内容如下:
上面使用了Markdown语法,然后我们重新按照上面的命令执行一遍:
1 | git status # 状态是红色 |
回顾下整个操作的过程:
- 建立远程仓库
- 建立本地仓库
- 初始化本地仓库
- 文档提交到缓存区
- 缓存区推送到远程仓库
重要命令
我们总结一下上面操作中几个重要的命令:
1、git status
查看仓库中文件的状态。如果有新的文件或者原来的文件有修改过,会出现红色
2、git add
向缓存区中添加内容,缓存区是提交之前的一个临时区域(Stage或者Index)
3、git commit [-m]
将暂存区中的文件保存仓库的历史记录中; -m参数后面跟上提交信息:git commit -m "第一次提交"
4、git log
查看以往提交日志信息:什么人在什么时候进行了提交或者合并等,以及操作前后有怎样的差别
1 | git log # 查看日志 |
5、git diff
查看工作树、暂存区、最新提交之间的差别。
1 | git diff # 查看当前工作树和暂存区的差别 |
养成习惯:git commit之前先执行git diff HEAD命令来查看本次提交与上次提交之间的差别;HEAD指向当前分支中最新的一次提交的指针。
分支
master分支
master分支是Git默认创建的分支,其他所有的分支都是在这个分支的基础上进行的。
- 不同的分支单独进行各自的作业
- 该分支的作业完成之后再和master分支合并
进行完作业之后的合并操作:
分支相关命令
1、git branch-显示分支
显示分支一览表:将分支名列表显示出来,同时确认当前所在的分支;标有星号*
表示当前分支
2、git branch feature-创建分支
1 | git branch feature |
3、git checkout feature-切换分支
1 | git checkout feature |
上面两个命令的合并,创建新的分支并切换到新的分支:
1 | git checkout -b feature |
4、git merge-合并分支
假设某个分支已经完成了作业需要和主分支master合并,使用如下语句:
1 | git checkout master # 切到主分支 |
5、git log —graph-图的形式查看分支
通过图表的形式查看提交的内容
1 | git log --graph |
版本回溯
既然是版本控制系统,那么对于不同版本的管理肯定是至关重要的。GitHub的另一个特征便是可以灵活地操作不同的历史版本。借助分散仓库的优势,可以在不影响其他仓库的前提下对历史版本进行操作。
1、回溯到指定状态
哈希值只要输入4位以上就可以执行了
1 | git reset --hard [哈希值] # 添加指定的哈希值,代表某个时间点的状态 |
2、查看当前仓库的全部执行过的操作日志
记录我们操作的每次命令
1 | git reflog # 针对当前仓库 |
所以我们可以先通过git reflog
来查看哈希值,再通过git reset —hard [哈希值]
回到某个状态
3、修改上一条提交信息
使用git commit --amend
命令
1 | git commit --amend |
4、压缩历史
在合并特性分支之前,如果发现已经提交的内容中有拼写等错误,可以先提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一个历史记录
1 | git rebase -i |
5、添加提交一次完成
1 | git commit -am "add和commit同时完成" |
git reset详解
命令
对版本回溯命令的详解。git reset 命令用于回退版本,可以指定回退到某个具体的历史版本。
git reset 命令语法格式具体如下:
1 | git reset [--soft | --mixed | --hard] [HEAD] |
--mixed
是默认参数,可以不带,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变
soft
--soft
参数用于回退到某个版本
1 | git reset --soft HEAD # 回退到上个版本 |
hard⚠️
!!!⚠️谨慎使用 --hard
参数,它会删除回退点之前的所有信息
1 | git reset --hard HEAD~3 # 回退到上上上个版本 |
HEAD
1 | git reset HEAD^ # 回退到所有内容的上一个版本 |
git reset HEAD还能取消已缓存的内容。当我们对某个文件的内容进行了修改并且已经执行git add
之后,我们想取消缓存区的内容,使用如下命令:
1 | git reset HEAD [filename] |
关于HEAD 说明:
-
HEAD 表示当前版本
-
HEAD^ 上一个版本
-
HEAD^^ 上上一个版本
-
HEAD^^^ 上上上一个版本
-
以此类推…
可以使用 ~数字表示
- HEAD~0 表示当前版本
- HEAD~1 上一个版本
- HEAD^2 上上一个版本
- HEAD^3 上上上一个版本
- 以此类推…
总结
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。