git原理与常用命令及其使用

认识工作区、暂存区、版本库

⼯作区:是在电脑上你要写代码或⽂件的⽬录。
暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们
把暂存区有时也叫作索引(index)。
版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽
是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git
都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

图中左侧为⼯作区,右侧为版本库。Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。
在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指
针叫 HEAD。
当对⼯作区修改(或新增)的⽂件执⾏ git add 命令时,暂存区⽬录树的⽂件索引会被更新。
当执⾏提交操作 git commit 时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录
树才会被真正写到版本库中。
必须要通过使用 git add 和 git commit 命令才能将⽂件添加到仓库中 进行管理!
1. index 就是我们的暂存区,add 后的内容都是添加到这⾥的。
2. HEAD 就是我们的默认指向 master 分⽀的指针
3. objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏ git add 命令
时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的
对象中,就位于 ".git/objects" ⽬录下,让我们来看看这些对象有何⽤处:
查找 object 时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。
找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过 (安全哈希算法)加密过的
⽂件,好在我们可以使⽤ git cat-file 命令来查看版本库对象的内容。
总结⼀下,在本地的 git 仓库中,有⼏个⽂件或者⽬录很特殊
  • index: 暂存区, git add 后会更新该内容。
  • HEAD: 默认指向 master 分⽀的⼀个指针。
  • refs/heads/master: ⽂件⾥保存当前 master 分⽀的最新 commit id 。
  • objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。

修改文件

Git 比其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,而非文件。
git diff [file] 命令用来显示暂存区和⼯作区⽂件的差异,显示的格式正是Unix通⽤的diff格
式。也可以使⽤ git diff HEAD -- [file] 命令来查看版本库和⼯作区⽂件的区别。
知道了对 ReadMe 做了什么修改后,再把它提交到本地仓库就放心了。

版本回退

git reset 命令语法格式为: git reset [--soft | --mixed | --hard]  [HEAD]
--mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
--soft参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
--hard参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
HEAD 说明:
可直接写成 commit id,表示指定退回的版本
HEAD 表示当前版本
HEAD^ 上⼀个版本   或HEAD^1 
HEAD^^ 上上⼀个版本     或HEAD^2
以此类推
version3 被用 git reset --hard 变成 version2 

git log 并不能打印出 version 3 的 commit id ,运⽓好的话我们可以从终端
上去找找之前的记录,运⽓不好的话 commit id 已经被我们搞丢了
Git 还提供了⼀个 git reflog

Git 版本回退的时候,也可以使⽤部分 commit id 来代表⽬标版本
Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分支(此处是master)的
HEAD 指针, refs/heads/master 文件里保存当前 master 分⽀的最新 commit id 。当我们
在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解
成如下示意图

撤销修改

如果我们在我们的⼯作区写了很⻓时间代码,需求变更之类的情况

情况⼀:对于⼯作区的代码,还没有 add

可以使用  git checkout -- [file] 命令让⼯作区的
⽂件回到最近⼀次 add 或 commit 时的状态。 要注意 git checkout -- [file] 命令中的
-- 很重要,切记不要省略,⼀旦省略,该命令就变为其他意思了。

情况⼆:已经 add ,但没有 commit

add 后还是保存到了暂存区呢?怎么撤销呢?
git reset 回退命令,该命令如果使⽤ --mixed 参数,可以将暂存区
的内容退回为指定的版本内容,但⼯作区⽂件保持不变。那我们就可以只回退下暂存区的内容了

 git status 查看⼀下,发现现在暂存区是干净的,工作区有修改。

这时候就回到情况一了。

情况三:已经 add ,并且也 commit 了

不要担⼼,我们可以 git reset --hard HEAD^ 回退到上⼀个版本!不过,这是有条件的,就是
你还没有把⾃⼰的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后⾯会讲到远程
版本库,⼀旦你推送到远程版本库,你就真的惨了……

删除文件

工作区和版本库就不⼀致了,要删⽂件,目前除了要删⼯作区的⽂件,还要清除版本库的文件

确实要从版本库中删除该⽂件
不小心删错了

分支管理

每次提交,Git都把代码串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。
再来理解⼀下HEAD,HEAD 严格来说不是指向提交,⽽是指向master,master才是指向提交的,所 以,HEAD 指向的就是当前分支。每次提交,master分⽀都会向前移动⼀步,这样,随着你不断提交,master分⽀的线也越来越长,而HEAD只要⼀直指向master分支即可指向当前分支

创建分支

Git ⽀持我们查看或创建其他分⽀,在这⾥我们来创建第⼀个⾃⼰的分⽀ dev ,对应的命令为
git branch dev
当我们创建新的分⽀后,Git 新建了⼀个指针叫 dev, * 表示当前 HEAD 指向的分⽀是 master 分
⽀。另外,可以通过⽬录结构发现,新的 dev 分⽀
发现⽬前 dev 和 master 指向同⼀个修改。并且也可以验证下 HEAD ⽬前是指向 master 的。
cat .git/HEAD

切换分支

git checkout dev

切换到分支dev提交代码后,当再切换到 master 分⽀之时,HEAD 就指向了 master,当然看不到提交了

合并分支

git merge 

为了在 master 主分⽀上能看到新的提交,就需要合并分支
git merge dev # 合并 dev 分⽀
Updating 16623e1..3740dce
Fast-forward
ReadMe | 1 +
1 file changed, 1 insertion(+)
git merge 命令⽤于合并指定分⽀到当前分⽀。合并后,master 就能看到 dev 分⽀提交的内容
了。此时的状态如图如下所⽰。
git merge 命令⽤于合并指定分⽀到当前分⽀。合并后,master 就能看到 dev 分⽀提交的内容
了。此时的状态如图如下所显示。
Fast-forward 代表“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度⾮常快。
当然,也不是每次合并都能 Fast-forward,我们后⾯会讲其他方式的合并。
这种情况下,Git 只能试图把各⾃的修改合并起来,但这种合并就可能会有冲突

发现 ⽂件有冲突后,可以 cat ReadMe 直接查看⽂件内容,要说的是 Git 会⽤ <<<<<<<,=======,
>>>>>>> 来标记出不同分⽀的冲突内容
⼿动调整冲突代码,并需要再次提交修正后的结果
结果如下
记 dev1 分⽀使⽤完毕后就可以删除了

git log可以看分支状态

这样的好处是,从分⽀历史上就可以看出分⽀信息。例如我们现在已经删除了在合并冲突部分创建的 dev1 分⽀,但依旧能看到 master 其实是由其他分⽀合并
--no-ff 参数,表⽰禁⽤ Fast forward 模式。禁⽤ Fast forward 模式后合并会创建
⼀个新的 commit ,所以加上 -m 参数,把描述写进去。
git merge --no-ff -m "merge with no-ff" dev2
所以在合并分⽀时,加上 --no-ff 参数就可以⽤普通模式合并,合并后的历史有分⽀,能看出来曾
经做过合并,⽽ fast forward 合并就看不出来曾经做过合并。

删除分支

git branch -d dev

合并完成后, dev 分⽀对于我们来说就没用了, 那么dev分⽀就可以被删除掉,注意 如果当前正处于某分支下,就不能删除当前分⽀
因为创建、合并和删除分⽀非常快,所以Git⿎励你使⽤分⽀完成某个任务,合并后再删掉分⽀,这和直接在master分⽀上⼯作效果是⼀样的,但过程更安全

分支管理策略

bug 分⽀

假如我们现在正在 dev2 分⽀上进⾏开发,开发到⼀半,突然发现 master 分⽀上⾯有 bug,需要
解决。在Git中,每个 bug 都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀ 删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37456.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web-Machine-N7靶机通关攻略

获取靶机ip arp-scan -l 端口扫描 nmap xxxx 访问80端口发现没用 扫描目录 gobuster dir -u http:/192.168.117.160 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium,txt -x php,html,txt ,zip 打开exploit.html 点击F12&#xff0c;修改localhost为靶机ip&#…

2025-03-21 Unity 网络基础3——TCP网络通信准备知识

文章目录 1 IP/端口类1.1 IPAddress1.2 IPEndPoint 2 域名解析2.1 IPHostEntry2.2 Dns 3 序列化与反序列化3.1 序列化3.1.1 内置类型 -> 字节数组3.1.2 字符串 -> 字节数组3.1.3 类对象 -> 字节数组 3.2 反序列化3.2.1 字节数组 -> 内置类型3.2.2 字节数组 -> 字…

Java-servlet(七)详细讲解Servlet注解

Java-servlet&#xff08;七&#xff09;详细讲解Servlet注解 前言一、注解的基本概念二、Override 注解2.1 作用与优势2.2 示例代码 三、Target 注解3.1 定义与用途3.2 示例代码 四、WebServlet 注解4.1 作用4.2 示例代码 五、反射与注解5.1 反射的概念5.2 注解与反射的结合使…

nginx 反向代理 ubuntu

关键字 Nginx&#xff0c;正向代理&#xff0c;方向代理&#xff0c;博客建站 背景环境 我在搭建个人博客的过程中遇到一个问题&#xff0c;我的博客服务的端口是1313&#xff0c;我的域名是qinyangx.top。我希望能够通过qinyangx.top直接访问到服务器上1313端口的博客服务。…

学习threejs,使用TextGeometry文本几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.TextGeometry1.1.1 ☘…

【秣厉科技】LabVIEW工具包——OpenCV 教程(12):机器学习

文章目录 前言机器学习例1&#xff1a;支持向量机&#xff08;SVM&#xff09;做平面向量二分类例2&#xff1a; K邻近算法&#xff08;KNearest&#xff09;实现分类 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Wind…

企业级AI架构探索:业务驱动,场景优先

企业级AI架构的设计需要兼顾技术先进性、业务适配性、成本效益和长期可维护性。以下从架构设计原则、核心架构层次、基础框架可能性、实施路径四个维度进行系统性阐述&#xff1a; 一、设计原则 业务驱动&#xff0c;场景优先 明确AI解决的业务痛点&#xff08;如降本增效、智…

DCDC36V同步降压 输出可调 2A电流恒压芯片SL1588H 替换LV3842

在当今电子设备飞速发展的时代&#xff0c;电源管理芯片的性能优劣直接关乎设备的稳定性与高效运行。对于诸多需要将 36V 电压进行同步降压、输出电压可调且稳定输出 2A 电流的应用场景&#xff0c;一款卓越的恒压芯片不可或缺。SL1588H 正凭借其领先的技术和出色的性能&#x…

Beans模块之工厂模块注解模块@Qualifier

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

flutter 开发web端的性能优化

参考资料 Flutter for Web 首次首屏优化 ——JS 分片优化_main.dart.js-CSDN博客文章浏览阅读1.4k次。本文介绍了如何通过延迟加载组件和js分片优化Flutter for Web应用的加载速度。在实践中&#xff0c;通过按需加载减少js文件大小&#xff0c;使用并行加载提升加载效率。通过…

【设计模式】三十二、策略模式

系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式定义与核心思想二、模式结构与Java实现1. 核心角色2. Java代码示例 三、策略模式的五大核心优势四、适用场景五、与其他模式的对比六、最佳实践建议总结 &#x1f680;进阶版【更…

【Linux 维测专栏 1 -- Hung Task 分析与验证】

文章目录 Linux Hung Task 简介1. Hung Task 概述2. D 状态与 Hung Task3. Hung Task 的工作原理4. Hung Task 的配置5. Hung Task 的典型输出6. Hung Task 的应用场景7. kernel 配置7.1 编译选项7.2 参数控制7.3 验证方法4. 扩展接口 8. 注意事项 Linux Hung Task 简介 1. Hu…

计算机网络精讲day1——计算机网络的性能指标(上)

性能指标1&#xff1a;速率 概念1&#xff1a;比特 英文全称是binary digit&#xff0c;意思是一个二进制数字&#xff0c;因此一个比特就是二进制数字中的1或0&#xff0c;比特也是信息论中使用的信息量单位。 概念2&#xff1a;速率 网络中的速率指的是数据的传送速率&#…

ubuntu20.04使用matlab2024a快捷键调整

一、概述 因为最近在使用ubuntu系统&#xff0c;在上面安装一个matlab比较方便&#xff0c;不用来回在window上面进行跳转&#xff0c;节省不少时间&#xff0c;同时在ubuntu下面启动matlab速度也比较快。 二、问题解决 &#xff08;一&#xff09;问题概述 问题如下&#xf…

【设计模式】装饰模式

六、装饰模式 装饰(Decorator) 模式也称为装饰器模式/包装模式&#xff0c;是一种结构型模式。这是一个非常有趣和值得学习的设计模式&#xff0c;该模式展现出了运行时的一种扩展能力&#xff0c;以及比继承更强大和灵活的设计视角和设计能力&#xff0c;甚至在有些场合下&am…

科技赋能安全:慧通测控的安全带全静态性能测试

汽车的广泛普及给人们的出行带来了极大便利&#xff0c;但交通事故频发也成为严重的社会问题。据世界卫生组织统计&#xff0c;全球每年约有 135 万人死于道路交通事故&#xff0c;而安全带在减少事故伤亡方面起着不可替代的作用。正确使用安全带可使前排驾乘人员的死亡风险降低…

猿大师中间件:如何在最新Chrome浏览器Web网页内嵌本地OCX控件?

OCX控件是ActiveX控件的一种&#xff0c;主要用于在网页中嵌入复杂的功能&#xff0c;如图形渲染、多媒体播放等&#xff0c;可是随着谷歌Chrome等主流浏览器升级&#xff0c;目前已经不支持微软调用ActiveX控件了&#xff0c;如果想调用OCX控件用IE浏览器或者国产双擎浏览器&a…

基于STC89C52的DS1621温度检测系统

摘要 本文设计了一种基于STC89C52单片机的DS1621温度检测系统&#xff0c;通过DS1621传感器采集温度数据&#xff0c;利用STC89C52单片机处理数据&#xff0c;并通过串口将温度信息发送至电脑显示。借助Proteus软件进行仿真验证&#xff0c;实现了温度检测系统的功能演示。该系…

创建自己的github.io

1、创建GitHub账号 GitHub地址&#xff1a;https://github.com/ 点击Sign up创建账号 如果已创建&#xff0c;点击Sign in登录 2、创建仓库 假设Owner为username&#xff0c;则Repository name为username.github.io说明&#xff1a; 1、Owner为用户名 2、Repository name为仓…

AI Agent中的MCP详解

一、协议定义与核心价值 MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年11月推出的开放标准协议,其核心目标是通过建立统一接口规范,解决AI模型与外部系统集成效率低下的行业痛点。该协议通过标准化通信机制,使大型语言模型(LLM)能够无缝对接数…