git的理解与使用

news2025/3/5 4:52:46

本地的git

git除了最经典的add commit push用来做版本管理,其实他的分支管理也非常强大

可以说你学好了分支管理,就可以完成团队的配合协作了

git仓库

我们可以使用git init来初始化一个git仓库,只要能看见.git文件夹,就代表这是一个git仓库了

image.png

git分区

git一共有三个分区,工作区、暂存区、版本库

工作区

.git文件夹在相同目录即为工作区,也就是我们写代码的地方

暂存区与版本库

这两个分区实际上是存在.git文件夹里的

在这里插入图片描述

当我们使用add之后,代码就会被存储在暂存区,只有commit之后,也就是提交代码,整个代码才会被放入版本库,也就是上图的master文件夹中

我们也可以偷看一下.git文件夹,需要注意的是,我们绝不能更改.git文件夹的任何内容

image.png

在整个git目录中,我们不需要全部搞明白,只需要抓住几个核心文件即可

  • objects:这是一个对象目录,存储的是git对象,Git进行版本管理的核心不是将文件全部备份,而是只记录修改的部分,当工作区代码修改后,会将修改的内容写入obj库中的一个新git对象中,因此暂存区和版本库存的不是数据本身,而是git对象的索引,以便快速定位与修改
  • index:暂存区,add之后就会更新这里的内容,我还没有add所以并没有这个文件夹
  • /refs/heads/master:这是当前master分支(版本库)的最新一次提交的id索引,在每一次提交的内容中都会保存上一次提交的索引id,因此整个版本库就像一个链表一样
  • HEAD:这是一个指针,用于指向当前我们处于版本库的哪一个位置,也就是在链表的哪一个节点

git 本地常用命令

add commit这里就不说了,分别就是将文件保存到暂存区和提交到版本库

  • 查看工作区与暂存区代码差异:git diff [file]
  • 查看版本库与工作区代码差异:git diff head -- [file]
  • 查看提交记录:git log

image.png

commit后面那一串代码是提交的ID,每一次的提交ID都是独一无二的,确保我们可以进行版本回退

版本回退

版本回退是比较复杂的,核心是使用git reset [--soft | --mixed | --hard] [HEAD] 实现的

我们核心理解的是,版本回退指的是将版本库中的内容进行回退,工作区和暂存区是否回退则由参数决定

  • –mixed 是默认选项,会将暂存区的内容回退,工作区不变
  • –soft 是工作区和暂存区都不回退
  • –hard 是暂存区和工作区都回退,当工作区有未保存备份提交的代码时不要使用这个选项!否则工作区代码无法找回!
  • HEAD选项是标识当前版本 HEAD^ 标识上一个版本 HEAD^^ 标识上两个版本,可以依次类推,也可以直接写上面的提交ID,回退到指定版本

如果不小心全部回退到目标版本之前的某个版本了,这时git log是无法找到目标版本的提交ID了,需要使用git reflog,查看所有提交的命令,再利用ID回退到目标版本即可

删除文件

git rm 删除工作区和暂存区的文件

撤销修改
  1. 撤销工作区的修改:git checkout -- [file] 将工作区文件恢复到最近一次add或commit的状态
  2. 撤销工作区和暂存区的代码:使用git reset --mixed [HEAD],会将暂存区和版本库的代码进行回退,工作区不变,变为第一种情况
  3. 全部回退:git reset --hard [HEAD],前提是不能push,因为推送到远端仓库后再回退其实就意义不大了,本身就是为了避免不影响远端仓库的

分支管理

master分支或者main分支为主分支,一般大型项目都不在主分支上,分支就像是分身一样,写不同部分的代码,最后合并就是完整的项目,因此我们也可以进行分支的创建、切换、合并

在这里插入图片描述

比如我们现在创建一个dev分支,我们可以把这个时间线画出来

创建分支git branch [name],查看分支git branch

在这里插入图片描述

image.png

星号就标识我们当前所处的分支

使用git checkout [name]可以切换分支

在这里插入图片描述

image.png

我们可以在dev分支中创建文件,编写代码

写好后我们切换到master分支,会发现工作区的文件和代码并没有改变

在dev分支合并之前,master主分支都不会收到影响

这是因为dev分支的新提交对于master分支来说是完全不可见的

那要进行部署上线,就需要合并分支,可以利用git merge [name]进行分支合并

需要注意的是,这个name指的是需要将name分支合并到当前所在分支

例如当前是master分支,使用git merge dev是将dev分支合并到master分支

合并分支之后分支并没有删除,仍然可以继续开发,因此合并也可以用来同步各个分支的代码

如果某个分支没有用了,就可以使用git branch -d [name]删除指定分支

在这里插入图片描述

如果两个分支是两个团队在维护,并且他们都对同一个文件进行修改了,合并会发现有冲突,就像下面这样

在这里插入图片描述

这种情况下git会提示我们哪些文件有冲突,我们需要手动修改保留代码,然后再进行一次add和commit,就可以解决冲突了

Fast forword模式

这是一种分支合并的模式,在这种模式下,删除分支后查看分支历史时,就无法查看到以前的分支信息了,我们无法直到这个最新提交是merge来的还是commit来的

但是我们在解决冲突之后再commit一次,这样就不是fast forword模式了,就能看出分支信息了

git也可以强制禁用 fast forword git merge -no-ff -m "合并" [name]

这样就会自动生成新的commit,就能看到分支信息了

这里需要边操作边理解画图,才能更好理解

分支管理策略

一般来说master分支是最稳定的,也就是服务部署的分支,然后是dev开发分支,开发分支可以再继续细分到具体的某个人,如果开发只有你一个人来包揽也是可以的,类似的还有feature分支

image.png

如何管理和实践还是因人而异了

master分支遇见BUG怎么办

master分支突然遇到bug,有两种解决的思路

第一种是直接在master上开一个新的bug分支,然后再改bug,改好之后直接合并,最后删除bug分支

第二种是需要在dev分支上修,但是dev分支上还有未完成的工作,我们就可以使用git stash将当前工作区文件信息进行存储,然后修bug,修好之后给push回去,之后再使用git stash list可以查看内容,用git stash pop恢复即可

远端的git

其实远端的git是用于合作用到的更多,例如github,gitee都是代码托管平台,相当于免费给了一个远程的代码存储服务器

我们在push和pull的时候其实就是和远端的git仓库进行互动,将本地的所有git信息发到远端去了

但是在多人协作时,还是要优先使用pull,将其他人的代码拉下来,再进行push,要提前在本地解决好冲突才行

git标签

试想一下这样的场景, 公司在团队协作开发项目时, commit提交了上万次, 但是此时你想要回滚到某个特定的commit版本, 你怎么应对? 难道一个一个的去找吗? 难受, 实在是难受

理解标签

标签tag可以理解为对某次commit的一个标识, 相当于为此次commit取别名, 例如在项目发布某个版本时, 可以给最近一次commit打上v1.0的标签,这样下次需要回滚到1.0版本的提交时, 就不需要查看log了, 只需要查看tag标签即可定位

常用指令如下

  • 创建标签:git tag [name],如: git tag v1.0
    • 此标签默认打在最新一次提交的commit id上
  • 查看所有标签:git tag
  • 给标签标注信息: git tag -a [name] -m "信息"
  • 查看标签信息:git show [标签名]
  • 删除标签:git tag -d [标签名]
  • 推送标签至远端服务器:git push origin v1.0
  • 推送所有标签:git push origin --tags

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java进阶(一)

目录 一.Java注解 什么是注解? 内置注解 元注解 二.对象克隆 什么是对象克隆? 为什么用到对象克隆 三.浅克隆深克隆 一.Java注解 什么是注解? java中注解(Annotation)又称java标注,是一种特殊的注释。 可以添加在包,类&…

zookeeper的介绍和简单使用

1 zookerper介绍 zookeeper是一个开源的分布式协调服务,由Apache软件基金会提供,主要用于解决分布式应用中的数据管理、状态同步和集群协调等问题。通过提供一个高性能、高可用的协调服务,帮助构建可靠的分布式系统。 Zookeeper的特点和功能…

【学习笔记】深度学习网络-深度前馈网络(MLP)

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…

uni-app 程序打包 Android apk、安卓夜神模拟器调试运行

1、打包思路 云端打包方案(每天免费次数限制5,最简单,可以先打包尝试一下你的程序打包后是否能用): HBuilderX 发行App-Android云打包 选择Android、使用云端证书、快速安心打包本地打包: HBuilderX …

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中,我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现,以及基本的系统性能指标,包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…

速通 AI+Web3 开发技能: 免费课程+前沿洞察

AI 正以前所未有的速度重塑各行各业,从生成式模型到大规模数据处理,AI 逐渐成为核心驱动力。与此同时,Web3 去中心化技术也在重新定义信任、交易和协作方式。当这两大前沿技术相遇,AI Web3 的融合已不再是理论,而是未…

使用LPT wiggler jtag自制三星单片机(sam88 core)编程器-S3F9454

写在前面 新年好,各位,今天来分享制作一个三星单片机的编程器 嘿嘿,x鱼垃圾佬元件库有些三星单片机s3f9454,编程器不想买,基本拿来拆件玩的。但,前些时候csdn下载到它的编程时序,自己来做个编程…

【Unity3D】《跳舞的线》游戏的方块单方向拉伸实现案例

通过网盘分享的文件:CubeMoveMusic.unitypackage 链接: https://pan.baidu.com/s/1Rq-HH4H9qzVNtpQ84WXyUA?pwda7xn 提取码: a7xn 运行游戏点击空格动态创建拉伸的方块,由Speed控制速度,新方向是随机上下左右生成。 using System.Collect…

Chameleon(变色龙) 跨平台编译C文件,并一次性生成多个平台的可执行文件

地址:https://github.com/MartinxMax/Chameleon Chameleon 跨平台编译C文件,并一次性生成多个平台的可执行文件。可以通过编译Chameleon自带的.C文件反向Shell生成不同平台攻击载荷。 登录 & 代理设置 按照以下步骤设置 Docker 的代理: 创建配置目…

解读2025年生物医药创新技术:展览会与论坛的重要性

2025生物医药创新技术与应用发展展览会暨论坛,由天津市生物医药行业协会、BIO CHINA生物发酵展组委会携手主办,山东信世会展服务有限公司承办,定于2025年3月3日至5日在济南黄河国际会展中心盛大开幕。展会规模60000平方米、800参展商、35场会…

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel 一、前言二、Grid 布局:万能的布局王者2.1 Grid 布局基础:构建网格世界2.2 子元素定位与跨行列:布局的精细操控2.3 自适应布局:灵活应变的秘诀 三、StackPanel…

git常用命令学习

目录 文章目录 目录第一章 git简介1.Git 与SVN2.Git 工作区、暂存区和版本库 第二章 git常用命令学习1.ssh设置2.设置用户信息3.常用命令设置1.初始化本地仓库init2.克隆clone3.查看状态 git status4.添加add命令5.添加评论6.分支操作1.创建分支2.查看分支3.切换分支4.删除分支…

Linux的基本指令(上)

1.ls指令 语法:ls [选项] [目录或文件] 功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。 常用选项: -a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。 -d 将…

【单链表算法实战】解锁数据结构核心谜题——相交链表

题目如下: 解题过程如下: 相交链表只可以在中间任意位置/头/尾结点相交,如下图: 一个next指针只能指向一块地址,所以不会出现这种情况: 在返回相交链表的起始结点之前先要判断两个链表是否相交&#xff0…

HTTP 配置与应用(不同网段)

想做一个自己学习的有关的csdn账号,努力奋斗......会更新我计算机网络实验课程的所有内容,还有其他的学习知识^_^,为自己巩固一下所学知识,下次更新校园网设计。 我是一个萌新小白,有误地方请大家指正,谢谢…

深度学习 Pytorch 单层神经网络

神经网络是模仿人类大脑结构所构建的算法,在人脑里,我们有轴突连接神经元,在算法中,我们用圆表示神经元,用线表示神经元之间的连接,数据从神经网络的左侧输入,让神经元处理之后,从右…

政安晨的AI大模型训练实践三:熟悉一下LF训练模型的WebUI

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 启动WebUI 微调模型 LLaMA-Factory 支持通过 WebUI 零代码微调大语言模型。 启动Web…

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

目录 设计思路 1.为什么不直接用FlinkCDC要重写Flink Gauss CDC 2.存量同步的逻辑是什么 2.1、单主键的切片策略是什么 2.2、​​​​​复合主键作切片,怎么保证扫描到所有的数据 3、增量同步的逻辑是什么 4、存量同步结束之后如何无缝衔接增量同步 5、下游数据如何落…

【深入理解SpringCloud微服务】Sentinel规则持久化实战

Sentinel规则持久化实战 Sentinel规则推送模式原始模式pull(拉模式)push(推模式) 实现拉模式实现推模式 Sentinel规则推送模式 原始模式 原始模式由Sentinel控制台直接推送规则到Sentinel客户端,Sentinel客户端将规则…

PCIE模式配置

对于VU系列FPGA,当DMA/Bridge Subsystem for PCI Express IP配置为Bridge模式时,等同于K7系列中的AXI Memory Mapped To PCI Express IP。