本文参考:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
先扯一句,对于Linus花了两周时间用C写了Git这种行为,渣渣表示这是对牛X最好的诠释。
一、Git简介
Git嘛,就是一个分布式版本控制系统,GitHub则是提供Git仓库托管服务的。分布式是相对于集中式而言的,先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
二、Git安装
pass;
三、创建版本库
1、首先选择一个合适的地方
2、$ git init 将这个目录变成Git可以管理的仓库
3、每次修改后要先将修改放入staged区
$git add/rm <file>
如果是批量修改,可用 $ git add -A
4、告诉Git,把文件提交到仓库
$ git commit -m "description of change"
5、$ git status 查看当前仓库状态
PS:git的命令提示真的是极好的!!!
四、时光机穿梭
$ git log 查看历史纪录,加上参数 --pretty=online 可以减少输出信息。如:
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
3628164...882e1e0
的是commit id
(版本号),在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
$ git reset --hard HEAD^ 回退到上一个版本
$ git reset --hard 3628164 指定版本号回退,版本号不用写全,写个差不多就行,Git会自动去找
$ git reflog 用来记录每一次命令
工作区和暂存区的概念:
工作区就是能看到的目录
版本库就是隐藏的.git目录
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
git add把文件添加进去,实际上就是把文件修改添加到暂存区;
git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
$ git diff HEAD -- <file> 查看工作区和版本库里面最新版本的区别
$ git checkout -- <file> 丢弃工作区的修改
$ git reset HEAD <file> 可以把暂存区的修改撤销掉
五、远程仓库
在GitHub上添加远程仓库
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容:
点“Add Key”,你就应该看到已经添加的Key:
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
在GitHub上创建一个新的仓库后,把本地仓库的内容推送到GitHub仓库
$ git remote add origin git@github.com:<user_name>/<repo_name>.git
这样子就添加了了一个叫origin的远程库,下一步就是把本地库的所有内容推送到远程库上:4
$ git push -u origin master
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。关联起来以后只需要通过命令:
$ git push origin master
从远程库克隆一个本地库(SSH方式)
$ git clone git@github.com:<user_name>/<repo_name>.git
六、分支管理
$ git branch 查看分支
$ git branch <branch_name> 创建分支
$ git checkout <branch_name> 切换分支
$ git checkout -b <branch_name> 创建+切换分支
$ git merge <branch_name> 合并某分支到当前分支
$ git branch -d <branch_name> 删除分支
$ git log --graph 查看分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
$ git merge --no-ff -m "<commit>" <branch_name> 合并分支禁用Fast forward
分支策略在实际开发中的应用
七、标签管理
$ git tag <tag_name> 新建一个标签,默认为HEAD,也可以指定一个commit id
$ git tag -a <tag_name> -m "<commit>" 指定标签信息
$ git tag -s <tag_name> -m "<commit>" 用PGP签名标签
$ git tag 查看所有标签
$ git push origin <tag_name> 推送一个标签
$ git push origin --tags 推送全部未推送过的本地标签
$ git tag -d <tag_name> 删除一个本地标签
$ git push origin :refs/tags/<tag_name> 删除一个远程标签