git是一种版本管理工具,可以备份文件,记录历史(就算彻底删除也可以在历史中找到),多端共享
版本管理工具历史:
- CVS 1985(始祖) 集中式管理,只要联系到中心服务器,就可以使用和保存,但是没有网络的话 ,无法工作
- SVN 2000(集大成者),在集中式管理的基础上,采取分支管理系统,可以多人开发一个项目来达到共用资源的目的
- git 2005 分布式版本控制系统
- github 2008 托管平台,只支持git
集中式管理系统:
优点:
- 管理方便,逻辑明确,符合一般人思维习惯
- 易于管理,集中式服务器更能保证安全性
- 代码一致性非常高
- 适合开发人数不多的项目开发
缺点:
- 确立服务器开发者几乎无法工作
- 必须要联网才能工作,而且对网络的依赖性较强,如果推送的文件比较大而且网络状况欠佳,提交文件的速度会受到很大的限制
分布式版本控制系统:
用户之间也可以进行文件传递
优点:
-
公共服务器压力和数据量都不会太大
-
速度快、灵活
-
任意两个开发者之间可以很容易的解决冲突
-
离线工作
缺点:
- 资料少
- 学习周期相对而言比较长
- 不符合常规思维
对比:
git的操作和使用
安装好git之后,需要自报家门
git config --global user.name "username"
git config --global user.email "useremail"
进入需要进行管理的文件夹
使用 git init 命令,文件夹下面就会多出来一个 .git 文件夹,说明该文件夹已经被git所管理
创建版本库
touch index.html 新建一个html文件
git add index.html 添加文件到临时仓库中,可以通过git status查看仓库内容
git commit -m "第一次提交文件" ,提交文件,“”里可以添加任何备注信息
版本回退,修改的暂存区里的内容
修改index.html之后查看仓库内容(git status)
显示发生了修改,但是是红色(还在工作区),说明还没有添加到临时仓库中,需要再add一下(git add index.html),没有提交就不是一个新版本
新建一个a.html文件(touch a.html)
查看仓库状态(git status):
显示临时仓库内index.html已经被修改,a.html还没有被添加进仓库里
git add a.html
git commit -m "第二次提交,修改了index.html,新增了a.html"
git log 查看版本信息
commit对应当前的版本id,head执行master分支,也就是提交的仓库。
可以通过commit ID或head指针,恢复到之前的状态
git reset --hard HEAD^ 回退到上一个版本,也就是回到第一次提交的时候(几个^就是回退几个版本)
git reset --hard 261aa44 ,如果对修改反悔了,也是可以回退到对应的版本的,只要通过id值就返回任意版本
git refolg 查看所有操作,不用担心找不到id
工作区和暂存区
工作区就是未经提交的区间,通过status查看时,工作区的文件显示的红色的
暂存区是指临时仓库的区间,工作区的文件add到临时仓库中,就到了暂存区
master仓库(head指向):通过commit命令从暂存区提交到master,提交了之后,暂存区就不会有该文件了,提交上来的文件都会被存储为一个新版本的文件,可以通过版本id值任意回溯调取使用
git diff 查看工作区和暂存区的区别
git diff --cached 查看暂存区和master区域的区别
git checkout 工作区修改了内容,但没添加进暂存区,checkout会将工作区修改的内容清空,恢复成没修改时的样子;还有一种情况是,使用了reset命令,暂存区的版本回退,和工作区的内容不一致,通过checkout可以将工作区的内容和暂存区的内容保持一致,清除掉多出来的内容
远程仓库
可以在github上创建一个git仓库,和本地的git仓库进行远程同步。资源github上的仓库既可以作为备份,也可以多人协作。
秘钥设定
打开github,登录后,点击用户头像->setting->SSH and GPG keys,在key中填入电脑上.ssh文件下,id_rsa.pub文件的内容
然后电脑上没有.ssh文件夹,输入ssh-keygen -t rsa -C "your_email@example.com"名,就可以生成一个ssh文件夹
创建仓库
在+按钮那新建一个仓库,命名之后进入这个界面
拿到后面的链接
git remote add origin git@github.com:holly-huang/gitDemo.git 通过这行命令与远程仓库进行连接
git push -u origin master 推送文件,第一次推送把-u加上
刷新页面就可以看到上传的结果
要是想要修改内容,再 git push origin master更新文件即可
分支管理
当你想要开发一个新功能,而工作量又很大,不能在短时间内完成。如果直接在master分支上备份正在做的功能,可能会影响到别人的工作。但是等功能完成之后再上传,这个过程中有可能会面临文件丢失的风险。
所以就需要分支管理,在自己的分支上完成修改等一系列操作,也不会影响到别人,等最后完成之后再一次性提交到master分支上
完整过程如下:
master分支是一条线,记录版本迭代的过程,git用master指向最新的提交操作,然后再用head指向master。
每次提交,master都会向前移动一步,随着你不断提交,master分支也越来越长。、
创建新分支,git新建一个指针dev,指向相同的提交,再把head指向dev
对工作区的修改和提交对dev分支,新提交一次后,dev指向向前移动一步,而master指针不变
dev工作完成后,合并到master上,直接把master指向dev的当前提交,就完成了合并
合并完成后,删除dev分支就只剩master一条分支
相关命令
git branch 查看分支
git branch 创建分支,创建了并不意味已经在分支上了
git checkout 切换分支
git checkout -b 创建+切换分支
git merge 合并某分支到当前分支
git branch -d 删除分支
git log --graph 查看分支合并图
多人协作
git remote -v 查看远程仓库的信息
连接到远程仓库之后,可以上传不同分支的文件
多人协作时,也是使用某一分支提供的SSH链接 git.clone git@github.com...(注意是clone而不是add),然后就可以看到多出来的仓库中的文件
如果你使用的仓库文件是旧的版本,就会存在冲突,不能上传,那么就要使用git pull获得仓库最新的文件(从远程抓取分支)
要使用分支的话,还要和远程的分支相关联 git branch --set-upstream-to=origin/<branch_name> dev,然后同样需要获取最新的文件git pull