GitHub的是版本控制和协作代码托管平台。它可以让你和其他人的项目从任何地方合作。Git也是目前世界上最先进的分布式版本控制系统(没有之一)。最初编写用作Linux内核代码的管理。推出后,Git在其它项目中也取得了很大成功。Github目前已经有100多万的开发者,并且对于公共项目的托管免费。Github使得版本控制更加容易,多人协作编码变得简单。使用过SVN的同学应该知道,当没有网络的支持,开发者并没有办法提交已完成代码。Github支持离线提交,其实就是提交到本地仓库。每一个开发者clone下的项目代码都是一个完整的仓储,当远程或其他协作开发者代码无法恢复时,都可以方便使用本地的仓储进行恢复。当需要对代码进行分支时,其他版本控制软件在大量文件时会很慢,而Github几乎是瞬间完成这个操作,而且只需要一个命令即可。下面我们一步一步来搭建Github的环境(以windows操作系统为例)。
Git历史?
Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linux的代码是如何管理的呢?Linus自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
1、安装Git(本文介绍windows上的安装,linux和Mac OS安装参看原文)
准备
1)Windows版Git下载,然后全部点击下一步安装。安装完成后,在开始菜单里找到Git->Git Bash,如下图就说明Git安装成功!
2)GitHub官网申请一个账号
开始操作:
1)Git安装完成后,配置你的名字和Email地址。
1 2 3 |
|
注:git config命令的–global参数,表示本机所有的Git仓库都会使用这个配置,也可以对某个仓库指定不同的用户名和Email地址。
2、创建版本库
什么是版本库呢?
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。
1)创建一个版本库非常简单,首先,创建一个空目录:
1 2 3 4 5 6 7 8 9 |
|
2)通过git init命令把这个目录变成Git可以管理的仓库:
1 |
|
Git仓库建好了,是一个空的仓库(empty Git repository),当前目录下多了一个.git的目录,来跟踪管理版本库的,不要手动修改这个目录里面的文件。随后分布式服务器push或download都是使用master,包括对github的交互也是如此。
3)在learngit下创建一个readme.txt文件并编写两句话。
1 2 3 4 5 6 7 8 9 |
|
4)用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
5)用命令git commit告诉Git,把文件提交到仓库,-m后面输入的是本次提交的说明:
$ git commit -m “wrote a readme file”
3、修改文件
1)成功添加并提交readme.txt文件,修改readme.txt文件如下:
运行git status命令查看当前仓库状态:
上面的命令告诉我们,readme.txt被修改过,但还没有提交。git diff命令告诉我们readme.txt被修改的具体内容:
4、版本回退
1)用git log命令查看历史记录:
如输出信息太多,可以加上–pretty=oneline参数:
$ git log –pretty=oneline
2)把readme.txt回退到上一个版本,也就是”add distributed”的那个版本,怎么做呢?在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^。现在,我们要把当前版本”append GPL”回退到上一个版本”add distributed”,就可以使用git reset命令:
看看readme.txt的内容是不是版本add distributed:
还可以继续回退到上一个版本wrote a readme file,我们用git log再看看现在版本库的状态:
最新的那个版本append GPL已经看不到了!怎么办?只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id
于是就可以指定回到未来的某个版本:
$ git reset –hard 9636c65
再看看readme.txt的内容:
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:
然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。现在,你回退到了某个版本,关掉了电脑,想恢复到新版本怎么办?找不到新版本的commit id怎么办?在Git中,总是有后悔药可以吃的。当你用$ git reset –hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
终于舒了口气,第二行显示append GPL的commit id是9636c65。
5、撤销修改
1)在readme.txt中添加了一行信息:
突然发现最后一行没有必须添加,想修改。如果用git status查看一下:
Git会告诉你,git checkout — file可以丢弃工作区的修改全部撤销:命令中的—很重要,没有—,就变成了”切换到另一个分支”的命令。
$ git checkout — readme.txt
现在,看看readme.txt的文件内容:
文件内容果然复原了。
6、删除文件
1)删除也是一个修改操作,先添加一个新文件test.txt到Git并提交:
你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了。这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
现在,文件就从版本库中被删除了。
7、远程仓库
读者先自己注册个GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要设置SSH:
1)打开Shell(Windows下打开Git Bash),创建SSH Key:
把邮件地址换成你自己的邮件地址,然后使用默认值即可。如果一切顺利的话,可以在用户主目录(上图标橘红色路径查找)里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
2)登陆GitHub,打开Account settings,SSH Keys页面:填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
点”Add Key”,你就应该看到已经添加的Key:
因为GitHub需要识别出你推送的提交,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。
3)现在你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。首先,登陆GitHub,然后,在右上角找到”Create a new repo”按钮,创建一个新的仓库:
在Repository name填入bnclearngit,其他保持默认设置,点击”Create repository”按钮,就成功地创建了一个新的Git仓库:
目前,在GitHub上的这个bnclearngit仓库还是空的,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
4)在本地的bnclearngit仓库下运行命令:
$ git remote add origin git@github.com:yourGitHub/bnclearngit.git
注意:把上面的yourGitHub替换成你自己的GitHub账户名。
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
5)就可以把本地库的所有内容推送到远程库上:
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数。推送成功后,在GitHub页面中看到远程库的内容已经和本地一模一样:
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
本地master分支最新修改推送至GitHub,你就拥有了分布式版本库!
8、远程仓库克隆
这个也是非常重要的,你既可以clone自己的项目到本地,也可以在github上把有用的项目Fork到你的仓库里面,然后clone到本地,下来看看我们是怎么做的吧!
clone你自己项目到本地:现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:本示例clone自己仓库已经存在的OracleCluster
$ git clone git@github.com:yougithub/OracleCluste
clone其他人源码,首先选中项目Fore,后面步骤就是本地clone啦
9、版本号管理
1)敲命令git tag <name>就可以打一个新标签:
$ git tag v1.0
可以用命令git tag查看所有标签:
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,怎么办?方法是找到历史提交的commit id,然后打上就可以了:
$ git log –pretty=oneline –abbrev-commit
比方说要对append GPL这次提交打标签,它对应的commit id是9636c65:
$ git tag v0.99636c65
再用命令git tag查看标签:
注意:标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:
可以看到,v0.9确实打在append GPL这次提交上。还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m “version 0.1 released”9636c65
用命令git show <tagname>可以看到说明文字:
$ git show v0.1
如果标签打错了,也可以删除:
$ git tag -d v0.1
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。如果要推送某个标签到远程,使用命令git push origin <tagname>:
$ git push origin v1.0
或者,一次性推送全部尚未推送到远程的本地标签:
$ git push origin –tags
如果标签已经推送到远程,删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
要看看是否真的从远程库删除了标签,可以登陆GitHub查看。
10、配置别名
有没有经常敲错命令?比如git status?status这个单词真心不好记。如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。我们只需要敲一行命令,告诉Git,以后st就表示status:
$ git config –global alias.st status
还有别的命令可以简写,用co表示checkout,ci表示commit等:
?
1 2 3 4 5 6 7 |
|
配置文件:配置Git的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:
$ cat .git/config
11、搭建Git服务器
GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。假设你已经有sudo权限的用户账号,下面,正式开始安装。
1)安装git:$ sudo apt-get install git
2)创建一个git用户,用来运行git服务:$ sudo adduser git
3)创建证书登录:收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
4)初始化Git仓库:先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
$ sudo git init –bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$ sudo chown -R git:git sample.git
5)禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
6)克隆远程仓库:现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into ‘sample’…
warning:You appear to have cloned an empty repository.
管理公钥:如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。
管理权限:有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。
GitHub 教程系列文章:
通过GitHub创建个人技术博客图文详解 http://www.linuxidc.com/Linux/2015-02/114121.htm
GitHub 使用教程图文详解 http://www.linuxidc.com/Linux/2014-09/106230.htm
使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署 http://www.linuxidc.com/Linux/2016-06/131993.htm
多个GitHub帐号的SSH key切换 http://www.linuxidc.com/Linux/2016-05/131080.htm
如何在同一台电脑上使用两个GitHub账户 http://www.linuxidc.com/Linux/2016-05/131079.htm
利用GitHub搭建个人Maven仓库 http://www.linuxidc.com/Linux/2016-04/130197.htm
一分钟认识GitHub http://www.linuxidc.com/Linux/2015-11/125089.htm
分享实用的GitHub 使用教程 http://www.linuxidc.com/Linux/2014-04/100556.htm
GitHub 的详细介绍:请点这里
GitHub 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/135782.htm