git原理与使用
目录
- 引入
- 基本操作
- 分支管理
- 远程操作
- 标签管理
引入
假设你的老板要你设计一个文档,当你设计好了,拿给他看时,他并不是很满意,就要你拿回去修改,你修改完后,再给他看时,他还是不满意,经过多次修改,他觉得还是你之前的第三次修改后的文档好,最终决定采用第三次修改后的文档,但因为前面你都是在一个文档上修改的,意味着前面修改的文档内容都被覆盖了,也就无法完成老板的任务
同上,吸取了之前的教训后,你明白了要保存前面的副本,因为老板可能会采纳之前的文档,所以每一次修改,你都存一份副本,这样,就能在最终选用文档时,拿出成果。
同上,上面的想法听起来确实很合理,一般情况下,也能解决问题,但是,在软件开发中,随着版本的不断增多,维护好版本是很有挑战的,那就需要我们知道每个版本各自修改的内容,才能更好地维护,而上面的生成副本的方式无法知晓当前版本在上一个版本的基础上修改了哪些内容(内容很多的情形),这种方式也就不适用了!此时,git应运而生!!!
git,是一个版本控制器,它是记录每次的修改以及版本迭代的一个管理系统,比如在文本文件的某一行前面添加了一行内容,也能清楚的找出这种修改。
基本操作
创建本地仓库
仓库本质上就是进行版本控制的一个文件目录,用git init命令创建,下图中的.git是用来跟踪管理仓库的

配置git
用下面两个两个命令可以配置用户名和邮箱地址,这点很重要!!!其中的global表示全局,即带了这个选项,在所有仓库中都会使用你配置的这个用户名和邮箱地址,不带,则只在当前仓库有效
注意:命令必须在仓库内执行!!!
git config [–global] user.name “Your Name”
git config [–global] user.email “email@example.com”
查看配置
用git config -l命令查看配置信息
删除配置信息
git config [–global] --unset user.name
git config [–global] --unset user.email

认识工作区、暂存区、版本库
git关注的是修改,即增加、更新、修改,而修改的工作区内容会写入对象库的一个新的git对象中,文件要被git跟踪管理,就必须得进行add和commit操作,完成这两步后,文件才会被添加到仓库管理

add操作
git add 文件(文件名)/目录(目录名)/所有文件(.)
commit操作
git commit -m 日志信息,即提交暂存区的所有文件
commit后,可以用git log来查看提交的日志信息
如下图,是提交工作区的内容到版本库的示例流程,如果没有配置用户名和邮箱信息,就无法commit,会提示要你配置,配置完成后,再commit就可以了,而日志中的黄色的那一长串字符串,则是commit id

如果想看简单一些的日志,可以带–pretty=oneline选项

如下图,index就是暂存区,add后的内容都是添加到这里的

HEAD是默认指向master分支的指针

master保存的是当前最新的commit id

objects,保存了git维护的所有修改
如下图,查看object时,它由两部分构成,前两位是文件夹名称,后面的38位则是文件名称


用git cat-file -p commit id查看版本库对象的内容

修改文件
如下图,用git status查看工作区中状态,显示还没有添加和提交

三天前修改的文件,到今天,我们可能就已经不记得修改了哪些内容,此时就可以用到git diff来查看修改了哪些内容。a 和 b表示从之前的a文件,修改后变成了b文件,相当于同一个文件的不同版本,-1表示改动前第一行,+1,2表示改动后第一行起连续两行的内容

版本回退
如果你发现之前做的工作,出现了一些问题,需要解决,就得回到某一个历史版本,这时,就能用到git reset [–soft || --mixed || --hard] [HEAD]
HEAD,表示当前版本
HEAD^,表示上一个版本
HEAD^^,表示上上一个版本
也能直接使用commit id,表示回退到指定版本
mixed,表示回退到某个历史版本的暂存区,版本库也变了,但工作区不变,且这是个默认选项,即不指定时,就是mixed
soft,表示回退到某个历史版本的版本库,工作区和暂存区不变
hard,表示回退到某个历史版本的工作区,暂存区和版本库都变,慎重使用这个选项,因为是回退工作区,可能内容就找不回来了
以hard为例,进行讲解
如下图,从version3回退到version2了,工作区文件的内容也回退了

假如我突然后悔了,想回到version3版本,但发现根本做不到,因为我们没有version3的commit id,此时,只能借助git reflog命令来尝试补救了
如下图,我们借助git reflog命令找到了version3的部分commit id,但也能代表目标版本!!!

从下图,可以看出,版本回退非常的迅速,只需要修改指针即可!

撤销修改
当我们觉得当前写的代码太糟糕了,想恢复到上一个版本,这时就需要用到类似于word等工具的撤销功能,分为三种情形
没有add,可以直接用git checkout – 文件名进行撤销

已经add,但没有commit,可以使用git reset HEAD 文件名,将add的回退到工作区,然后再用如上的方式撤销

已经add,已经commit,则能采用git reset --hard HEAD^,前提是你没有push到远程仓库
删除文件
用git rm命令,可以删除工作区和暂存区中的内容,然后再commit提交即可

分支管理
假设你能创建自己的分身,那你就可以让自己的分身去做与自己不同的事情,比如它去学习Java,而你学习C++,在某个时间点,你们俩合并,此时,你就能既学会了Java,也学会了C++,极大地提高了你的学习效率。分支便是如此,便于团队协作,提高工作效率!!!
创建分支
用git branch来查看分支,git branch 分支名来创建分支,* 在哪儿表示HEAD指针当前指向哪一个分支,最后的cat,证明两个分支指向同一个提交


如下图,也可以用git checkout -b 分支名命令来创建并切换分支

切换分支
用git checkout 分支名来切换分支

如下图,在dev分支上创建了ReadMe文件,并写入hello world,但在master分支上却看不到,这是因为创建新分支后,master分支和dev分支是相互独立的,就如同,你并不知道你的分身干了什么事情!要想知道,就必须得将dev合并到master上


合并分支
用git merge 要合并到当前分支的分支名,fast-forward代表快进模式,也就是直接把master指向dev的当前提交


删除dev分支
当合并完成后,dev分支也就没用了,如下图,用git branch -d 分支名来删除分支,注意,不能在当前分支下删除当前分支!!!

如果dev分支没有被合并
可以用git branch -D 命令来删除dev分支

合并冲突
分支在合并时,是有可能发生冲突的,如下图所示,dev分支,将11111写入ReadMe文件,并添加提交,master分支,将2222写入ReadMe文件,并添加提交,将dev分支合并到master分支时,就发生了冲突,因为git无法确定要保存哪一个,就如同C++中的菱形继承中的二义性问题

要想解决合并冲突问题,就需要我们手动修改冲突的内容,选择其中一个,然后再添加提交即可!


用git log --graph --pretty=oneline --abbrev-commit命令可以查看合并情况

分支管理策略
fast-forward模式合并,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提交到底是merge进来的还是正常提交的,但在合并冲突部分,解决合并冲突,就能知道是merge进来的还是正常提交的!
要想不以fast-forward模式合并,可以采用 git merge --no-ff -m “日志信息” 分支名,来合并

当我在dev分支上开发时,突然发现master分支上有个bug需要解决,而我才开发到一半,没办法提交,这时,就需要保存工作区现场,可以用git stash命令,来讲工作区信息隐藏,用git stash list可以查看刚才的隐藏信息保存在哪个分支上,用git stash pop命令来恢复现场信息,并将stash删除

建议:当我们建立分支去写代码要合并时,可以先将master分支合并到当前分支,如果发生合并冲突,就可以在当前分支解决,从而不会影响master
远程操作
远程仓库
如下图,是在gitee上新建远程仓库的步骤,Readme文件是一些说明,可以自己去填写,便于别人使用,比如软件的安装步骤等等,而Issue则可以用来提bug等等,Pull Request在远程合并分支时使用, 比如你在dev分支开发完,需要合并到master分支,就需要填写Pull Request申请单

而要想本地与远程建立联系,就必须先将仓库拷贝到本地,即使用git clone 下面的url

在本地查看远程仓库,可以用git remote命令,想查看详细信息,可以带-v选项,远程仓库的默认名称是origin,下面显示了拉取和推送的地址,表明可以向远程仓库推送信息,也能获取远程仓库的信息

向远程仓库推送,可以用git push <远程主机名> <本地分⽀名>:<远程分⽀名>来推送,如果本地分支名和远程分支名相同,则可以省略冒号及它后面的,如下图,我删除了本地仓库的文件,同时也想把远程的也给删掉,就用到了push操作


拉取远程仓库
拉取远程仓库内容和推送一样,只不过要把push改为pull,如下图,先在远程仓库创建了一个file.txt文件,并写入hello world,在本地pull后,就能把远程仓库的内容拉取到本地仓库中



配置Git
在上面创建仓库时,有一个添加ignore文件,可以勾选,就会在远程仓库生成该文件,该文件用于添加提交文件时,可以忽略指定的部分文件,比如写入了账号密码信息的文件,我不想推送,让别人看到,我就不提交,但文件太多了,add 指定文件太麻烦,就只能add . ,所以就有了ignore文件的产生,直接在该文件中写入你想忽略的文件即可,如下图所示。



如果是使用的*.txt,来忽略所有txt后缀文件,而又要某个.txt文件不被忽略,就能在该文件前面加个!xxx.txt,表示不忽略。git add -f可以强制添加文件,但不建议使用
给命令配置别名
如下图,这条命令太长了,写起来太麻烦,就可以对其起别名

如下图,用git config --global alias.别名 ‘命令’

标签管理
因为commit id太长了,很难记住,所以我们可以用标签来作为commit的别名,这样也方便后续使用
可以用git tag 标签名来创建一个标签,git tag查看标签

如下图,可以看出,默认打的标签是打在最新的一次commit上的

如下图,给指定commit打标签,用git tag 标签名 commit id

如下图,用git show 标签名查看标签信息

如下图,可以带-a选项,对标签进行说明


如下图,可以用-d选项,来删除标签。

如下图,要推送至远程,可以用git push origin 标签名


如下图,删除标签,先在本地删除,再推送至远程仓库


相关文章:
git原理与使用
目录 引入基本操作分支管理远程操作标签管理 引入 假设你的老板要你设计一个文档,当你设计好了,拿给他看时,他并不是很满意,就要你拿回去修改,你修改完后,再给他看时,他还是不满意,…...
【C语言题解】将一句话的单词进行倒置,标点不倒置。
题目描述:将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。 文章目录 原题目题目描述:输入描述:输出描述:题目链接: 整体思路分…...
Postman 的简单使用
什么是Postman 在程序开发中用于调试网络程序或者跟踪网页请求。可以对网页进行简单的基本信息调试。Postman最早是作用chrome浏览器插件存在的,但是2018年初Chrome停止对Chrome应用程序的支持。所以现在Postman提供了独立的安装包,不再依赖于Chrome浏览…...
在CentOS7安装部署GitLab服务
CentOS 7 安装 Gitlab 官方安装教程:https://about.gitlab.com/install/ 参考安装教程:https://developer.aliyun.com/article/74395 安装配置 Step1:配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo存入以下内容: [gitlab-c…...
订单系统就该这么设计,稳的一批~
订单功能作为电商系统的核心功能,由于它同时涉及到前台商城和后台管理系统,它的设计可谓是非常重要的。就算不是电商系统中,只要是涉及到需要交易的项目,订单功能都具有很好的参考价值,说它是通用业务功能也不为过。今…...
Agents改变游戏规则,亚马逊云科技生成式AI让基础模型加速工作流
最近,Stability AI正式发布了下一代文生图模型——Stable Diffusion XL 1.0这次的1.0版本是Stability AI的旗舰版生图模型,也是最先进的开源生图模型。 在目前的开放式图像模型中,SDXL 1.0是参数数量最多的。官方表示,这次采用的…...
详细教程:如何搭建废品回收小程序
废品回收是一项环保举措,通过回收和再利用废弃物品,可以减少资源浪费和环境污染。近年来,随着智能手机的普及,小程序成为了推广和运营的重要工具。本文将详细介绍如何搭建一个废品回收小程序。 1. 进入乔拓云网后台 首先…...
什么是双亲委派机制?
什么是双亲委派机制? Parent Delegation Model ,直译过来可能叫做父级委托模型更容易理解 类的加载过程 Java 编译器将 Java源文件编译成.class 文件再由 JVM 加载 .class 文件到内存中JVM 装载完成后得到一个 Class 字节码对象拿到字节码对象之后 &a…...
Mageia 9 RC1 正式发布,Mandriva Linux 发行版的社区分支
导读Mageia 9 首个 RC 已发布。公告写道,自 2023 年 5 月发布 beta 2 以来,Mageia 团队一直致力于解决许多顽固问题并提供安全修复和新特性。 新版本的控制中心添加了用于删除旧内核的新功能,该功能在 Mageia 9 中默认自动启用,用…...
ChatGPT: 人机交互的未来
ChatGPT: 人机交互的未来 ChatGPT背景ChatGPT的特点ChatGPT的应用场景结论 ChatGPT ChatGPT是一种基于大数据和机器学习的人工智能聊天机器人模型。它由国内团队发明、开发,并被命名为Mental AI。ChatGPT的目标是通过模拟自然对话的方式,提供高效、智能…...
Linux 常用操作命令
Linux简介及Ubuntu安装 Linux,免费开源,多用户多任务系统。基于Linux有多个版本的衍生。RedHat、Ubuntu、Debian 安装VMware或VirtualBox虚拟机。具体安装步骤,找百度。 再安装Ubuntu。具体安装步骤,找百度。 常用指令 ls …...
24届近5年重庆邮电大学自动化考研院校分析
今天给大家带来的是重庆邮电大学控制考研分析 满满干货~还不快快点赞收藏 一、重庆邮电大学 学校简介 重庆邮电大学简称"重邮",坐落于直辖市-重庆市,入选国家"中西部高校基础能力建设工程”、国家“卓越工程师教育培养计划…...
如何对oracle和mysql进行 分区分表
前提:使用自带的分区和分表机制进行操作 oracle,mysql分区分表 分区 分区是一种将一个大的表或索引分割成多个小的部分的技术,每个部分称为一个分区。分区可以提高数据的管理和查询效率,因为可以根据不同的条件对不同的分区进行操作&#x…...
Windows下安装Sqoop
Windows下安装Sqoop 一、Sqoop简介二、Sqoop安装2.1、Sqoop官网下载2.2、Sqoop网盘下载2.3、Sqoop安装(以version:1.4.7为例)2.3.1、解压安装包到 D:\bigdata\sqoop\1.4.7 目录2.3.2、新增环境变量 SQOOP_HOME2.3.3、环境变量 Path 添加 %SQO…...
Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题
我们在使用浏览器访问各个网站时,经常会保存密码。在下一次访问时,直接使用保存的密码填充,简单方便。 但是突然有一天(怀疑是谷歌浏览器更新导致的),每次使用密码填充时,都有如下拦截 拦截提…...
Java技术整理(3)—— 多线程并发篇
1、Java 线程实现/创建方式 (1)继承Thread类 Thread类本质上是实现了Runnable接口的实例,代表一个线程的实例,通过start()启动,自动执行run()方法。 (2)实现Runnable接口 Runnable是一个没有…...
2023热门跨境电商平台哪个入驻条件适合新手?
一、 Shopee 1.平台简介:东南亚最大跨境电商平台,覆盖新加坡、马来西亚、菲律宾、泰国、越南、巴西等十余个市场。 2.平台优势:流量大、物流快、东南亚市场前景好 3.入驻要求:企业或个体营业执照其他电商平台经验 4.平台费用&…...
【MFC】05.MFC第一大机制:程序启动机制-笔记
MFC程序开发所谓是非常简单,但是对于我们逆向人员来说,如果想要逆向MFC程序,那么我们就必须了解它背后的机制,这样我们才能够清晰地逆向出MFC程序,今天这篇文章就来带领大家了解MFC的第一大机制:程序启动机…...
小程序动画 animation 的常规使用
公司小程序项目比较多,最近正好有时间看一下小程序的动画,同时记录一下我的学习过程;看到这个文章的,我建议你之间去小程序后台:https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/wx.createAnimati…...
Swift 周报 第三十四期
文章目录 前言新闻和社区iPhone Pro 要提价!新款 iPhone 或会使用 USB-C 充电器,边框更薄与 App Store 专家会面交流让你的 App 和游戏在 visionOS 模拟器外更进一步 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swif…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
vue3 手动封装城市三级联动
要做的功能 示意图是这样的,因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...
Qt 按钮类控件(Push Button 与 Radio Button)(1)
文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button(鼠标点击不放连续移动快捷键) Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...
