一篇文章掌握Git的基本原理与使用
目录
一、创建仓库
1.1 git init
1.2 git clone
二、工作区域与文件状态
三、添加和提交文件
3.1 git status
3.2 git add
git rm --cached
3.3 git commit
git log
四、版本回退
soft
hard
mixed
总结
五、查看差异
工作区与暂存区
工作区与本地仓库
暂存区与本地仓库
版本差异
分支差异
六、删除文件
git rm
git rm --cached file
六、.gitignore 忽略文件
七、分支
7.1git branch显示分支
7.2git branch 分支名创建分支
7.3git switch 分支名切换分支
7.4 git merge src des合并src分支至des分支
7.5 rebase 变基
7.6 git branch -d 分支名删除已合并的分支
7.7 git branch -D 分支名删除未合并的分支
八、解决合并冲突
8.1 设计冲突
8.2 冲突现象
8.3 解决冲突
九、版本回退
一、创建仓库
1.1 git init
使用 git init 初始化git仓库,然后可以使用ls -a查看隐藏的目录结构观察到.git目录

1.2 git clone
使用git clone 可以从远程仓库拉取仓库到本地
二、工作区域与文件状态
git 分为三个区域,分别是工作区(Working Directory)、暂存区(Staging Area/Index)、本地仓库(Local Repository):
- 工作区:实际操作的目录
- 暂存区:相当于一个缓冲区,临时存放即将提交的修改内容
- 本地仓库:Git存储代码和版本信息的主要位置

Git中的文件也存在各自的状态,如下:
- 未跟踪:新创建的还没有被Git管理起来的文件
- 未修改:已经被Git管理,但是文件的内容没有发生变化
- 已修改:已经被修改的文件,但是还没有被添加到暂存区
- 已暂存:已经被修改过并放入暂存区的文件
可以使用git ls-files查看暂存区的文件内容
可以使用git -ltr查看本地仓库的文件内容
三、添加和提交文件
3.1 git status
可以使用git status查看当前工作区的文件状态,下面新建一个文件,使用status后发现文件飘红,这就是未跟踪的文件:

3.2 git add
可以使用git add将文件添加到暂存区,可以看到刚才飘红的file1.txt已经变成绿色,这表示该文件已经被添加到暂存区:

git add还支持通配符与文件夹的添加,如git add \*.txt 与git add dir1/,分别表示添加所有以txt结尾的文件与dir1下的所有文件
git rm --cached
在上图中可以看到,绿色的字体上方有一句提示,使用该命令可以将文件从暂存区中删除:

需要注意的是,<file> 中的 < 和 > 是特殊字符,在 Zsh 中具有特殊含义(例如重定向)。如果你希望直接使用文件名 file1.txt,不需要加 < 和 >。
3.3 git commit
将暂存区的文件添加到本地仓库,它只会与暂存区和本地仓库交互,并不影响工作区的文件,
- 除此之外,使用
git commit提交时要使用-m选项指定文件的提交信息,
- 如果不使用-m,则默认使用vim来编辑提交信息:


git log
git log可以查看所有已经提交的提交信息

可以加上其他选项,如--oneline,这样就会显示比较简洁的提交信息:

四、版本回退
使用git reset时,需要在后面加上回退的版本ID,或者使用 HEAD^ 表示上一个版本
可以使用git reset进行版本回退,同时其支持三种模式:
git reset --soft:保留工作区与暂存区的所有修改内容git reset --hard:丢弃工作区与暂存区的所有修改内容git reset --mixed(default):保留工作区,丢弃暂存区的修改内容
再次新建三个文件,分两次提交,第一次提交前两个文件,第二次提交第三个文件:
接着使用git log查看提交历史:
soft
- 当你提交后,发现提交信息有问题或漏加了一些文件时,可以回退到提交之前的状态,保留文件变更。
使用soft回退到提交两次文件的版本后,使用git log查看,可以看到提交历史已经成功回退到提交两次文件的时候:
查看工作区与暂存区的文件,可以看打它们都没有被删除,且因为回退到了3.txt未被提交的版本,这里显示其是一个新文件:
hard
- 彻底清理: 当你需要放弃所有未提交的更改和暂存内容,回到某个提交的状态。
- 切换分支时冲突太多:如果切换分支或合并导致大量冲突,并且你决定完全放弃当前的更改,可以使用
回退前:
回退后:
查看工作区与暂存区的内容,发现3.txt都被删除了:
mixed
撤销提交并重新整理文件:当你需要取消提交,同时希望对文件进行修改或重新选择哪些文件需要暂存时。
回退前:

回退后:

查看工作区与暂存区,可以发现工作区的3.txt未被删除,但是暂存区的已经被删除:

总结

如果误删除,也不需要担心,可以使用git reflog查看操作的历史记录,然后继续使用git reset进行回溯:

五、查看差异
可以使用git diff查看以下内容:
- 工作区、暂存区、本地仓库之间的差异
- 查看不同版本的差异
- 查看不同分支之间的差异
目前有三次提交:
工作区与暂存区
现在要修改3.txt的内容,然后使用git diff查看:

以上内容说明3.txt修改的内容还没有被添加到暂存区,现在将其添加到暂存区后查看:

可以看到已经没有任何的内容了,表示工作区与暂存区的内容是相同的。
工作区与本地仓库
使用git diff HEAD查看工作区与本地仓库的差异:

暂存区与本地仓库
使用git diff --cached查看暂存区与本地仓库的差异:

版本差异
使用git diff 版本1ID 版本2ID可以比较版本差异,
- HEAD指向最新一次提交,也可以使用其指代最新的一次提交。
- HEAD~表示上一次提交。
- HEAD~2表示本次提交前的第二个版本。
- 可以在后面加上文件名,这样只会比较该文件的版本差异
分支差异
使用git diff 分支1名 分支2名可以查看分支间的差异,具体内容需要看分支小节
六、删除文件
首先查看本地仓库的文件内容:

正常删除文件的流程:
- 删除本地文件
- 使用git add更新暂存区列表
- 使用git commit更新本地仓库

git rm
git中提供git rm命令,可以合并上述的步骤1与步骤2,

但是最后还是要执行git commit删除本地仓库的文件:
执行git commit前:

执行git commit后:

git rm --cached file
如果只需要删除暂存区的文件,可以使用该命令
六、.gitignore 忽略文件
可以创建一个.gitignore文件,在其中添加需要忽略的文件:

此时git就会主动忽略与.gitignore中的文件格式相同的文件:

需要注意的是,git只会忽略.gitignore提交以后生成的文件,如果在.gitignore提交前生成的文件,git还是会进行跟踪。
七、分支
7.1git branch显示分支

可以看到 main 前有一个*,这其实就是HEAD指针,它指向的是当前分支:

7.2git branch 分支名创建分支

在创建分支时,该分支会继承本分支上的提交记录:

7.3git switch 分支名切换分支

在当前分支下创建两个文件并提交到本地仓库,然后切换分支,来观察main分支是否存在新建的文件:


当我们在不同分支间切换时,其实就是HEAD指针指向的改变,这也就解释了为什么在testing分支提交的文件,在main分支不可见:

此时在main分支提交两个文件后,则底层实现会变为:

注:为了方便观察,这里使用提交信息代替了版本ID
7.4 git merge src des合并src分支至des分支
在合并之前,需要先进入des分支

7.5 rebase 变基
rebase 分支名将当前分支变基到指定的分支。
变基(Rebase) 是 Git 中一种重新整理提交历史的操作,它会将一个分支的提交应用到另一个分支的基础之上。


7.6 git branch -d 分支名删除已合并的分支
7.7 git branch -D 分支名删除未合并的分支
八、解决合并冲突
如果两个分支修改了一份文件的同一行代码,git就不知道应该保留哪个内容,也就产生了冲突:

8.1 设计冲突
我们来重新设计一下,用main分支新建文件并提交后新建newb分支:

在newb分支修改main.txt的第二行内容并提交:


切换回main分支修改main.txt的第二行内容并提交:

8.2 冲突现象
尝试合并:

可以使用git diff查看冲突:

8.3 解决冲突
在合并失败后,可以再次编辑该文件,此时文件中就会存在冲突的信息:

此时就需要手动编辑来解决冲突:

当冲突解决后,进行添加与提交,提交后就会自动合并:

如果中途想终止合并,也可以使用git merge --abort
九、版本回退
git checkout -b 分支名 提交ID可以回退到指定的版本
其中,提交ID可以通过git log --oneline --graph --decorate --all查看,同时该指令也可以比较直观的查看当前所有分支。
相关文章:
一篇文章掌握Git的基本原理与使用
目录 一、创建仓库 1.1 git init 1.2 git clone 二、工作区域与文件状态 三、添加和提交文件 3.1 git status 3.2 git add git rm --cached 3.3 git commit git log 四、版本回退 soft hard mixed 总结 五、查看差异 工作区与暂存区 工作区与本地仓库 暂存区…...
「Mac畅玩鸿蒙与硬件43」UI互动应用篇20 - 闪烁按钮效果
本篇将带你实现一个带有闪烁动画的按钮交互效果。通过动态改变按钮颜色,用户可以在视觉上感受到按钮的闪烁效果,提升界面互动体验。 关键词 UI互动应用闪烁动画动态按钮状态管理用户交互 一、功能说明 闪烁按钮效果应用实现了一个动态交互功能…...
朗新科技集团如何用云消息队列 RocketMQ 版“快、准、狠”破解业务难题?
作者:邹星宇、刘尧 朗新科技集团:让数字化的世界更美好 朗新科技集团股份有限公司是领先的能源科技企业,长期深耕电力能源领域,通过新一代数字化、人工智能、物联网、电力电子技术等新质生产力,服务城市、产业、生活中…...
【Ubuntu】Ubuntu的Desktop(学习/用户使用)和Bit版本(工作)
这篇文章似乎没什么必要写,但想了想还是决定记录一下,也许对新手入坑Ubuntu会有帮助, 事实上也很简单,一个是桌面版本,另一个是字符界面版本。 桌面版:拥有图形桌面 字符界面,易上手ÿ…...
cmake CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR的区别
在 CMake 中,CMAKE_CURRENT_LIST_DIR 和 CMAKE_CURRENT_SOURCE_DIR 都是指代当前 CMake 文件所在的路径,但它们的含义和用途有所不同: CMAKE_CURRENT_LIST_DIR: 表示 当前处理的 CMake 文件(例如 CMakeLists.txt&#…...
学会用VSCode debug
本文主要介绍了 VS Code 的调试功能,包括其强大的内置调试器,支持多种语言,如 JavaScript、TypeScript 等。通过简单项目示例展示调试过程,还介绍了运行面板和菜单、启动配置、调试操作、断点、记录点等功能,以及三种调…...
C语言专题之结构体的使用
结构体(struct)是一种用户自定义的数据类型,它允许将不同类型的数据组合在一起,形成一个新的数据类型。结构体在编程中非常常见,尤其是在需要处理复杂数据结构的情况下。以下是结构体的基本使用方法: 一、结…...
python中的高阶函数
1、什么是高阶函数? 高阶函数是指将函数作为参数传入。就是高阶函数 2、高阶函数有哪些? map 映射函数 >>> print(list(map(lambda x:x*x,range(1,11)))) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] >>> print(list(map(lambda x:st…...
学习笔记063——通过使用 aspose-words 将 Word 转 PDF 时,遇到的字体改变以及乱码问题
文章目录 1、问题描述:2、解决方法: 1、问题描述: Java项目中,有个需要将word转pdf的需求。本人通过使用aspose-words来转换的。在Windows中,转换是完全正常的。但是当部署到服务器时,会出现转换生成的pdf…...
SpringBoot整合Mockito进行单元测试超全详细教程 JUnit断言 Mockito 单元测试
Mock概念 Mock叫做模拟对象,即用来模拟未被实现的对象可以预先定义这个对象在特定调用时的行为(例如返回值或抛出异常),从而模拟不同的系统状态。 导入Mock依赖 pom文件中引入springboot测试依赖,spring-boot-start…...
【AI知识】过拟合、欠拟合和正则
一句话总结: 过拟合和欠拟合是机器学习中的两个相对的概念,正则化是用于解决过拟合的方法。 1. 欠拟合: 指模型在训练数据上表现不佳,不能充分捕捉数据的潜在规律,导致在训练集和测试集上的误差都很高。欠拟合意味着模…...
MacOS编译webRTC源码小tip
简单记录一下,本人在编译webRTC时,碰到了一下比较烦人的问题,在MacOS终端下,搭建科学上网之后,chromium的depot_tools仓库成功拉下来了,紧接着,使用fetch以及gclient sync始终都返回curl相关的网…...
Linux基础命令(三):文件压缩及解压缩命令
文件压缩及解压缩命令 tar — 打包和压缩 tar 是一个用于打包文件的工具,常常用来将多个文件或目录打包成一个单独的文件。它本身不进行压缩,但可以与压缩工具(如 gzip 或 bzip2)一起使用。 用法: 打包文件࿰…...
目标跟踪算法:ByteTrack、卡尔曼滤波、匈牙利算法、高置信度检测目标、低置信度检测目标
目录 1 ByteTrack特点 2 ByteTrack和SORT区别----个人通俗理解 3 ByteTrack算法原理 4 ByteTrack整体流程图 上一篇博客我复习了下SORT跟踪算法,这一篇博客我再复习下ByteTrack跟踪算法,ByteTrack里面也是用了卡尔曼滤波和匈牙利算法&#x…...
[定昌linux系统]如何安装jdk8
1:下载jdk8 的 arm64 的版本,由于官方下载需要gmail,我的gmail 密码忘了,所以从csdn上下载了一份,地址: https://download.csdn.net/download/qq_27742163/88533548?utm_mediumdistribute.pc_relevant_download.none…...
【Cadence32】PCB多层板电源、地平面层创建心得➕CM约束管理器Analyze分析显示设置➕“DP”报错DRC
【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办? 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…...
基于SpringBoot+Vue的新闻管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展,信息传播速度不断加快,新闻媒体行业面临着巨大的机遇与挑战。传统的新闻媒体正在逐渐向数字化转型,而新闻管理系统作为数字化新闻媒体的核心组成部分,其…...
图的割点、割边(Tarjan算法)
深度优先搜索的利用。 在一个无向连通图中,如果删掉某个顶点后,图不再连通(即任意两点之间不能互相到达),我们称这样的顶点为割点。 在一个无向连通图中,如果删掉某条边后,图不在连通࿰…...
算法学习(十四)—— 二叉树的深度搜索(DFS)
目录 关于dfs 部分OJ题详解 2331. 计算布尔二叉树的值 129. 求根节点到叶节点数字之和 814. 二叉树剪枝 98. 验证二叉搜索树 230. 二叉搜索树中第K小的元素 257. 二叉树的所有路径 关于dfs 算法学习(十二)—— 递归,搜索,…...
【vue2】封装自定义的日历组件(三)之基础添加月份的加减定位到最新月份的第一天
我们在切换月份的时候,希望高亮显示在每个月的第一天上面,这样的效果我们要怎么来实现,其实也很简单,我们先看下实现的效果 实现效果 代码实现 原理就是获取到每月的第一天日期,然后再跟整个的数据进行对比ÿ…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
