目录/Directory
1 前言
Git是一个版本管理软件。什么是“版本管理软件”?假设老板让你做一个办公室装修报告,然后你写好了V1.0给他。老板看了很不满意,觉得没有在办公室里放咖啡间,没有会议室,不够人性化。然后你加了会议室和咖啡间的设计,生成了版本V2.0给他。老板又觉得没有隔断,效率不高,于是你又得给每个人的工作位设计隔断;后来又发现每个人的工作空间太小,于是就把咖啡间去掉了,等等一通折腾后,终于定稿了V10.0。老板拿去给董事审批的时候,董事长问:为什么没有咖啡间?于是老板把你叫到身边,和蔼的说道,还是把当初那个带咖啡间的方案拿回来吧。然后你说:纳尼?
这个过程中的产生的一系列文档,都可以看成是同一文档的不同的版本。对于版本管理我们很多人其实已经在做了。例如你可能会把你的设计报告加上版本号,比方说“办公室设计报告V1.Doc”等。这样可以解决一部分问题,但是一旦版本多了以后,你其实也不知道到底哪个版本做了哪些修改(除非你还有一个记录文件,每次修改后都做一个记录,但是这个是比较麻烦的,要承认人的惰性)。这是文档,对于项目而言,由于涉及的文档更多(特别是软件开发项目,光源代码就有上百个之多),其版本的维护靠人工几乎是不可能的。于是就有了版本管理软件VCS (Version Control System)。
版本管理软件有不少,为什么大家后来都推崇Git呢?我想Github的存在功不可没。另外,Git新颖的架构模式也是吸引大家的地方。其他的VCS软件基本上都是C/S模式的,也就是说要使用其他的软件,必须要有服务器以及配置服务器版本的VCS,这样无形当中提高了使用的难度。而Git是可以单机使用的,同时Git也可以配置成和服务器同时使用,这样不但方便,也更安全,也就是说你始终有一个和服务器版本一致的拷贝,即使暂时没有网络,你也可以工作的很哈皮。
2 下载与安装Git
对于Windows用户,可以直接去Git的网站下载。对于Linux用户,可以使用在线安装命令。例如:
sudo pacman -S git
或者
sudo apt-get install git
一般情况下要配置一些参数,比较简单的就配置用户名和用户邮件地址。
git config --global set user.name origin2007
git config --global set user.email origin@foxmail.com
也许有时你得设置一下默认的编辑器:
git config --global set core.editor vim
因为每次提交新版本的时候,必须要编辑一段文本,用来描述本次版本所做的任何改动。Git不允许空文本提交,所以至少你得写的什么,这时候就要用到编辑器。推荐用vim,因为有的时候带图形界面的编辑器往往会自动返回(是的,没等你敲入任何东西就返回了),这时候Git会认为你什么也没写,那么提交新版本的行为就会失败。
3 理解Git
理解Git是正确使用Git的前提,当然这里我们不去讲它的原理,但是我们要理解它的行为。
Git首先需要一个版本仓库来储存各个版本的 索引文件。这个仓库是有一定格式的,所以一定要Git自己来创建,使用的命令就是:
git init
记住一定要cd
到要进行版本控制的项目目录中去执行这个命令。
有了仓库后,就可以准备第一次提交了。提交有个术语叫Commit。仓库也有个术语叫Repository,有时还简称Repo。但在提交之前还要做一些任务,那就是告诉Git哪些文件是不用做版本控制的。比方说你的目录里刚好有个视频,好几百兆,这个我在准备我的课件的时候经常会有。这个是没必要做版本控制的,必须排除。还有其他的一些例如临时文件,编译的输出文件等。方法是在项目的根目录中创建一个.gitignore
文件。把不要版本控制的文件放在里面,可以使用通配符等。
设置好.gitignore
之后,可以用git status
命令查看一下需要版本控制的文件是否符合要求。
准备好后,开始提交。
git add .
git commit
git add .
是把当前目录所有文件(.gitignore
里排除的除外)添加到缓冲区。缓冲区可以理解为准备投入到仓库里作为一次版本提交的文件集合。缓冲区顾名思义就是缓冲的啊,你可以断断续续的往缓冲区里添加文件,然后一股脑的提交;也可以后悔了把文件从缓冲区里撤销出来等等。
当执行到git commit
时,当时配置的编辑器就会出现,你需要写上这次所做的修改,然后保存,就完成了第一次的提交。
第一次提交相当于在仓库里存了一份快照,以后的每次提交都相当于在前一个快照的基础上提交了一份更改快照,然后这一次次的提交就像一条河流一样随着你的开发不断延伸下去。我们把这条河称之为Master
主干。
有的时候我们需要分支。比方说写程序的过程中你有一个新的思路,但是还没想好是否是会对主程序造成冲击,那么你可以创建一个分支(Branch
),就像河的支流一样。当这个分支随着开发进行下去发现不可行,那么你就简单的把它删掉;如果发现确实有用,那么就可以把它和主干合并(术语叫Merge
)。需要注意的是主干和分支都是有单独的版本提交索引的,是互不影响的。当然为了合并方便,在开发分支程序的时候尽可能不要去更改主程序的部分。
Git通过HEAD
来保证它知道你在每个分支中的工作位置。HEAD
就像指针,指向你所在的每个分支的头部(河流的尽头),分支不用了要及时删掉。
4 Git 命令指南
简易版本建议看这个网站:http://www.bootcss.com/p/git-guide/
4.1 Git本地命令
git init //初始化新仓库
git clone //复制一个仓库
git add //添加文件或者目录到缓冲区
git rm [file]//删除文件(仓库,缓冲,本地)
git rm --cached [file] //
git commit //版本提交
git commit -a //自动版本提交(相当于add + commit)
git status //查看当前状态(刚提交完是Clean,否则会列出cached和没有加入的文件清单
git diff //查看上次提交后(包括缓冲)文件有什么变化
git log //查看版本提交记录
git reset --hard [版本号] //回滚到某个版本
git reset --soft [版本号] //回滚到某个版本,本地和缓冲里的文件不变
git reset --mixed [版本号] //回滚到某个版本,本地文件不变
git branch //分支命令,列出分支
git branch xxx //创建xxx分支(默认不切换)
git branch -d xxx //删除xxx分支 (如果已经merge)
git branch -D xxx //删除xxx分支(即使没有merge)
git branch -r //列出远程分支
git merge //合并命令
git help //查看帮助(极简)
4.2 Git远程命令
假设远程仓库别名为origin,默认使用的分支是master。
git remote //查看目前使用的远程仓库的别名
git remote add [别名] [URL] //添加一个远程仓库别名
git clone [别名]/[URL] //克隆远端仓库
git fetch origin //从远程仓库更新代码
git pull origin master //从远程仓库下载代码并与本地代码合并
git push -u origin master //把本地仓库推送到远程仓库
5 利用Git恢复(回滚)版本
比较保险的回滚的方法是先做好备份,然后再回滚。
git branch backup
git log
git reset --hard 版本号
6 GitHub使用简单指南
github.com是程序员的最爱,功能强大无比,还是免费的。在开讲之前先送1万个赞。
赞点完后,希望大家先去免费申请一个账户。后面所有的操作都是基于大家在上面有账号的前提下进行的。Github是一个代码托管网站,当然你放别的东西也没关系。我就用它来存放我上课的课件。免费账户使用的是公共仓库,收费账户可以使用私人仓库。本来我的东西就是让别人下载的,所以免费账户正合我意,对大多数人而言,免费账户足矣。
6.1 配置
登录上账号后,你会发现你的界面是这样的:
在画圈的地方找到创建新仓库的命令(New Repository),就可以创建新的仓库,记住创建的新仓库的URL地址,后面会用到它。注意协议要选择ssh
。
然后,你需要创建登录Github所需要的密钥。请参考各自的操作系统上创建密钥的方法,例如:
ssh-keygen -t rsa -C "you email address"
然后在家目录的.ssh
目录中找到公钥id_rsa.pub
,将该文件里的内容复制到系统剪贴板里。再打开github的网站,到账号设置(Settings),然后左边菜单里找“SSH & GPG keys”,到里面把刚才复制的公钥拷贝到文本框中,确认即可。
然后测试一下是否成功:
ssh -T git@github.com
如果出现了后面的提示:
The authenticity of host ‘github.com (207.97.227.239)’ can’t be established. RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)? yes
Hi username! You’ve successfully authenticated, but GitHub does not provide shell access.
最后一行表明配置成功。
6.2 使用
然后就可以使用git
将你的项目推送到github上了。
git remote add origin git@github.com:origin2007/mechatronic_system_design.git
git push origin master
6.3 其他用途
几乎所有可以做版本控制的文档都可以用github来存储。由于所有文档都是公开的,所以是一个很好的分享的平台。另外github允许多人协作(其实是git的功劳啦),所以也是一个很好的协作平台。可以使用的例子或者场景这里简单描述一下,不展开了。感兴趣的话自行网上搜索。
用途 | 说明 |
---|---|
写书 | 几个人一起合作写一本书,特别是学术著作。比方说张三,李四,王五打算合起来写一本关于计算机视觉的书,他们分好了工,张三负责全篇统筹润色,李四负责理论分析部分,王五负责实验程序等,这是他们会在github上创建一个项目,然后各自在自己的计算机上进行写作或者代码编写,定期推送到github这样大家都能看到彼此做的更改了。 |
素材分享 | 有人在github上做了一个素材分享的项目,把很多的ICON推送到自己的项目中,大家可以Clone他的项目,使用他的ICON。 |
个人网站 | 没错,Github可以用来做一个简单的个人网站(其实也不简单,只不过是静态的而已),方法可以自行搜索Github pages。这里推荐一篇文章。 |
做简历 | 可以看看这个网站:https://github.com/hit9/GhResume |
网盘 | 不推荐,主要是效率太低,但是的确是可以这么用,例如有人用它来做图床。 |
7 场景应用举例
删除误提交
有一次我提交了一个版本,然后将其推送到Github时报错,原因是里面有文件的长度超过了100M,超出了Github的允许。然后我删除掉那个大文件,本地又提交了一个版本(其实我应该放弃上一次的提交,重新提交才对,但是当时没有想到)。然后推送到Github的时候Git仍然固执的推送原先的那个大文件,我意识到推送的时候上一个版本仍然是需要推送的。那么办法就是把上一个版本提交删除掉才行。
(提交1) <-- (提交2) <-- (提交3)(最新提交)
如上图所示,我需要把提交2删除掉才行。提交1已经存在于Github服务器了, 提交3是本地最新的一次提交。
我采取的办法是先回滚到提交1,但是保留所有的修改,重新提交。
git log -3
git reset --mixed 5196bf6008f677369a073982572d3e3cfbe5efa0
git status
git add .
git commit
git push origin master
如何从其他分支中提取所需要的文件
有的时候我们需要从其他分子提取所需要的文件,比方说我们删除了某些文件,但是又提交了很多次才发现。这个时候首先你要知道你的文件所在分支和路径,然后执行下面的命令:
git checkout [branch] -- [path_to_file]
8 结束语
这里简单的介绍了git的用法以及github的用法。其实大部分人用git也都基本是这些命令。其他的命令如果需要的话,可以去搜啊。有本 progit 的书挺好的,网上有电子版,可以下载下来慢慢研究。最后祝大家用好github,做好科研。