GitHub使用操作指南

作者:白宁超

2016年10月5日18:51:03>

摘要:GitHub的是版本控制和协作代码托管平台,它可以让你和其他人的项目从任何地方合作。相对于CVS和SVN的联网限制和传速慢有明显的优势。因此,越来越受企业和个人的青睐。github上进行项目管理也是趋势。基于此,笔者十一小假期,花了1天时间学习总结得以此文,旨在节约读者时间,快速掌握。在此,特别感谢廖雪峰官网教程,本文基本其于教程又有所不同,内容进行取舍,外加梳理成文,最后参考资料建议大家阅读。本文布局如下:一是对GIt整体介绍,究其原委;二是Git版本常用控制操作;三是Git与GitHub远程仓库操作;四是搭建私有服务器;五是官网资料引用。(本文原创编著,转载注明出处: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地址。

$ git config --global user.name "Your Name" 

$ git config --global user.email "email@example.com"

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

2、创建版本库

什么是版本库呢?

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

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

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

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

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

$ pwd //查看当前路径 

/d/learngit

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

$ git init 

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

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

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

$ 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等:

$ 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'

配置文件:配置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了,不要把有限的生命浪费到权限斗争中。

12、参考以及扩展文献

1.廖雪峰:Git教程

2.github教程

3.Github指南

4.Pro git

【项目管理】GitHub使用操作指南的更多相关文章

  1. 专为设计师而写的GitHub快速入门教程

    专为设计师而写的GitHub快速入门教程 来源: 伯乐在线 作者:Kevin Li     原文出处: Kevin Li 在互联网行业工作的想必都多多少少听说过GitHub的大名,除了是最大的开源项目 ...

  2. 怎样使用 GitHub?

    作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. 作为一个文 ...

  3. 使用GitHub进行团队合作

    原文: Team Collaboration With GitHub GitHub已经成为的一切开放源码软件的基石.开发人员喜欢它,基于它进行协作,并不断通过它开发令人惊叹的项目.除了​​代码托管,G ...

  4. 转:怎么使用github(通俗易懂版)

    转:  https://www.zhihu.com/question/20070065 作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/ans ...

  5. github使用-知乎的某小姐的一篇文章

    作者:珊姗是个小太阳链接:http://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. 作为一个文科 ...

  6. MAC使用GITHUB

    作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. #什么是 ...

  7. 文科妹学 GitHub 简易教程

      #什么是 Github ?必须要放这张图了!!!<img src="https://pic4.zhimg.com/7c9d3403bf922b1663f56975869c829b_ ...

  8. 文科妹学 GitHub 简易教程(转)

    文科妹学 GitHub 简易教程     #什么是 Github ?必须要放这张图了!!! Git 是由 Linux 之父 Linus Tovalds 为了更好地管理linux内核开发而创立的分布式版 ...

  9. Git 上传本地项目到Github

    前提: 安装Git 注册并拥有Github账号 目录: 初始化本地目录位Git仓库 Github上创建仓库 本地生成SSH key,并添加到Github上 本地项目管理Github上远程项目 详细步骤 ...

随机推荐

  1. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  2. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  3. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  4. 带你实现开发者头条APP(三) 首页实现

    title: 带你实现开发者头条APP(三) 首页实现 tags: 轮播广告,ViewPager切换,圆形图片 grammar_cjkRuby: true --- 一.前言 今天实现开发者头条APP的 ...

  5. PHP-----文件系统的交互

    本文讲解php中于文件交互中所使用的函数 代码示例 <html> <head> <title> File Detail </title> </he ...

  6. 基于DFA敏感词查询的算法简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直 ...

  7. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. SharePoint2016安装的过程的”Microsoft.SharePoint.Upgrade.SPUpgradeException”错误解决方法

    前提 在windows server 2012的服务器上运行安装sharepoint2016出现如下错误: Could not load file or assembly ‘Microsoft.Dat ...

  10. App 审核由于 IPv6 网络问题被拒

    昨天 提交App Store 的时候被拒了 We discovered one or more bugs in your app when reviewed on iPhone running iOS ...