CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统git
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是本身的电脑,因此要先从中央服务器取得最新的版本,而后开始干活,干完活了,再把本身的活推送给中央服务器。中央服务器就比如是一个图书馆,你要改一本书,必须先从图书馆借出来,而后回到家本身改,改完了,再放回图书馆。 集中式版本控制系统最大的毛病就是必须联网才能工做,若是在局域网内还好,带宽够大,速度够快,可若是在互联网上,遇到网速慢的话,可能提交一个10M的文件就须要5分钟,这还不得把人给憋死啊。github
分布式版本控制系统根本没有“中央服务器”,每一个人的电脑上都是一个完整的版本库,这样,你工做的时候,就不须要联网了,由于版本库就在你本身的电脑上。xcode
CVS做为最先的开源并且免费的集中式版本控制系统,直到如今还有很多人在用。因为CVS自身设计的问题,会形成提交文件不完整,版本库莫名其妙损坏的状况。一样是开源并且免费的SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。服务器
Git是一款免费、开源的分布式版本控制系统,app
pwd
命令用于显示当前目录分布式
git init
命令把这个目录变成Git能够管理的仓库fetch
git reflog
用来记录你的每一次命令ui
git log
命令显示从最近到最远的提交日志 git log --pretty=oneline 简化日志信息 git log --graph 命令能够看到分支合并图 一大串相似 3628164...882e1e0 的是commit id(版本号),和SVN不同,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个很是大的数字,用十六进制表示spa
git reset --hard HEAD^
回退到上一个版本,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,固然往上100个版本写100个^比较容易数不过来,因此写成HEAD~100git reset --hard 3628164
回退到指定版本,版本号不必写全,前几位就能够了,Git会自动去找git status
命令可让咱们时刻掌握仓库当前的状态,告诉你有文件被修改过git diff
能够查看修改内容git add 文件名.扩展名
把文件修改添加到暂存区git commit -m '本次提交的说明'
把暂存区的全部内容提交到当前分支git checkout -- readme.txt
把readme.txt文件在工做区的修改所有撤销 一种是readme.txt自修改后尚未被放到暂存区,如今,撤销修改就回到和版本库如出一辙的状态; 一种是readme.txt已经添加到暂存区后,又做了修改,如今,撤销修改就回到添加到暂存区后的状态。git push -u origin master
因为远程库是空的,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在之后的推送或者拉取时就能够简化命令。git push origin master
把本地分支的最新修改推送远程git remote add origin git@server-name:path/repo-name.git
关联一个远程库git clone git@github.com:michaelliao/gitskills.git
克隆仓库到本地Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。设计
git branch dev
在当前分支基础上建立 dev 分支
git checkout dev
切换到 dev 分支
git checkout -b dev
在当前分支基础上建立并切换到dev分支 至关于 git branch dev
和 git checkout dev
2个命令
git branch
会列出全部分支,当前分支前面会标一个*号。
git merge dev
用于合并 指定分支dev 到当前分支
git merge --no-ff -m "merge with no-ff" dev
注意--no-ff参数,表示禁用Fast forward 合并分支时,若是可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 若是要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就能够看出分支信息。 合并分支时,加上--no-ff参数就能够用普通模式合并,合并后的历史有分支,能看出来曾经作过合并,而fast forward合并就看不出来曾经作过合并。
git branch -d dev
删除dev分支
git branch -D dev
git stash
能够把当前工做现场“储藏”起来,等之后恢复现场后继续工做
git stash list
查看工做现场
Git把stash内容存在某个地方了,可是须要恢复一下
git push origin branch-name
从本地推送到远程分支,若是推送失败,先用 git pull
抓取远程的新提交
git remote -v
查看远程库信息,显示了能够抓取和推送的origin的地址
git checkout -b branch-name origin/branch-name
在本地建立和远程分支对应的分支,本地和远程分支的名称最好一致
git branch --set-upstream branch-name origin/branch-name
创建本地分支和远程分支的关联
git fetch [branch-name]
取回全部分支(branch)的更新。若是只想取回特定分支的更新,能够指定分支名,将某个远程主机的更新,所有取回本地
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?可是分支能够移动,标签不能移动),tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一块儿。
git tag <name>
就能够打一个新标签,默认标签是打在最新提交的commit上的git tag v0.9 6224937
给 历史提交的commit id 打标签git tag -a v0.1 -m "version 0.1 released" 3628164
给 历史提交的commit id 建立带有说明的标签,用-a指定标签名,-m指定说明文字git tag
查看全部标签,标签不是按时间顺序列出,而是按字母排序的git show <tagname>
查看标签信息git push origin <tagname>
推送某个标签到远程git push origin --tags
一次性推送所有还没有推送到远程的本地标签git tag -d <tagname>
能够删除一个本地标签git push origin :refs/tags/<tagname>
能够删除一个远程标签。 若是标签已经推送到远程,要删除远程标签,先从本地删除: git tag -d v0.9
而后,从远程删除: git push origin :refs/tags/v0.9
git config --global color.ui true
git merge dev
用于合并 指定分支dev 到当前分支 文件冲突,必须手动解决冲突后再提交。 git status
也能够告诉咱们冲突的文件 Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容
每一个bug均可以经过一个新的临时分支来修复,修复后,合并分支,而后将临时分支删除。
reset命令有3种方式: 1:git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息 2:git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。若是还要提交,直接commit便可 3:git reset –hard:完全回退到某个版本,本地的源码也会变为上一个版本的内容
# 回退全部内容到上一个版本 git reset HEAD^ # 回退a.py这个文件的版本到上一个版本 git reset HEAD^ a.py # 向前回退到第3个版本 git reset –soft HEAD~3 # 将本地的状态回退到和远程的同样 git reset –hard origin/master # 回退到某个版本 git reset 057d # 回退到上一次提交的状态,按照某一次的commit彻底反向的进行一次commit git revert HEAD
git checkout主要有三个做用:
git reset主要是取消上一次的操做,具体用法有不少,说两个:
git checkout -- file;
撤销对工做区修改;这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工做区对应文件file;这个命令改变的是工做区
git reset HEAD -- file
清空add命令向暂存区提交的关于file文件的修改(Ustage);这个命令仅改变暂存区,并不改变工做区,这意味着在无任何其余操做的状况下,工做区中的实际文件同该命令运行以前无任何变化
cd 项目根目录
touch .gitignore
在文件夹就生成了一个.gitignore文件git rm --cached XXX.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate