天天看点

GitHub使用操作指南

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 user.name "Your Name"

$ git config --global user.email "[email protected]"

注:git config命令的--global参数,表示本机所有的Git仓库都会使用这个配置,也可以对某个仓库指定不同的用户名和Email地址。

2、创建版本库

什么是版本库呢?

版本库又名仓库,英文名

repository

,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。

1)创建一个版本库非常简单,首先,创建一个空目录:

1

2

3

4

5

6

7

8

9

$ cd /d //你指定的个人盘符

$ mkdir learngit //创建版本库根目录

$ cd learngit //进入版本库目录(tab键盘补全命令)

$ pwd //查看当前路径

/d/learngit

2)通过git init命令把这个目录变成Git可以管理的仓库:

1

$ git init

Git仓库建好了,是一个空的仓库(empty Git repository),当前目录下多了一个.git的目录,来跟踪管理版本库的,不要手动修改这个目录里面的文件。随后分布式服务器push或download都是使用master,包括对github的交互也是如此。

3)在learngit下创建一个readme.txt文件并编写两句话。

1

2

3

4

5

6

7

8

9

$touch readme.txt

$ vi readme.txt //进入编辑器,按i进入编辑模式,esc退出:wq强制保存

Git is a version control system.

Git is free software.

$cat readme.txt //查看信息

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参数:

<p style="text-align: justify;">$ 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

于是就可以指定回到未来的某个版本:

<p style="text-align: justify;">$ git re

set

--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可以丢弃工作区的修改全部撤销:命令中的--很重要,没有--,就变成了"切换到另一个分支"的命令。

<p style="text-align: justify;">$ 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仓库下运行命令:

<p style="text-align: justify;">$ git remote add origin [email protected]:yourGitHub/bnclearngit.git

注意

:把上面的yourGitHub替换成你自己的GitHub账户名。

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

5)就可以把本地库的所有内容推送到远程库上:

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数。推送成功后,在GitHub页面中看到远程库的内容已经和本地一模一样:

从现在起,只要本地作了提交,就可以通过命令:

<p style="text-align: justify;">$ git push origin master

本地master分支最新修改推送至GitHub,你就拥有了分布式版本库!

8、远程仓库克隆

这个也是非常重要的,你既可以clone自己的项目到本地,也可以在github上把有用的项目Fork到你的仓库里面,然后clone到本地,下来看看我们是怎么做的吧!

clone你自己项目到本地:

现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:本示例clone自己仓库已经存在的OracleCluste

<p style="text-align: justify;">$ git clone [email protected]:yougithub/OracleCluste

clone其他人源码,首先选中项目Fore,后面步骤就是本地clone啦

9、版本号管理

1)敲命令git tag 就可以打一个新标签:

<p style="text-align: justify;">$ git tag v1.0

可以用命令git tag查看所有标签:

默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,怎么办?方法是找到历史提交的commit id,然后打上就可以了:

<p style="text-align: justify;">$ git log --pretty=oneline --abbrev-commit

比方说要对append GPL这次提交打标签,它对应的commit id是9636c65:

<p style="text-align: justify;">$ git tag v0.99636c65

再用命令git tag查看标签:

注意

:标签不是按时间顺序列出,而是按字母排序的。可以用git show 查看标签信息:

可以看到,v0.9确实打在append GPL这次提交上。还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

<p style="text-align: justify;">$ git tag -a v0.1 -m "version 0.1 released"9636c65

用命令git show 可以看到说明文字:

<p style="text-align: justify;">$ git show v0.1

如果标签打错了,也可以删除:

<p style="text-align: justify;">$ git tag -d v0.1

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。如果要推送某个标签到远程,使用命令git push origin :

<p style="text-align: justify;">$ git push origin v1.0

或者,一次性推送全部尚未推送到远程的本地标签:

<p style="text-align: justify;">$ git push origin --tags

如果标签已经推送到远程,删除远程标签就麻烦一点,先从本地删除:

<p style="text-align: justify;">$ git tag -d v0.9

然后,从远程删除。删除命令也是push,但是格式如下:

<p style="text-align: justify;">$ git push origin :refs/tags/v0.9

要看看是否真的从远程库删除了标签,可以登陆GitHub查看。

10、配置别名

有没有经常敲错命令?比如git status?status这个单词真心不好记。如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。我们只需要敲一行命令,告诉Git,以后st就表示status:

<p style="text-align: justify;">$ git config --global

alias

.st status

还有别的命令可以简写,用co表示checkout,ci表示commit等:

?

1

2

3

4

5

6

7

$ git config --global alias.co checkout

$ git config --global alias.ci commit

$ git config --global alias.br branch

$ git config --global alias.unstage 'reset HEAD'

<p style="text-align: justify;"> 

配置文件:

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:

<p style="text-align: justify;">$ cat .git/config

11、搭建Git服务器

GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。假设你已经有sudo权限的用户账号,下面,正式开始安装。

1)安装git:$ su

do

apt-

get

install git

2)创建一个git用户,用来运行git服务:$ su

do

adduser git

3)创建证书登录:收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

4)初始化Git仓库:先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

<p style="text-align: justify;">$ su

do

git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

<p style="text-align: justify;">$ su

do

chown -R git:git sample.git

5)禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

<p style="text-align: justify;">git:x:1001:1001:,,,:/home/git:/bin/bash

<p style="text-align: justify;">改为:

<p style="text-align: justify;">git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

6)克隆远程仓库:现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

<p style="text-align: justify;">$ git clone git@server:/srv/sample.git

<p style="text-align: justify;">Cloning into 'sample'...

<p style="text-align: justify;">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