git在日常工作中是必然会遇到的一个版本管理工具,如果说以前大部分人还在用SVN,那么现在那个时代基本终结了,取而代之的是git。接下来我们就来介绍一下git和它的使用方法。
集中式版本管理系统和分布式版本管理系统的区别
集中式版本管理系统
集中式版本管理系统以SVN为代表,其特点是用一个“中央服务器”,代码存放在“中央服务器”上面,个人想要下载代码需要从“中央服务器”上下载,所以需要联网条件。既然现在还有小部分人在用SVN,那么它必然有优点,所以我们来总结一下优缺点
优点总结:
1.操作简单,使用没有难度,可轻松上手。
2.文件夹级权限控制,权限控制粒度小。
3.对客户端配置要求不高,无需存储全套代码。
缺点总结:
1.网络环境要求高,相关人员必须联网才能工作。
2.中央服务器的单点故障影响全局,如果服务器宕机,所有人都无法工作。
3.中央服务器在没有备份的情况下,磁盘一旦被损坏,将丢失所有数据。
分布式版本管理系统
分布式版本管理的特点是每个客户端都是代码仓库的完整镜像,所有数据分布的存储在每个客户端,不存在中央服务器。所以一台机器宕机对整个系统没有任何影响。
有点总结:
1.版本库本地化,版本库的完整克隆,包括标签、分支、版本记录等。
2.支持离线提交,适合跨地域协同开发。
3.分支切换快速高效,创建和销毁分支廉价。
缺点总结:
1.学习成本高,不容易上手。
2.只能针对整个仓库创建分支,无法根据目录建立层次性的分支。
初始化项目
1.进入项目目录
2.执行git初始化指令git init
提交代码
第一步:git add 将当前新建、修改过的文件的内容生成快照,加入到索引中,或者删除工作树中不存在的路径。工作区——>暂存区
git add xxx.js (提交具体的某个文件)
git add . (提交所有变动文件)
第二步:git commit -m "aaaa" 将变动提交到暂存区 暂存区——>当前分支
第三步:git push 将代码上传到版本库 当前分支——>远程分支
常用指令
git status 查看当前分支的变动情况
git diff 查看具体变动
这里分为两种情况,一种是当暂存区中有文件时,另一种是暂存区中没有文件。
(1)当暂存区中没有文件时,git diff比较的是,工作区中的文件与上次提交到版本库中的文件。
(2)当暂存区中有文件时,git diff则比较的是,当前工作区中的文件与暂存区中的文件。
而 git diff HEAD -- file,比较的是工作区中的文件与版本库中文件的差异。HEAD指向的是版本库中的当前版本,而file指的是当前工作区中的文件。
如果要查看已暂存的将要添加到下次提交里的内容,可以使用git diff --cached或者git diff --staged。
git log 查看提交记录
git reflog 查看每次的操作记录
git reset --hard HEAD^ 回退版本,几个"^"就回退到之前的第几个版本,HEAD~n,这样也行
git reset --hard 3628sada3832nnfs164 回到一个指定版本
git reset HEAD
git checkout -- readme.txt 撤销修改
这⾥有两种情况:
⼀种是readme.txt⾃修改后还没有被放到暂存区,现在,撤销修改就回到和版本库⼀模⼀样的状态;
⼀种是readme.txt已经添加到暂存区后,⼜作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个⽂件回到最近⼀次git commit或git add时的状态。
回撤场景总结
1.工作区回撤
git checkout
2.提交到了暂存区回撤
git reset HEAD
git checkout
3.提交到版本库
git reset --hard 34sdjfdsff342dfd3j43dj3
创建github仓库
步骤一:创建SSH key
$ ssh-keygen -t rsa -C "[email protected]"
执行之后会在⽤户主目录⾥找到.ssh目录,⾥⾯有id_rsa和id_rsa.pub两个⽂件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放⼼地告诉任何⼈。
步骤二:设置github里的key
登陆GitHub,打开“Account settings”,“SSH Keys”⻚⾯:然后,点“Add SSH Key”,填上任意Title,在Key⽂本框⾥粘贴id_rsa.pub⽂件的内容
仓库、分支相关指令
克隆仓库:git clone
克隆指定分支:git clone -b
查看分⽀:git branch
创建分⽀:git branch name
切换分⽀:git checkout name
整理、排版:numbbbbb
创建+切换分⽀:git checkout -b name
合并某分⽀到当前分⽀:git merge name
删除分⽀:git branch -d name
删除远程分支:git push origin --delete
git stash的使用
有时候你在一个分支上开发了一部分功能,但是还没有开发完,这个时候有个bug出现了需要立刻修复,你需要切换分支,此时当前分支的改动你不想提交,也不想撤销,那么最合适的处理方式就是使用git stash,把你工作区中间状态的代码提交到git栈中。
git stash save "message"
git stash list 查看stash记录
git stash pop 恢复stash内容,把栈里面的内容删除
git stash apply <版本>恢复stash内容,栈里面的内容不删除
git stash drop 删除栈里的内容
git rebase的使用
rebase指令即常说的“变基”,改变分支hard指针的指向,可以把乱糟糟的分支线变成一条直线。还可以合并多次提交
合并提交
git rebase -i HEAD~n 合并之前的n次提交,会弹出来一个编辑窗口:内容如下
pick 3ca6ec3 '注释**********'
pick1b40566'注释*********
'pick 53f244a '注释**********'
.将pick改为squash或者s,之后保存并关闭文本编辑窗口即可。改完之后文本内容如下:
pick 3ca6ec3 '注释**********'
s1b40566'注释*********'
s 53f244a '注释**********'
如果有冲突就解决冲突,解决完之后
git add.
git rebase --continue
改变分支hard指针的指向
和merge一样,都是用来合并代码的,merge会自动生成一个commit,在这个节点上,会有两个指针指向不同的分支。
rebase会生成一份快照,粘贴到要合并分支后面,并且把原分支上的相关节点删除点,看上去就是一条直线