git 只能检测文本文件内容发生变化以及文件大小发生变化。其他的如图片视频等检测不出来
一、集中式的版本控制系统:SVN,CVS
-
以前使用的代码版本管理工具
-
版本库是集中存放在中央服务器(公司电脑)的,而干活的时候,用的是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了再把自己的活推送给中央服务器
-
中央服务器就好比是一个图书馆.你要改一本书.必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
-
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟
二、分布式版本控制系统:Git
-
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
-
既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,
-
你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了
三、分布式 VS 集中式
-
集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。
-
而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
-
由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。
-
同样是开源而且免费的SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。
-
Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。
多人配合,版本管理
SVN/CVS:客户端通过服务端的GIT下载资源到客户端进行修改
四、安装Git
(1)、Linux:
-
终端中直接输入 sudo apt-get install git
(2)、 Mac:
-
运行Xcode,菜单“Xcode”->“Preferences”,
-
在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了
(3)、 Windows:
-
安装后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
-
最后:
-
在命令行输入名字和邮箱进行登记:
-
必须先登记才能用,否则有的地方会提示你输入账户名和邮箱
$ git config —global user.name “Your Name” $ git config —global user.email “[email@example.com](mailto:email@example.com)”
-
五、创建版本库(repository)
(1)版本管理仓库
可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
-
创建一个空的文件夹(frankGit),确保目录名和父级目录名没有中文和符号
-
命令行:git init 把这个目录变成Git可以管理的仓库,初始化git仓库
-
会创建一个.git的隐藏文件,你可以手动将其显示出来(通过查看选项卡设置)
-
-
tips:
-
所有的版本控制系统,其实只能跟踪文本文件的改动,也就是在文本中修改和添加内容都可以被检测到。
-
图片、视频、Word这种二进制文件,无法跟踪变化,只能检测文件大小发生了变化。
-
(2)、git仓库的运行机制
1、创建的文件先是在本地存放(临时存放),然后通过命令推到暂存区,最后再通过命令,从缓存区推到git仓库中
2、这三个阶段都属于存放在本地,需要始终保持三区一致
-
本地文件,临时区
-
缓存/暂存区,缓存区
-
仓库,核心版本仓库区
(3)、常见的linux命令
/ //斜杠表示计算机根目录
ctrl+c //关闭服务器
cd 文件夹名 //找到这个文件夹(目录),和cmd的cd命令一样
cd /符盘号 //加上斜杠,表示进入指定符盘,相当于cmd的e:
ls //列出当前目录下的所以文件,相当于cmd的dir
clear //清屏,相当于cls
pwd //表示输出当前窗口所在的路径
mkdir 文件夹名 //创建一个目录(文件夹)
mkdir 文件夹名字 //常见目录文件夹
touch 文件名 //表示创建一个文件,(任何类型的文件都行,如js、css、html、md、txt等等)
cat 文件名 //表示预览文件内容
vi/vim 文件名 //表示这个文件进入编辑页面,vim是升级版
//以下进入编辑页面后的git命令:
i //切换到编辑模式
按下esc按键 //退出关闭编辑模式
:w //保存文件
:q //退出文件
:wq //保持并且退出编辑页面
六、git命令
-
git有新的一套命令行操作
-
GIT Gul here //图行
-
GIT Bash here //文本,主要使用这个命令行
-
ctrl+鼠标滚轮可以放大缩小字体
1、git命令
(1)、创建版本
git init //初始化git仓库,即开启一个git仓库,让这个文件目录变成git可以管理的仓库
git add 文件名 //将指定本地文件推到缓存区
git add . //将所有本地文件提交到缓存器
git commit -m"写入注释" //将文件从缓存区推向仓库,注释一定要写
//以上三个步骤只是将文件推送到本地仓库里,需要使用git push才能将文件推送到云端
git status //查看仓库当前状态 ,[每次修改,如果不add到暂存区,那就不会加入到commit中。]
//如果去修改了以经存放到仓库里的文件内容,再次使用,git status命令去查文件状态,会爆出提示,本地文件和缓存不一样…………,需要重复之前的推送步骤
git diff //different的缩小,查看修改的具体内容,只在本地阶段的时候我们才能看到修改的内容,如果做了提交则看不到了
(2)版本回退
git log //查看提交文件的历史记录(提交时每次的备注很重要)
git log --pretty=oneline //美化输出历史纪录输出结果,可以看到一个16进制的版本号
git reset --hard HEAD^ //回退到上一个版本
git reset --hard 版本号前几位/完整的版本号 //跳转到指定版本号的版本
git reflog //查看命令的历史纪录,【这里可以查看到所有文件的版本号】
(3)、撤销修改
git checkout --文件名 //(1)撤销本地文件的修改,[在没有提交的前提下]
//(2)如果是误删,可以撤销删除操作(本地)
git reset HEAD 文件名 //撤销暂存区文件的修改(暂存器)
git reset --hard HEAD^ //撤销版本库存里文件的修改:回退到上一个版本(仓库)
(4)、删除文件
rm 文件名 //删除本地文件,其他两个区的还存在
git status //会提示本地版和版本库不一致
git rm 文件名 //删除缓冲区的文件
git commit -m "本次删除了xx文件,以此为距" //删除版本库里面的文件
git checkout --文件名 //如果是误删,可以撤销操作(本地)
七、配置远程仓库,配置公钥
GitHub:用于提供Git仓库托管服务 ,只要注册一个GitHub账号,就可以免费获取Git远程仓库
GitHub是国外的,gitee是国内的,用于提供git仓库托管平台
配置公钥才可以上传代码到平台上
步骤:
-
打开github,注册一个账号。
-
创建ssh key,在C:\用户\用户名.ssh目录,如果没有id_rsa文件和id_rsa.pub文件,就需要创建。
ssh-keygen -t rsa -C “[154580967@qq.com](mailto:154580967@qq.com)”
-
打开git的面板里输入以上这条命令[输入你自己注册时用的邮箱名]
-
一路默认即一路回车
-
如果不配置ssh公钥的话,你的电脑的本地文件是提交不上去代码的,必须配置,你换一台电脑需配一次
-
然后去C盘用户文件夹里面找到ssh目录文件夹里,有id_rsa文件和id_rsa.pub文件。
-
将id_rsa.pub文件用记事本打开,复制里面的内容粘贴到,gitee码云平台设置里面的SSH,粘贴到SSH公钥里面,标题就是邮箱名,粘贴上密钥后会自动填上标题
-
-
登录GitHub,打开“Account settings”,“SSH Keys”页面:
3-1. 点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
3-2. 点“Add Key”,就应该看到已经添加的Key: [在GitHub上免费托管的Git仓库,任何人都可以看到。所以,不要把敏感信息放进去。]
八、新建仓库有两种方式
仓库与仓库之间是独立的,不能互相嵌套
-
从本地新建文件夹,新建本地git版本仓库,从本地把它推送到码云上去
-
第一种,先在云端码云上新键一个仓库,把他下载下来到本地来即克隆。然后到本地做修改然后提交上去即可
1-从本地同步到远程库
已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步
//1、新建一个文件夹,cd进入文键夹,使用git init 初始化创建git本地仓库
//2、可以去viscode进行操作
//3、配置一个远程仓库地址
//1、去码云创建一个新的空的云端仓库,这个云端仓库名称要和本地仓库的名字一致。
//2、复制云端远程地址
//3、输入命令,git remote add <name><url>,让本地仓库和远程仓库链接起来,[仓库名称 仓库地址]
//4、如果直接git push 有错的话,就是根据提示来,比如下面那样
//git push --set -upstream <name> 分支名
步骤:
-
登录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
2-从远程库克隆到本地
1、在gitee里点击右上方+号,创建仓库,仓库名根据项目而定,选择开源[所有人可见可用]/私有[仅仓库成员可见,可邀请成员]
2、点击创建,生成一个空的仓库出来,,会生成一个链接地址 ,复制,[后面会有用]
3、勾选inltlalize this respository a readme[自动创建readme.md文件可勾选可不勾选]
4、找到你要上传到云端的文件夹,在git命令行,输入:git clone 粘贴上刚刚复制的自动生成的链接
5、回车,出现一个文件夹,即你刚刚再码云上创建的一个仓库,然后cd 仓库名,进入仓库才能进行操作
5、touch readme.md , git add readme.md , git commit -m"提示信息"
6、输入git push 命令,将文件推送上云端
7、如果出现用户名或密码错误,则需要:进入控制面板——>用户账号——>管理window凭据——>普通凭据git:https://giteer,将这块内容给删除掉
8、重新克隆
9、完成
-
登录GitHub,创建一个新的仓库,名字叫gitskills
-
勾选Initialize this repository with a README,自动创建README.md文件。
-
命令行:git clone git@github.com:自己的帐户名/gitskills.git [可让多人从同一个仓库下载到自己的本地进行开发]
九、分支管理
-
分支就是科幻电影里面的平行宇宙,如果两个平行宇宙互不干扰,那对现在的你也没啥影响。
-
互不影响,相互独立
-
默认分支:master(主分支)
-
master分支一般用来放置一些测试已经通过,可以上线的代码
-
-
dev 分支:用于当前正在开发过程中的分支
-
buy分支:某个业务功能的测试分支,[如果这个分支做的好,和dev分支合并,不好就删除掉]
使用:
-
命令行: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 //查看分支合并图
强行删除分支(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:取决于你是否和你的小伙伴合作在上面开发]
云端仓库管理
-
仓库——管理——删除仓库
-
仓库——管理——仓库成员管理——成员权限[管理员/开发者……]——添加仓库成员——邀请链接+直接添加+通过仓库邀请成员
-
将仓库地址复制,进入本地文件去修改,然后推送
-
git pull //拉取,表示将本地代码更新为云端最新的代码,然后再git push
-
上图表示,云端代码和本地代码发生冲突,此时需要将文件整理好再进行提交
-
表示两个人修改同一份文件发生冲突,第三个人再次修改的时候,把一些乱七八糟的符号删掉再提交
-
出现特殊符号表示内容冲突
-
-
如果每次每个人都提交不同的文件就不会发生冲突问题
十、Visode的git使用
viscode插件
-
目录
-
全局搜索
-
git
-
左上侧,三个点,点开就是拉取、推送、克隆
-
当修改文件后点击小园圈里的1,就会出来一个修改前后的对比图,
-
文件旁边会有个小+号,这个就是git add 文件。表示将这个文件推送到缓存区
-
更改旁边的+符号,表示将所有的文件提交到缓存区,相当于add .
-
再上面的框里输入,add commit -m"注释",表示推送到仓库,点击最上面的对勾就是commit提交了
-
然后,三个点的地方拉取pull,之后提交push
-
左下角,分支选取
-
上面的是viscode自带的。有一款git插件[Gitlens-Git supercharged],可用可不用,
-
可用提供更丰富的
-
可以提示哪一行是谁提交的,什么时候提交的
-
-
-
调试
-
下载插件