- Git下载地址
- 官方书籍Pro git
- Git开发故事
- 练习git的
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git是一个免费开源的分布式版本控制系统,可用于高校的处理任何大大小小的项目。
2.1 本地版本控制
许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。
其中最流行的一种叫做 RCS,现今许多计算机系统上都还看得到它的踪影。 RCS 的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
2.2 集中式版本控制
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。 这类系统,诸如 CVS、Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 多年以来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
这么做最明显的缺点是中央服务器的单点故障, 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RdfH7xAG-1602490883289)(https://ae04.alicdn.com/kf/H5d70d2437db94d858e0a0a804788b82dM.png)]
2.3分布式版本控制
于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
3.1 git init
- 让 git 能够管理本地目录,创建一个本地版本库
执行完 之后,本地目录下回创建一个 的隐藏目录,这个目录就相当于本地版本库,默认会自动创建 分支
使用演示,创建一个员工管理系统
3.2 git status
- 查看版本库状态
未添加进暂存区的文件是红色的
哪些文件是红色
- 新增加的文件
- 修改的文件(修改已经被Git管理的文件)
- 删除文件(删除已经被Git管理的文件)
- 重命名文件(重命名已经被Git管理的文件)
执行 可以将 **红色**状态的文件变更为 绿色
哪些文件是绿色的
- 添加到暂存区的文件,但是没有提交到版本库的
执行 ,可以将文件添加进本地版本库
3.3 git add
- 将文件添加进暂存区
- 将单个文件添加进暂存区
- 将所有未添加到暂存区的文件添加到暂存区
- ⚠️ [常用]
3.4 git commit
- 将暂存区的文件提交到本地版本库
如果后边不指明具体文件,表示将暂存区的所有文件提交到版本库
将所有修改的版本库文件直接提交到本地版本库
3.5 git config
- 配置 git 配置文件
配置级别 命令 配置文件 优先级 本地版本库 git config --local .git/config 最高 用户级别[全局配置-所有本地版本库配置] git config --global ~/.gitconfig 其次 系统配置 git config --system 安装目录/etc/gitconfig 最低 3.5.1 常用配置命令
- 添加配置方式1
- 添加配置方式2
如果已经存在配置了,这个命令会追加一条,使用此命令的时候注意要确保配置文件中不存在重名的键
- 查看配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhysshbo-1602490883298)(https://ae02.alicdn.com/kf/H69b01a6dadc94d11b8de06e095d169e7T.png)]
- 删除配置
- 修改配置
3.6 git log
- 查看提交的历史记录
直接执行 命令可以输出commit hash值、作者、提交事件、提交信息。
提交的哈希值前七位就能唯一确定一次提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IR21Nzir-1602490883301)(https://ae03.alicdn.com/kf/Hc883f1a314c2468d99fd7d354d3c9124Y.png)]
输出从commit hash值和提交message
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R4slwran-1602490883306)(https://ae04.alicdn.com/kf/H2360fabd2f574c2196ac95755b590b1cl.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gqu8Dax9-1602490883310)(https://ae03.alicdn.com/kf/H69235e4bee604f3281d276f9c2a587144.png)]
参数 含义 %H 提交对象(commit)的完整hash值 %h 提交对象的缩略hash值(前7位-能够唯一确定一个提交对象) %s 显示提交message %an 显示作者 %ae 显示邮件地址 %cd 显示提交日期 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ftFjn8om-1602490883312)(https://ae04.alicdn.com/kf/Hbdefba15485542098440ec564dc62d4fi.png)]
graph 可以和 pretty 同时使用
3.7 git reset
- 把版本内容重置到某个commit
命令 版本库 暂存区 工作区 重置 重置 重置比较危险 重置 不重置 不重置 重置 重置 不重置 3.8 git reflog
- 查看所有分支的操作记录**包括已被删除的commit记录和reset操作**
3.9 git revert
- 撤销某个commit
- 在执行撤销之后,并没有删除这个commit,git会在版本快哭重新创建一个commit
3.10 git mv
- 修改git版本库中的文件名称
3.11 git rm
- 删除版本库中的为文件
3. 12 git diff
- 比较文件的差异
- 比较工作区和暂存区的差异
- 比较工作区和版本库的差异
- 比较暂存区和版本库的差异
3.13 撤销暂存区修改
或者
注意: 是2.23版本之后出现的命令
帮助理解
在执行删除命令之后,可以使用查看 状态,文件的颜色由原来的**绿色** 变成 红色
3.14 撤销工作区更改
或者
使用cd进入目录,用法基本与windows相同
特殊目录
目录 描述 ~ 表示用户的主目录(在windows中: c:/users/用户目录/) https://blog.csdn.net/qq_42059717/article/details/ 当前目录 …/ 上一级目录 cd - 返回上一次所在目录
创建目录,在windows中同样适用,
创建一个文件 ,在linux中所有的东西都是以文件存在的,包括计算机使用的设备等,都是以文件形式存在的
输出内容 与 中同样有这个方法.如在中拥命令行输出
有两种模式
- :使用这种模式会将以前次存在的内容替换为信书写的内容
- : 追加模式,在原有内容的下一行追加一行
详见第七章 Linux
查看当前所在的目录
- :列出目录下所有的内容,包含隐藏内容
- :详细列表
: 删除
: 循环删除 , : 不询问是否删除
在linux操作系统中,慎重使用
执行此条命令会从根目录下删除所有文件,传说中的删库跑路
执行此条命令,三思!三思!!三思!!!想好后果在执行
重命名文件 将oldName的文件重命名成newName
略
5.1 将本地仓库推送到github的远程仓库
- 经本地仓库与远程仓库进行关联
: 远程仓库的地址
: 远程仓库的别名
- 将本地仓库内容推送到远程仓库
将本地仓库的master分支推送到远程仓库的origin下的master分支
5.2 配置SSH无密码登录
- 在本地创建ssh公钥和秘钥
: 复制秘钥内容
- 将公钥上传到github即可
- 创建目录
- 初始化仓库
- 在student目录下创建Student.java文件
- 执行提交文件
第一次提交会提示
tell who are you ?
根据局提示创建自己的名字和邮箱,最好是跟github一样的邮箱,gitlab 以及Gitee使用一样的姓名和邮箱,这样的话只需要生成一份公钥即可。
- 解决上述问题
- 创建index.html
- 将 index.html 添加到暂存区
- 将index.html提交到本地版本库
7.1 开发学生列表功能
- 标记文件开发学生列表功能
直接打开文件手动修改
- 将文件提交
7.3 开发聊天功能
重复 7.1 章节 1、2步骤
- 此时客户想下线聊天功能
回退到版本“学生列表功能”
使用 查看提交的简略历史信息
- 回退版本
- 此时客户想要再次上线聊天功能
7.4 git 分支
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着可以把我们的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程(常常需要完全创建一个源代码目录的副本,对于大项目来说,这个过程会耗费很多时间)。
Git 处理分支的方式可谓是难以置信的轻量,创建新分支几乎可以在瞬间完成,并且在不同分支之间的切换操作也是十分便捷。 与其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次
7.4.1 案例:开发
要完成任务:在添加、列表、聊天功能基础上开发新的****
1、创建开发举手功能
2、在开发了80%之后,发现线上代码有bug
3、这时,需要切换到master分支
4、创建进行bug修复
5、bug修复完成,测试通过后,切回master分支,把开发的代码合并到master分支
6、删除
7、切回dev分支继续开发举手功能剩余的50%;
8、举手功能开发完成之后,切回master分支,把dev分支合并到master分支
9、如果有冲突,解决冲突之后,再次提交代码即可;
实现步骤
vim 是linux系统中的一个编辑器,
在英文状态下按 可以进入编辑模式
删除一整行
退出编辑模式
保存并退出
详细命令请参考第七章 Linux
命令总结
命令 含义 创建本地分支dev 查看本地分支,当前使用的前边会加 切换本地分支 切换上一个使用的分支 创建并切换到本地分支dev 合并分支,不能在被合并的分支上使用该命令 删除分支dev 8.1创建一个带有README.md和.gitignore文件的仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5S9USl9O-1602490883321)(https://ae03.alicdn.com/kf/Hbece72c20d1546d984b3631d3dcc9457i.png)]
8.2将本地仓库推送到远程仓库
- 首先点击远程仓库的 colne or download,复制下来里边的连接
- 推送master分支到远程版本库
- 将远程版本库的文件拉取到本地版本库
- 合并远程分支
- 合并完成推送到远程仓库
- 首先将dev分支推送到远程版本库
- 创建一个目录 company,将远程版本库克隆到本地
9.1 模拟在公司开发
- 切换到dev分支,开发签到功能
9.2 模拟在家再发
- 切换会家里的dev分支,更新远程版本库
这个命令是由两个命令合成的
将远程仓库的dev分支拉取到本地版本库
本地dev分支合并远程dev分支
使用更加安全,使用fetch命令可以自己决定是执行merge操作还是rebase操作。使用pull的话只能merge了
- 在dev分支上开发答题卡操作,提交到本地版本库,并推送到远程版本库
1. 测试修改commit msg
实现内容
分三次开发签退功能,三次开发都在本地提交之后,修改第二次提交的commit msg;
步骤
1、创建SignOut.java文件,直接提交到本地版本库
2、向SignOut.java文件第一次添加代码,直接提交到本地版本库
3、向SignOut.java文件第二次添加代码,直接提交到本地版本库
4、使用git rebase修改第二次提交的msg
在文件中把pick修改成****
2合并前三次签到功能的commit
- 进入修改模式
将后面的两个pick修改为****,保存退出即可;3 在两个本地分支变基
可以使分支树呈现简洁、线性的commit记录;
实现内容
切换到master分支,开发,此时master和dev分支属于并行开发,如果直接使用merge进行代码合并,那么提交记录就会出现分叉,但是我们不想让提交记录出现分叉,所以使用git rebase进行变基;
实现步骤
1、切回master分支,开发,提交到本地版本库
2、切回dev分支,进行分支变基,变基之后,dev分支就能把master的内容合并过来
3、切回master分支,使用git merge dev合并一下dev的代码
4 远程分支变基 - 测试有冲突情况
实现内容
在家里修改,开发一部分之后提交本地仓库,推送到远程仓库;
在公司里,在没有拉取最新代码的情况下,也修改了,修改完成之后,提交到本地仓库,推送到远程仓库,此时肯定会被远程仓库拒绝;
此时,先要拉取(fetch)远程分支代码到本地,再进行rebase
实现步骤
1、在家里修改,开发一部分之后提交本地仓库,推送到远程仓库
3、在公司先拉取(fetch)远程分支到本地,再进行rebase
此时,如果有冲突,可以手动解决冲突
解决冲突之后,使用标记解决冲突
然后使用完成本次rebase操作
最后推送到远程仓库
- 工作区 - 能够看见的目录
- 暂存区 - 也叫index、stage 通常存放在 .git/index 文件下
- 版本库 - 分为 和
1. 文件三大区域的穿梭
HEAD是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。 通常,理解HEAD的最简方式,就是将它看做该分支上的最后一次提交的快照。
怎么快速回退HEAD的上一个版本?
怎么快速回退两个版本
注意
^和~只能回退版本;
^:仅能回退一步
:可以在后添加数字,表示回退几步
冲突引发的原因
多个用户在相同的版本上对同一文件进行了修改(添加、修改、删除)等操作
- 对同一文件的不同行进行了修改
Git 会自动的和并多个用户对不同行的修改
- 对同一文件的相同行进行了修改
- 对同一文件的相同行和不同行都进行了修改
对于不同行,Git会自动的合并
对于相同行,采用第二种方式即可
Git的工作流一般分为四种
- 查询当前分支提交人和提交次数
- 使用gitk可视化查看提交记录