git教程来自:廖雪峰的git教程。
教程里面有下载路径,不过这里还是再贴一份吧。(国内镜像)
这里说两句趣谈,当然也是从教程里看到的,真的没想到git
的诞生是因为:
开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:Linus(那个写了Linux
的男人)花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。
集中式VS分布式
在这里版本控制的意思是:我经常改我写的东西(别人也会改),而且我也不知道这次改了对不对,但是不改就不知道对错,那就很头疼了。万一改错了我得回滚,但是改的次数多了就不知道自己回滚的那一版对不对了,这个时候就出现了版本控制系统了,他可能帮你把每次的修改都记录下来,还可以附加一句话说明你改了什么地方,让你可以随时准确的回滚到你想要的版本。
- 集中式
集中式的概念是:代码托管在一台专门的机器上(中央服务器),大家一起修改的时候,都像这台机器提交修改内容,别人想要你的最新的内容,也是去“中央服务器”上更新。这样做带来的问题就是大家都必须联网才能提交和更新,另外就是如果大家的网速差或者“中央服务器”的访问速度很慢,那我们更新内容的时候就得一直等着了,这样会影响效率的。另外一点就是“中央服务器”出了问题,那大家就都没的玩了。 - 分布式
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
分布式的介绍不是很清楚,我个人觉得关于分布式大家可以看看专门去了解一下分布式的意义。
当然说这些话的目的就是告诉你,git真的很好用。
这之后的内容因为博主个人的原因,就只会记录一些git的命令,主要方便自己查阅,如果看到这里的朋友真的想要学习git的话,可以去博客刚开始的链接里学习,讲的非常帮。
创建git
仓库
$ git init #将当前目录作为git仓库,并且当前目录会多一个`.git`的子目录
添加文件到Git
仓库:
- 使用命令
git add <file>
,可多次使用,反复提交 - 使用命令
git commit
,提交,完成添加操作
git status #查看git当前工作区的状态
git diff <file> #查看文件与仓库中的版本有何不同,只能查看未提交但修改了的文件
版本回退
$ git log #显示从最近到最远的提交日志
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
append GPL
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file
简易版
$ git log --pretty=oneline #显示提交日志,每次提交的日志只占一行,前面的值是commit id
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
$ git reset --hard HEAD^ #回退到上一个版本,上上个版本是HEAD^^,上100个版本是HEAD~100
$ git reflog #记录每一次的命令
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
撤销修改
首先介绍一下工作区和暂存区,版本库的概念。
详细介绍:看这里
撤销修改的内容
$ git checkout -- file #把文件在工作区的修改全部撤销,回退到最近一次git add或git commit的版本
$ git reset HEAD file #撤销文件在暂存区的修改,重新放回工作区
删除
$ git rm file #从版本库中删除文件
$ git commit -m "" #两步操作一起做,才能让工作区变得干净
Git关联远程库
git
关联github
仓库:看这里
git remote add origin git@server-name:path/repo-name.git #关联远程库
git push -u origin master #关联后,第一次推送master分支的所有内容
git push origin master #本地提交后,如果有必要,推送到远程库
从远程库克隆到本地
$ git clone git@github.com:michaelliao/gitskills.git #拿廖老师的教程做个实例
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd gitskills
$ ls
README.md
Git分支管理
git branch #查看分支
git branch <name> #创建分支
git checkout <name> #切换分支
git chechout -b <name> #创建+切换分支
git merge <name> #合并某分支到当前分支
git branch -d <name> #删除指定分支
Git分支冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成
git log --graph #可以查看分支合并图
git merge --no-ff dev #合并分支(禁用fast forward),可以看出来合并过有新的commit
Bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
删除分支
开发一个新feature,最好新建一个分支
git branch -D <name> #强行删除一个分支
多人与远程库的交互操作
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
Git标签
git tag <name> #新建一个标签,默认是为HEAD,也可以指定其他commit
git tag -a <tagname> -m "blablabla..." #指定标签信息
git tag -s <tagname> -m "blablabla..." #使用PGP签名
git tag #查看所有标签
git push origin <name> #推送指定本地标签
git push origin --tags #推送所有未推送的本地标签
git tag -d <name> #删除一个本地标签
git push origin:refs/tags/<tagname> #删除一个远程标签