集中式的版本控制系统:SVN,CVS
版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,
然后开始干活,干完活了,再把自己的活推送给中央服务器。
中央服务器就好比是一个图书馆.你要改一本书.必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,
可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟
分布式版本控制系统:Git
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,
就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?
比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,
你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
安装Git
Linux:
终端中直接输入 sudo apt-get install git
Mac:
运行Xcode,菜单“Xcode”->“Preferences”,
在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了
Windows:
下载地址:https://git-for-windows.github.io
安装后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
最后:
在命令行输入名字和邮箱进行登记:
$ git config --global user.name “Your Name”
$ git config --global user.email “email@example.com”
创建版本库(repository)
可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,
以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
- 创建一个空的文件夹(frankGit),确保目录名和父级目录名没有中文和符号
- 命令行:git init 把这个目录变成Git可以管理的仓库
tips:
所有的版本控制系统,其实只能跟踪文本文件的改动,也就是在文本中修改和添加内容都可以被检测到。
图片、视频、Word这种二进制文件,无法跟踪变化,只能检测文件大小发生了变化。
将文件添加到版本库
- 创建一个readme.md文件
内容:do you love me? - 放在frankGit或frankGit的子目录
- 命令行: git add readme.md //把文件添加到仓库暂存区,可以添加多次之后再进行commit
- 命令行: git commit -m “本次提交了XXXX,么么哒” //把文件提交到仓库
查看版本库状态和修改记录
- 修改readme.md文件 内容:do you hate me?
- 命令行:git status //仓库当前的状态
- 查看修改具体内容:git diff
- 再次提交到版本库暂存区:git add readme.md
- 再查看状态:git status
- 再次提交到版本库:git commit -m “呵呵,这次我不爱你了。”
- 再查看状态:git status
- 编辑: vim readme.md
- 编辑模式:i
- 结束编辑模式:esc
- 保存并退出: 冒号wq 回车
- cat radme.md 查看文件
- ls 查看当前目录文件
[每次修改,如果不add到暂存区,那就不会加入到commit中。]
版本回退
- 命令行:git log //查看提交的历史记录
- 命令行:git log --pretty=oneline //美化输出结果,可以看到一串十六进制的版本号
- 命令行:git reset --hard HEAD^ //回退到上一个版本
- 命令行:git reset --hard 版本号前几位 //也可以通过版本号跳转到指定版本
命令行:git reflog //查看命令的历史记录
撤销修改
- 命令行:git checkout – readme.md //撤销本地文件的修改
- 命令行:git reset HEAD readme.md //撤销暂存区文件的修改
- 命令行:git reset --hard HEAD^ //撤销版本库里文件的修改:回退到上一个版本
删除文件
- 命令行:rm readme.md //删除本地文件
- 命令行:git status //提示本地和版本库不一致
- 命令行:git rm readme.md //删除缓冲区文件
- 命令行:git commit -m “本次删除了readme文件,以此为据” //删除版本库里文件
- 命令行:git checkout – readme.md //如果是误删,可以撤销删除操作
配置远程仓库
GitHub:用于提供Git仓库托管服务 ,只要注册一个GitHub账号,就可以免费获取Git远程仓库
步骤:
- 打开github,注册一个账号。
- 创建ssh key,在C:\用户\用户名.ssh目录,如果没有id_rsa文件和id_rsa.pub文件,就需要创建。
2-1. ssh-keygen -t rsa -C “154580967@qq.com”
2-2. 一路默认 - 登录GitHub,打开“Account settings”,“SSH Keys”页面:
3-1. 点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
3-2. 点“Add Key”,就应该看到已经添加的Key:
[在GitHub上免费托管的Git仓库,任何人都可以看到。所以,不要把敏感信息放进去。]
从本地同步到远程库
已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步
步骤:
- 登录GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库
- 在Repository name填入frankGit,其他默认,点击“Create repository”,就成功地创建了一个新的Git仓库
- 命令行:git remote add origin git@github.com:自己的帐户名/frankGit.git //origin是自定义远程库的名字
[git 解决fatal: Not a git repository:git init] - 命令行:git push -u origin master //将当前分支推送到远程,并将本地master和远程master关联起来
[推送前确保本地仓库是有东西的,commit过的] - 命令行:git push origin master //把本地master分支的最新修改推送至GitHub
从远程库克隆到本地
- 登录GitHub,创建一个新的仓库,名字叫gitskills
- 勾选Initialize this repository with a README,自动创建README.md文件。
- 命令行:git clone git@github.com:自己的帐户名/gitskills.git
[可让多人从同一个仓库下载到自己的本地进行开发]
分支管理
分支就是科幻电影里面的平行宇宙,如果两个平行宇宙互不干扰,那对现在的你也没啥影响。
默认分支:master
使用:
- 命令行:git branch dev //创建分支dev
- 命令行:git checkout dev //切换到dev分支
- 命令行:git checkout -b dev //创建分支dev,并切换到dev分支
- 命令行:git branch //查看当前分支,前面带*号的就是当前分支
- 命令行:git add readme.md
git commit -m “本次是从dev分支提交的” - 命令行:git checkout master //切换回master
- 命令行:vi readme.md //再查看文件,会发现文件中刚添加的内容不存在了。
- 命令行:git merge dev //合并指定分支到当前分支
- 命令行:git branch -d dev //删除dev分支
- 命令行:git branch //再查看,dev分支就没有了
- 如果两个分支同时修改一个文件,提交。再合并,就会出现冲突。
- 只需要将冲突的文件打开,删除标记,重新add和commit
- 命令行:git branch -d dev
- 命令行:git log --graph //查看分支合并图
分支管理策略
合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
- 命令行:git checkout -b dev //创建并切换到dev分支
- 修改readme.md文件并提交到版本库
命令行:vi readme.md
命令行:git add readme.md
命令行:git commit -m “add merge” - 命令行:git checkout master //切换到master
- 命令行:git merge --no-ff -m “merge with no-ff” dev //合并dev分支,–no-ff表示禁用Fast forward
- 命令行:git log --graph --pretty=oneline --abbrev-commit //查看分支历史
[master分支应仅用来发布新版本,不应该在master上干活。]
[小蓝:blue] ->dev[核心开发分支]
[小红:red] ->dev[核心开发分支] ->master[发布]
[小黄:yellow] ->dev[核心开发分支]
强行删除分支(feature)
- 命令行:git checkout -b feature //创建新分支并切换
- 命令行:vi work.js //创建work.js文件
- 命令行:git add work.js //添加到缓存区
- 命令行:git commit -m “添加一个新的分支咯” //添加到版本库一个新分支
- 命令行:git checkout dev //切换回dev分支
- 命令行:git branch -d feature //还未合并就要马上删除feature分支
- 命令行:git branch -D feature //必须强行删除才可以
多人协作
- 命令行:git remote //查看远程库的信息
- 命令行:git remote -v //显示更详细的远程库信息
- 命令行:git push origin master //把master分支上的所有本地提交推送到远程库
- 命令行:git push origin dev //推送dev分支到远程库
强制推送:git push -u origin dev -f - 当自己和伙伴提交有冲突时,使用git pull把最新的提交从远程库下载下来,在本地合并,再推送。
命令行:git branch --set-upstream dev origin/dev //指定本地dev分支与远程origin/dev分支的链接
命令行:git pull --rebase origin master - 命令行:git add readme.md
- 命令行:git commit -m “合并后再提交”
工作模式
[repository-点击settings-选择collaborators-搜索框中搜索合作者账号然后add,然后给合作者发确认邮件]
[必须在SSH中添加合作者的pub.key]
- 克隆到本地环境
- 修改文件先在本地进行提交
- 用git push origin branch-name推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull origin branch-name 试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
- 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,
用命令git branch --set-upstream branch-name origin/branch-name。 - git 出现 fatal: refusing to merge unrelated histories 错误,其实这个问题是因为 两个 根本不相干的 git 库
git pull origin master --allow-unrelated-histories 把两段不相干的 分支进行强行合并
[master:主分支要时刻与远程同步]
[dev:开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步]
[bug:本地修复bug记录,不需要推送到远程]
[feature:取决于你是否和你的小伙伴合作在上面开发]