git介绍
1.两类版本控制工具
常用版本 | 形式 | 版本管理方式 | 优点 | 缺点 |
---|---|---|---|---|
svn | 集中式 | 增量式 | 1、管理方式在服务端配置好,客户端只需要同步提交即可 2、在服务端统一控制好访问权限,利用代码的安全管理 3、所有的代码已服务端为准,代码一致性高 | 1、存在单点故障问题 2、分支管理不灵活 3.需要联网 |
git | 分布式 | 文件快照 | 1、git分支的本质是一个指向提交快照的指针,分支操作非常快捷流畅 2、大部分操作在本地完成,不需要联网 3.可以对团队外开发者贡献的代码进行审核 | 1、git没有严格的权限控制 2、工作目录只能是整个目录 |
2.结构与工作流程
3.本地状态
-
已修改 (modified)
工作区修改了某个文件,但还没放到暂存区
-
已暂存 (staged / cached)
把已修改的文件放在暂存区,即下次提交时要提交的清单中
-
已提交 (committed)
该文件已经被安全地保存在本地版本库中了
4.命令行操作
4.1初始化
git init
注:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要随便修改
4.2设置签名
作用:区分不同开发人员的身份
4.2.1项目级别/仓库级别:仅在当前本地库范围内有效
信息保存的位置:./.git/config
git config user.name [name]
git config user.email [email]
4.2.2系统用户级别:登录当前操作系统的用户范围
信息保存的位置:~/.gitconfig
git config --global user.name [name]
git config --global user.email [email]
两者级别优先级
- 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
- 如果只有系统用户级别的签名,就以系统用户级别的签名为准
- 二者都没有是不允许的
- 通常为了省事只设置系统用户级别的
4.3基本操作
1.状态查看命令
git status #作用:用来查看工作区,暂存区的状态
2.添加及提交操作
git add [file name] #作用:将工作区的新建/修改提交到暂存区
git commit –m “commit message” [file name] #作用:将暂存区提交到本地库
3.查看历史记录
git log
git log -p -n #显示n次提交所引入的差异
git log --pretty=oneline #每条日志的输出为一行,只显示版本号和提交时的备注
git log –oneline
git reflog #可以查看所有分支的所有操作记录
#HEAD@{移动到当前版本需要多少步}
4.搜索git日志
git log --author yourname #通过作者搜索
git log --grep keywords #通过提交关键字搜索
git log -p -- RELEASE-NOTE.md #通过文件名搜索
5.删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库
git reset –hard[指针位置]
注:删除操作已经提交到了本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用HEAD
6.比较文件差异
git diff[文件名]
#将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本][文件名]
#将工作区中的文件和本地库历史记录比较
#不带文件名比较多个文件
5.历史记录的前进后退操作
git reflog #查看局部索引值
显示示例
例如第一行 d725802就是局部索引值
git reset --hard [局部索引值] #基于索引值操作,“推荐使用”
git reset --hard HEAD^ #只能后退,注:一个^表示后退一步,n个表示n步
git reset --hard HEAD~n #只能后退,表示后退n步
6.reset命令的三个参数对比
–soft | 仅仅在本地库移动HEAD指针 |
---|---|
–mixed | 在本地库移动HEAD指针,另外也会重置暂存区 |
–hard | 在本地库移动HEAD指针,重置暂存区,重置工作区 |
6.分支管理
1.分支
在版本控制过程中,使用多条线同时推进多个任务
分支的好处:
- 同时并行推进多个功能的开发,提高开发效果
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他的分支有任何影响,失败的分支删除重新开始即可。
git branch [分支名] #创建分支
git branch –v #查看分支
git checkout[分支名] #切换分支
2.合并分支步骤
#第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并的分支名]
#第二步:执行merge命令
git merge [有新内容分支名]
3…解决冲突
冲突原因:两个已经提交的分支的相同文件相同位置的的不同操作进行了合并
冲突的表现:
冲突的解决:
#第一步:编辑文件,删除特殊符号
#第二步:把文件修改到满意的程度,保存退出
#第三步:git add [文件名]
#第四步:git commit –m “日志信息”
注意:此时commit一定不能带具体文件名
4.git的推送·克隆·拉取
#推送
git push [别名][分支名] #推送
-
#克隆
git origin [远程地址] #1.完整的把远程库下载到本地
#2.创建origin远程地址别名
#3.初始化本地库
#拉取
git fitch[远程库地址别名][远程分支名]
git merge[远程库地址别名/远程分支名]
git pull <远程主机名> <远程分支名>:<本地分支名>
注:pull=fetch+merge
解决冲突要点:如果不是基于github远程库的最新版所做的修改,不能推送,必须先拉取。拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
6.哈希概念
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
- 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
- 哈希算法确定,输入数据确定,输出数据能够保证不变
支名>:<本地分支名>
<u>注:pull=fetch+merge</u>
<u>解决冲突要点:如果不是基于github远程库的最新版所做的修改,不能推送,必须先拉取。拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。</u>
## 6.哈希概念
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
1. 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
2. 哈希算法确定,输入数据确定,输出数据能够保证不变
3. 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大