10. git rebase 变基

   日期:2024-12-27    作者:mdea 移动:http://mip.riyuangf.com/mobile/quote/63292.html
  • 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

  • 查看版本库状态

未添加进暂存区的文件是红色的

哪些文件是红色

  1. 新增加的文件
  2. 修改的文件(修改已经被Git管理的文件
  3. 删除文件(删除已经被Git管理的文件
  4. 重命名文件(重命名已经被Git管理的文件)

执行 可以将 **红色**状态的文件变更为 绿色

哪些文件是绿色的

  1. 添加到暂存区的文件,但是没有提交到版本库的

执行 ,可以将文件添加进本地版本库

3.3 git add

  • 将文件添加进暂存区
  1. 将单个文件添加进暂存区

  1. 将所有未添加到暂存区的文件添加到暂存区
  • ⚠️ [常用]

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. 添加配置方式1
 
  1. 添加配置方式2

如果已经存在配置了,这个命令会追加一条,使用此命令的时候注意要确保配置文件中不存在重名的键

 
  1. 查看配置
 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhysshbo-1602490883298)(https://ae02.alicdn.com/kf/H69b01a6dadc94d11b8de06e095d169e7T.png)]

  1. 删除配置
 
  1. 修改配置
 

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

  • 比较文件的差异
  1. 比较工作区和暂存区的差异
 
 
  1. 比较工作区和版本库的差异
 
 
  1. 比较暂存区和版本库的差异
 

3.13 撤销暂存区修改

或者

注意 是2.23版本之后出现的命令

帮助理解

在执行删除命令之后,可以使用查看 状态,文件的颜色由原来的**绿色** 变成 红色

3.14 撤销工作区更改

或者

使用cd进入目录,用法基本与windows相同

特殊目录

目录描述~表示用户的主目录(在windows中: c:/users/用户目录/)https://blog.csdn.net/qq_42059717/article/details/当前目录…/上一级目录cd -返回上一次所在目录

创建目录,在windows中同样适用

创建一个文件 ,在linux中所有的东西都是以文件存在的,包括计算机使用的设备等,都是以文件形式存在的

输出内容 与 中同样有这个方法.如在中拥命令行输出

 
 

有两种模式

  1. :使用这种模式会将以前次存在的内容替换为信书写的内容
  2. : 追加模式,在原有内容的下一行追加一行

详见第七章 Linux

查看当前所在的目录

  1. :列出目录下所有的内容包含隐藏内容
  2. :详细列表

: 删除

: 循环删除 , : 不询问是否删除

在linux操作系统中,慎重使用

执行此条命令会从根目录下删除所有文件,传说中的删库跑路

执行此条命令,三思!三思!三思!想好后果在执行

重命名文件 将oldName的文件重命名成newName

5.1 将本地仓库推送到github的远程仓库

  1. 经本地仓库与远程仓库进行关联

: 远程仓库的地址

: 远程仓库的别名

  1. 将本地仓库内容推送到远程仓库

将本地仓库的master分支推送到远程仓库的origin下的master分支

5.2 配置SSH无密码登录

  1. 在本地创建ssh公钥和秘钥

: 复制秘钥内容

  1. 将公钥上传到github即可
  1. 创建目录
 
  1. 初始化仓库
 
  1. 在student目录下创建Student.java文件
 
  1. 执行提交文件
 

第一次提交会提示

tell who are you ?

根据局提示创建自己的名字和邮箱,最好是跟github一样的邮箱,gitlab 以及Gitee使用一样的姓名和邮箱,这样的话只需要生成一份公钥即可。

  1. 解决上述问题
 
 
  1. 创建index.html
 
 
  1. 将 index.html 添加到暂存区
 
  1. 将index.html提交到本地版本库
 

7.1 开发学生列表功能

  1. 标记文件开发学生列表功能

直接打开文件手动修改

  1. 将文件提交
 

7.3 开发聊天功能

重复 7.1 章节 1、2步骤

  1. 此时客户想下线聊天功能

回退到版本“学生列表功能”

使用 查看提交的简略历史信息

  1. 回退版本
 
  1. 此时客户想要再次上线聊天功能
 

7.4 git 分支

几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着可以把我们的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程(常常需要完全创建一个源代码目录的副本,对于大项目来说,这个过程会耗费很多时间)。

Git 处理分支的方式可谓是难以置信的轻量,创建新分支几乎可以在瞬间完成,并且在不同分支之间的切换操作也是十分便捷。 与其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次

7.4.1 案例:开发
  1. 要完成任务:在添加、列表、聊天功能基础上开发新的****

    1、创建开发举手功能

    2、在开发了80%之后,发现线上代码有bug

    3、这时,需要切换到master分支

    4、创建进行bug修复

    5、bug修复完成,测试通过后,切回master分支,把开发的代码合并到master分支

    6、删除

    7、切回dev分支继续开发举手功能剩余的50%

    8、举手功能开发完成之后,切回master分支,把dev分支合并到master分支

    9、如果有冲突,解决冲突之后,再次提交代码即可

  2. 实现步骤

 

vim 是linux系统中的一个编辑器

在英文状态下按 可以进入编辑模式

删除一整行

退出编辑模式

保存并退出

详细命令请参考第七章 Linux

命令总结

命令含义创建本地分支dev查看本地分支,当前使用的前边会加切换本地分支切换上一个使用的分支创建并切换到本地分支dev合并分支,不能在被合并的分支上使用该命令删除分支dev

8.1创建一个带有README.md和.gitignore文件的仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5S9USl9O-1602490883321)(https://ae03.alicdn.com/kf/Hbece72c20d1546d984b3631d3dcc9457i.png)]

8.2将本地仓库推送到远程仓库

  1. 首先点击远程仓库的 colne or download,复制下来里边的连接
 
  1. 推送master分支到远程版本库
 
  1. 将远程版本库的文件拉取到本地版本库
 
  1. 合并远程分支
 
  1. 合并完成推送到远程仓库
 
 
  1. 首先将dev分支推送到远程版本库
 
  1. 创建一个目录 company,将远程版本库克隆到本地
 

9.1 模拟在公司开发

  1. 切换到dev分支,开发签到功能
 

9.2 模拟在家再发

  1. 切换会家里的dev分支,更新远程版本库
 

这个命令是由两个命令合成的

将远程仓库的dev分支拉取到本地版本库

本地dev分支合并远程dev分支

使用更加安全,使用fetch命令可以自己决定是执行merge操作还是rebase操作。使用pull的话只能merge了

  1. 在dev分支上开发答题卡操作,提交到本地版本库,并推送到远程版本库
 
 

1. 测试修改commit msg

  1. 实现内容

    ​ 分三次开发签退功能,三次开发都在本地提交之后,修改第二次提交的commit msg

  2. 步骤

    1、创建SignOut.java文件,直接提交到本地版本库

     

    2、向SignOut.java文件第一次添加代码,直接提交到本地版本库

     

    3、向SignOut.java文件第二次添加代码,直接提交到本地版本库

    4、使用git rebase修改第二次提交的msg

    ​ 在文件中把pick修改成****

2合并前三次签到功能的commit

  1. 进入修改模式
    将后面的两个pick修改为****,保存退出即可

3 在两个本地分支变基

​ 可以使分支树呈现简洁、线性的commit记录

  1. 实现内容

    ​ 切换到master分支,开发,此时master和dev分支属于并行开发,如果直接使用merge进行代码合并,那么提交记录就会出现分叉,但是我们不想让提交记录出现分叉,所以使用git rebase进行变基

  2. 实现步骤

    1、切回master分支,开发,提交到本地版本库

    2、切回dev分支,进行分支变基,变基之后,dev分支就能把master的内容合并过来

    3、切回master分支,使用git merge dev合并一下dev的代码

4 远程分支变基 - 测试有冲突情况

  1. 实现内容

    在家里修改,开发一部分之后提交本地仓库,推送到远程仓库

    在公司里,在没有拉取最新代码的情况下,也修改了,修改完成之后,提交到本地仓库,推送到远程仓库,此时肯定会被远程仓库拒绝

    此时,先要拉取(fetch)远程分支代码到本地,再进行rebase

  2. 实现步骤

    1、在家里修改,开发一部分之后提交本地仓库,推送到远程仓库

     
 

3、在公司先拉取(fetch)远程分支到本地,再进行rebase

此时,如果有冲突,可以手动解决冲突

解决冲突之后,使用标记解决冲突

然后使用完成本次rebase操作

最后推送到远程仓库

  • 工作区 - 能够看见的目录
  • 暂存区 - 也叫index、stage 通常存放在 .git/index 文件下
  • 版本库 - 分为 和

1. 文件三大区域的穿梭

HEAD是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。 通常,理解HEAD的最简方式,就是将它看做该分支上的最后一次提交的快照。

  1. 怎么快速回退HEAD的上一个版本

     
  2. 怎么快速回退两个版本

     
  3. 注意

    ^和~只能回退版本

    ^:仅能回退一步

    :可以在后添加数字,表示回退几步

冲突引发的原因

多个用户在相同的版本上对同一文件进行了修改(添加、修改、删除)等操作

  1. 对同一文件的不同行进行了修改

Git 会自动的和并多个用户对不同行的修改

  1. 对同一文件的相同行进行了修改
 
  1. 对同一文件的相同行和不同行都进行了修改

对于不同行,Git会自动的合并

对于相同行,采用第二种方式即可

Git的工作流一般分为四种

  1. 查询当前分支提交人和提交次数
 
  1. 使用gitk可视化查看提交记录

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号