git是Linus为了管理linux内核代码而编写的一个超强的分布式版本控制系统,一般以命令行的方式使用。若你是代码工作者,使用git可以大大提高你的工作效率和机动性。
版本控制系统通俗点就是假设你的一个源码根目录现在被git控制了,那么你的所有源码版本(什么V1.00,V2.00,包括正在debug的版本,临时版本,发布版本)都在一个目录下面了,git可以轻松地切换版本,比较版本之间的差异,以及将源码给git服务器托管(比如无人不知的github),又或者可以利用git的代码合并功能进行多人协作。妈妈再也不用担心你为管理代码而烦恼了。
准备工作
安装git
- 如果使用windows,到git官网下载windows版本的git;
- 如果使用linux,安装git没有问题。最好是安装最新版的git:https://github.com/git/git
下载源码编译安装git。
配置用户
要先配置用户信息才能正常使用:1
2$ git config --global user.name '你的靓名'
$ git config --global user.email '你的邮箱'
配置别名
磨刀不误砍柴工,先不急着使用git,把一些难敲的命令配置一下别名,可以用别名代替复杂命令。1
2
3$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.lg "log --graph --pretty=oneline --abbrev-commit"
基本使用
创建版本库
可以在非空目录下(比如源码根目录)创建git版本库:
以下命令都需要在源码根目录下执行。
1 | $ git init |
查看git状态
查看git状态,有哪些文件已经发生了修改,有哪些文件已经被加入暂存区(被加入暂存区的文件才能提交):1
$ git st
将文件加入暂存区
已经发生修改的文件(包括新增的文件和删除的文件),可以将其加入暂存区。一般就直接把整个目录加入暂存区就行了。1
$ git add .
提交版本
将修改加入暂存区后,可以将其提交,这样就产生了一个版本:1
$ git commit -m '版本说明'
版本说明一定要认真写,不然以后就不知道哪个节点是哪个版本了,还是很乱。
查看版本历史
1 | $ git lg |
HEAD
指针指向当前工作区的版本,HEAD -> my-hexo-theme
就表示当前工作区版本为my-hexo-theme
,这个版本的分支名为my-hexo-theme
,版本id为22330cc
,后面的add archives
就是当初提交时填写的版本说明
。
比较版本
可以通过命令轻松的比较两个版本之间的差异:1
$ git diff 较老版本 较新版本
“较老/较新版本”可以填:
- 分支名
- 版本id
- HEAD^,HEAD^^等等(几个
^
就是HEAD回退几个版本)
也可以直接简写git diff
也就是git diff HEAD 工作区
,就是比较当前修改和最近提交的版本。
版本切换
1 | $ git reset --hard 版本 |
同样,“版本”可以填:
- 分支名
- 版本id
- HEAD^,HEAD^^等等
分支管理
- git最强大的就是分支功能了。有了分支功能,我们可以在好几个分支上进行开发或调试(在
master
分支上进行版本发布,在dev
分支上进行开发,若有临时需求可以在dev
分支上创建其他分支),可以应付各样的需求。 - 其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。
查看分支
查看本地分支
:1
$ git branch
查看远程分支
(例如github):1
$ git branch -r
创建+切换分支
创建分支:1
$ git branch 分支名
创建分支后我们往往会想切换到那个分支,所有一般直接创建+切换分支:1
$ git co -b 分支名
切换分支,也就是把HEAD指针指向某个分支:1
$ git co 分支名
合并分支
1 | $ git merge 分支名 |
这里要注意一下,合并分支时目标分支要比当前分支新,也就是说我们先git co 老分支
再git merge 新分支
。其实分支合并就是把老分支的指针指向新分支而已(大部分情况)。
删除分支
我们把临时分支合并到主分支后,往往想要删除临时分支:1
$ git branch -d 分支名
stash功能
当你在版本A的基础上开发一个新的功能,还无法编译使用。这时发现版本A有一个bug,要在版本A的基础上debug,这时就可以使用stash
功能把新功能的代码给临时保存起来(直接提交一个版本也可以,但是这样就会多出一个毫无意义的版本):1
$ git stash
现在工作区已经没有对于版本A的修改了,创建一个debug临时分支
:1
$ git co -b debug
在debug分支
上处理bug,处理完成后提交debug分支
:1
$ git comment -m 'fuck the bug'
切回原来的分支,比如dev分支
:1
$ git co dev
把stash
保存的现场恢复,继续开发新功能:1
$ git stash pop
这样的话敲几个命令就能省去拷贝好几份代码的麻烦,完美。
使用github
配置SSH Key
cd到主目录下,创建ssh-key:1
$ ssh-keygen -t rsa -C "youremail@example.com"
上面的youremail@example.com就是你自己的邮箱,然后一路回车,完成后应该可以在主目录下找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件。
然后到你的github账号设置里,有一个SSH Keys
的配置,把id_rsa.pub
里面的文本添加进去就可以了。
克隆仓库
克隆也就是下载版本库。比如你要克隆bootstrap项目的源码:1
$ git clone https://github.com/twbs/bootstrap
比如你要克隆自己的项目:1
$ git clone https://github.com/你的用户名/仓库名
或者1
$ git clone git@github.com:你的用户名/仓库名
添加远程仓库
先用你的github账号创建一个空的仓库,并指定仓库名;
然后添加远程仓库:1
$ git remote add origin git@github.com:你的用户名/仓库名
origin
是远程仓库在本地的名字,一般就是取origin
,约定俗成。
推送本地仓库到远程仓库
一次推送只能推送一个分支:1
$ git push origin 分支名
然后到你的github账号看看文件是否已经更新了。
拉取远程仓库到本地
假设你和别人共同开发一份代码,当别人push
之后那么远程仓库就比你本地的仓库要新了,这时就需要拉取远程仓库到本地:1
$ git pull origin 分支名
其实pull
就是fetch
+merge
,将远程分支下载到本地后合并;
你可以选择先fetch
看看别人写的辣鸡代码再决定是否合并,不想合并就把fetch
过来的分支删除。
tips
修改tabwidth
1 | git config --global core.pager 'less -x1,5' |
更新到最新版git
1 | sudo add-apt-repository ppa:git-core/ppa |