Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
读书笔记:卓越强迫症+强大恐惧症,在亲子家庭、职场关系里尤其是纵向关系模型里,这两种状态很容易无缝衔接。尤其父母对子女、领导对下属,都有望子成龙、强将无弱兵的期望,然而在你的面前,他们才是永远强大的那一个。当子女‘不听话’,下属‘不可控’,他们出现了强大恐惧症。两个矛盾体,让父母、领导开始不知所措,无法信赖对方,即使信赖也难以接纳并非永远强大的自己。
一、前言背景
二、Git是什么?
2.1 和其他版本管理工具差别是什么?
三、Git核心架构
3.1 架构原理
3.1.1 远程仓库
3.1.2 本地仓库
3.2 git工作指南
四、git 配置管理
五、常用命令实战详解
5.1 新建本地仓库
5.2 分支管理
5.3 代码管理
5.4 stash管理
5.5 标签管理
5.6 版本回退
六、 命令集合
【公众号搜索:拉丁解牛说技术】欢迎一起交流讨论。
一、前言背景
Git是目前最流行的分布式代码版本管理平台,简单好用、稳定可靠的特性,得到行业广泛认可应用。尤其在可视化管理工具普及,以及集成到开发工具背景下,新手几乎不需要专门学习Git,通过了解几个简单按钮功能,就可以在工作当中轻松完成git管理代码提交、合并。
然而,随着研发经验的不断提升、岗位工作对自身也提出新的要求,新手小白,逐渐需要应对解决代码冲突、回滚、版本管理、仓库搭建运维等复杂工作。此时深入实践掌握Git核心架构原理、git常用功能命令、Git仓库管理配置等技能,显得尤为重要。
二、Git是什么?
Git是一个分布式版本管理系统,它允许开发者跟踪代码的更改,协作开发,以及在不同版本之间切换。Git 的主要特点包括:分布式架构设计、简单易用、本地离线修改提交、灵活的版本控制。
2.1 和其他版本管理工具差别是什么?
Git采用分布式的版本管理架构:每个开发者都有一个完整的代码库副本,允许离线操作和分支管理,即使远程git库挂了,数据丢了也不用过于担心。由于分布在各地的开发者本地有副本,代码不会丢失。而传统版本控制系统比如SVN是集中式管理,开发者必须连接到中央服务器才可以管理追踪代码,中央库如果出故障,开发者无法管理操作代码。
Git仅存储版本快照:开发者每次提交,Git仅保存修改文件最新内容快照,通过版本链来管理内容版本。而传统SVN、CVS是记录具体内容比较修改记录。Git在宏观上,是对代码文件整体变化的关注,只要文件有修改,不过内容多少,统一是一次版本更新,记录到文件系统。而SVN、CSV会详细记录着每个版本相关文件修改差异,关注的是细节。
几乎是纯本地管理:Git由于本地仓库和本地副本的存在,开发者即使没有网络,也可以先在本地完成代码修改提交,并且随时可以查看历史版本差异和历史修改记录。当有网络的时候,直接push本地最新版本到远程即可。离线的操作,非常轻量和高效。
三、Git核心架构原理
Git的核心架构由远程仓库(remote)和本地仓库(repository)两部分组成。
3.1 架构原理
3.1.1 远程仓库
远程服务器的仓库,常用的有github、gitlab、bitbucket、gitee等平台仓库。大部分企业选择在公司内部搭建git远程仓库管理内部项目系统源码,避免公司代码资产流失到外部互联网上。
企业内部运维管理人员通过在远程仓库实现代码版本管理、用户管理、项目授权、devops集成、用户ssh公钥管理等核心功能。
3.1.2 本地仓库
开发者通过git clone复制保存或者git add remote origin 关联远程仓库到本地,初始化本地仓库。如果不想让代码共享到远程仓库,也不需要和其他人协作。本地仓库也是一个功能完善的git仓库,在本地也可以进行灵活的版本管理。
本地git版本库,又细分为:工作区目录workspace、暂存区index、本地库.git。
比如我在本地电脑:新建一个目录细分工作区目录ladingjieniu-proj001,通过git init 初始化并新建一个本地版本库,库地址是当前目录下的.git文件夹。
里面新增一个lading.txt文件。
.git目录下,会自动新增暂存区index目录。
3.2 git工作指南
开启一个项目的git版本管理,一般都是2个模式。一个是直接从远程库clone项目到本地,然后开始开发迭代。另一个就是先在本地创建好本地库,然后通过git add remote origin 来关联远程库,随后开始迭代推送代码。
第一个模式比较常见,具体流程如下:
1、首先通过git clone拷贝远程代码库到本地库。后期远程库有其他人推送更新,通过git fetch \ pull命令拉取远程最新分支信息更新到本地。
2、本地仓库新增或者checkout到对应分支进行开发。
3、开发迭代完成后,通过git add命令,提交本地代码到暂存区index。
4、随后通过git commit -am 'message 说明'提交本次变更到本地库.git目录。
5、最后通过git push将本地库的全部更新推送到远程库。
四、git 配置管理
在我们本地仓库,git的配置文件有三种级别,分别是仓库级别、用户级别、系统级别。三者的优先级从高到底分别是:仓库local信息> 用户级别global信息> 系统system级别信息。我们主要用到的是仓库级别和用户级别。对应配置信息地址分别是:.git/config,~/.gitconfig。
4.1 查看git配置信息
查看ladingjieniu-proj001这个仓库的git配置信息,直接cat .git/config文件,或者git config --local -l命令查看:
查看当前系统用户ladingjieniu的git配置信息, cat ~/.gitconfig,或者git config --global -l:
(base) ladingjieniu $ cat ~/.gitconfig
[user]
name = ladingjieniu
email = ladingjieniu@xxx.com
4.2 新增修改git配置信息
通过命令git config --local [参数名] [参数值]设置。比如:git config --local project.develop 'ladingjieniu66'
而修改用户级别的配置信息,通过git config --global 命令来实现配置。
五、常用命令实战详解
5.1 新建本地仓库
首先,如果本地已经有相关项目代码,需要创建本地git库,直接cd到对应目录。
输入命令:git init 回车。当前项目目录就变成了git本地库,你会发现有个.git 目录出现。
其次,如果是新建全新项目,通过mkdir [project-name]新建目录,然后再输入命令:git init 回车,当前目录变成本地库完成,随后可以在该目录下迭代代码文件。
最后,如果需要下载一个远程项目到本地,输入命令:git clone [url],则远程项目就被下载到本地,且本地当前目录变成了该项目本地git库。这里一般是通过https方式,比如【git clone https://gitee.com/arthas/arthas.git】。如果是ssh方式,需要在远程仓库配置本地电脑公钥才可以通过ssh方式clone远程仓库。
5.2 分支管理
查看本地分支、远程分支:git branch \ git branch -r。
切换分支:git checkout [branch]。
新建本地分支,并切换到新分支:git checkout -b [branch]。
删除本地分支:先切换到其他分支,然后执行git branch -d [branch-name] 。
删除远程分支:git push origin --delete [branch-name]。
5.3 代码管理
当我们在本地test3分支做了修改,需要合并到本地的master分支。可以通过:git merge 来合并。
在实际工作中,如果master分支代码远程已经有其他人做了修改提交。此时合并代码到master后,进行push操作,会出现代码冲突。此时git要求本地做好冲突修改后,作为一次新的commit 和push。
5.4 stash管理
当我们在本地分支做了一些需改,可能是未完全实现的迭代,此时有紧急需求,需要切换到另一个分支去处理,但是又不希望当前修改提交到本地库。我们可以通过git stash 命令,将当前修改,提交到堆栈中。后续在任意分支,可以通过git stash pop命令取回之前缓存的修改内容。
5.5 标签管理
当版本正常发布后,需要对版本库进行打标签封存发布。可以通过git tag相关命令去处理。
新建tag:git tag [标签名]
删除标签:git tag -d [标签名]
远程标签删除:git push origin --delete tag [标签名]
查看标签: git tag
本地标签打好后,进行远程推送:git push origin [标签名]。然后在远程仓库就可以看到对应tag清单。
5.6 版本回退
在Git中回退到上一个版本,用HEAD表示当前版本,head^表示上一个版本,比如:
git reset --hard HEAD^。
如果需要回退到指定版本,先通过git log命令查看对应版本的sha1值,然后通过git reset --hard 【sha1值版本号,前几位就可以】进行回退。
六、 命令集合
#######分支管理
# 新建分支
$ git branch [新分支名]
# 切换到指定分支
$ git checkout [分支名]
# 新建分支,并切换新分支
$ git checkout -b [新分支名]
# 查看本地分支
$ git branch
# 查看远程分支
$ git branch -r
# 查看本地分支和远程分支
$ git branch -a
# 删除分支,需要先切换到其他分支,不能在本地分支删除本分支!
$ git branch -d [分支名]
# 删除远程分支
$ git push origin --delete [分支名]
$ git branch -dr [remote/branch]
# 新建分支,并指向到指定commit
$ git branch [branch] [commit]
# 新建分支,并与的远程分支建立关联关系
$ git branch --track [本地分支名] [远程分支名]
# 将指定分支内容合并到当前分支
$ git merge [指定分支名]#######配置管理
# 查看Git配置
$ git config --list
# 编辑Git配置文件,--global是用户级别,--local是本地仓库级别。
$ git config [--global] [--local]
# 设置用户信息,设置用户级别就很方便。用户名+邮箱,这里不能用=号。需要空格双引号
$ git config [--global] user.name "用户名xxx"
$ git config [--global] user.email "邮箱地址xxx"#######代码提交推送
# 添加相关修改文件或某个目录到暂存区index
$ git add [file1] [file2] [dir]...
# 添加当前目录的所有文件到暂存区
$ git add *
# 把之前add到暂存区修改内容,提交到本地仓库
$ git commit -m [message]
# 把指定暂存区文件,提交到本地仓库
$ git commit [file1] [file2] ... -m [message]
# 全部修改commit
$ git commit -am [message]
# 删除工作区workspace的文件,并且将这次删除放入暂存区index
$ git rm [file1] [file2] ...
# 提交修改到远程仓库
$ git push origin master
# 拉取远程更改到本地仓库默认自动合并,pull=fetch+merge命令。
$ git pull origin master#######git标签管理
# 查看全部tag
$ git tag
# 新建一个tag
$ git tag [tag名称]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag
$ git push origin :refs/tags/[tag名称]
# 查看tag信息
$ git show [tag]
# 提交指定tag
$ git push [remote] [tag]
# 提交所有tag
$ git push [remote] --tags
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]#######git回退回滚管理
# 回退到上一个版本
$ git reset --hard HEAD^
# 回退到指定版本,先通过git log查看对应commit sha1值
$ git reset --hard [commit 的sha1]#######git stash暂存管理
# 暂时将未提交的变化放到堆栈里
$ git stash
# 将堆栈里未提交内容恢复到当前分支
$ git stash pop#######其他命令,提交日志、差异查看
# 查看当前分支的历史提交记录
$ git log
# 查看commit历史,以及每次commit变更文件统计信息
$ git log --stat
# 查看过去3次提交
$ git log -3 --pretty --oneline
# 查看该项目用户提交信息统计,并排序
$ git shortlog -sn
# 查看指定文件历史差异提交情况
$ git log -p [file]
# 查看暂存区和工作区的差异
$ git diff
# 查看统计,当前用户写了多少代码
$ git diff --shortstat "@{0 day ago}"
相关文章:

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
读书笔记:卓越强迫症强大恐惧症,在亲子家庭、职场关系里尤其是纵向关系模型里,这两种状态很容易无缝衔接。尤其父母对子女、领导对下属,都有望子成龙、强将无弱兵的期望,然而在你的面前,他们才是永远强大的…...

IDEA导入Maven工程不识别pom.xml
0 现象 把阿里 sentinel 项目下载本地后,IDEA 中却没显示 maven 工具栏。 1 右键Maven Projects 点击IDEA右侧边栏的Maven Projects,再点击: 在出现的选择框中选择指定的未被识别的pom.xml即可: 2 Add as maven project 右键p…...

AT8870单通道直流电机驱动芯片
AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器,适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器,该驱动器由四个N-MOS组成,能够以高达3.6A的峰值电流双向控制电机。利用电流…...

计算机视觉算法实战——实体物体跟踪
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域介绍✨✨ 实体物体跟踪(Object Tracking)是计算机视觉领域中的一个重要研究方向&#x…...

网络协议如何确保数据的安全传输?
网络协议作为计算机网络通信的基石,其设计不仅旨在实现数据的有效传输,更在于确保数据在传输过程中的安全性。对于网络协议如何保障数据安全传输,是很多企业和网络IT部门的重点,本文将从多方面概述相关方法。 加密与解密机制 1. …...

在elasticsearch中,document数据的写入流程如何?
本文将为您介绍文档内容是如何写入ES集群中。 数据写入ES集群的流程图如下 流程介绍 用户携带数据发起POST请求指向集群9200端口。9200端口将数据写入请求发给主分片。主分片会对数据进行分片计算分发给具体分片。(计算方式:hash % primary_number_sha…...

【优选算法】6----查找总价格为目标值的两个商品
这道题相对于前寄到算法题较为容易~ 同样也是使用了双指针的算法哦~ ----------------------------------------begin-------------------------------------- 题目解析: 题目也是很简单地一句话,但是意图还是很明确~ 讲解算法原理: 同样的&…...

99.8 金融难点通俗解释:净资产收益率(ROE)
目录 0. 承前1. 简述2. 比喻:养母鸡赚钱2.1 第一步:投资母鸡2.2 第二步:母鸡下蛋2.3 第三步:计算赚钱2.4 第四步:计算ROE 3. 生活中的例子3.1 好的ROE3.2 一般的ROE3.3 差的ROE 4. 小朋友要注意4.1 ROE高不一定好4.2 R…...

Java设计模式—观察者模式
观察者模式 目录 观察者模式1、什么是观察者模式?2、观察者模式优缺点及注意事项?3、观察者模式实现?4、手写线程安全的观察者模式? 1、什么是观察者模式? - 实例:现实生活中很多事物都是依赖存在的&#x…...

人工智能在数字化转型中的角色:从数据分析到智能决策
引言 在数字化转型浪潮中,人工智能(AI)正迅速崛起,成为推动企业创新和变革的关键力量。面对日益复杂的市场环境和激烈的行业竞争,企业亟需借助技术手段提高运营效率、优化决策过程,并增强市场竞争力。而AI…...

论文阅读 Multi-view Classification Using Hybrid Fusion and Mutual Distillation
Multi-view Classification Using Hybrid Fusion and Mutual Distillation Intro 多视角问题可以分为两类: Structured。固定视角,或预先定义的视角的问题。unstructured。 本文的三大contributions: 引入了混合的多视角融合策略。使用了…...

AIGC浪潮下,图文内容社区数据指标体系如何构建?
文章目录 01 案例:以图文内容社区为例实践数据指标体构建02 4个步骤实现数据指标体系构建1. 明确业务目标,梳理北极星指标2. 梳理业务流程,明确过程指标3. 指标下钻分级,构建多层级数据指标体系4. 添加分析维度,构建完…...

”彩色的验证码,使用pytesseract识别出来的验证码内容一直是空“的解决办法
问题:彩色的验证码,使用pytesseract识别出来的验证码内容一直是空字符串 原因:pytesseract只识别黑色部分的内容 解决办法:先把彩色图片精确转换成黑白图片。再将黑白图片进行反相,将验证码部分的内容变成黑色&#…...

前端Vue2项目使用md编辑器
项目中有一个需求,要在前端给用户展示内容,内容有 AI 生成的,返回来的是 md 格式,所以需要给用户展示 md 格式,并且管理端也可以编辑这个 md 格式的文档。 使用组件库 v-md-editor。 https://code-farmer-i.github.i…...

OpenVela 架构剖析:从内核到应用
目录 一、总体架构概述 二、 内核层 2.1. OpenVela架构的内核基础 2.2. 内核层的主要职责 2.3. OpenVela对NuttX的扩展与优化 三、系统服务层 2.1. 进程管理 2.2. 内存管理 2.3. 文件系统 2.4. 网络通信 四、框架层 4.1. 模块化设计 4.2. API接口 4.3. 组件和服务…...

vue视频流播放,支持多种视频格式,如rmvb、mkv
先将视频转码为ts ffmpeg -i C:\test\3.rmvb -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls C:\test\a\output.m3u8 后端配置接口 import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.spring…...

记一个Timestamp时区问题的坑
resultSet.getTimestamp(“kpi_collect_time”)查出来的Timestamp居然是带时区的, 如果该Timestamp不是UTC时区的,Timestamp.toInstant().atZone(ZoneId.of(“UTC”))会把Timestamp转成UTC时区 使用Timestamp.toLocalDateTime()可以直接把时区信息抹除 …...

新年好(Dijkstra+dfs/全排列)
1135. 新年好 - AcWing题库 思路: 1.先预处理出1,a,b,c,d,e到其他点的单源最短路,也就是进行6次Dijkstra 2.计算以1为起点的这6个数的全排列,哪种排列方式所得距离最小,也可以使用dfs 1.Dijkstradfs #define int long longusing …...

如何“看到” Spring 容器?
Spring 容器是一个运行时的抽象工具,用来管理 Bean 的生命周期和依赖。虽然它本身不可直接观察,但可以通过以下方式间接“看到”容器的内容或行为。 2.1 容器是如何实例化的? Spring 容器的实例化是通过 ApplicationContext 或 BeanFactory …...

怎么使用CRM软件?操作方法和技巧有哪些?
什么是CRM? 嘿,大家好!你知道吗,在当今这个数字化时代里,我们每天都在与各种各样的客户打交道。无论是大公司还是小型企业,都希望能够更好地管理这些关系并提高业务效率。这时候就轮到我们的“老朋友”——…...

Spingboot整合Netty,简单示例
Netty介绍在文章末尾 Netty介绍 项目背景 传统socket通信,有需要自身管理整个状态,业务繁杂等问题。 pom.xml <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.117.F…...

grafana新增email告警
选择一个面板 比如cpu 新增一个临界点表达式 input选A 就是A的值达到某个临界点 触发告警 我这边IS ABOVE0.15就是cpu大于0.15%就触发报警,这个值怎么填看指标的值显示 这里要设置一下报警条件 这边随便配置下 配置标签和通知,选择你的邮件 看下告警…...

Github 2025-01-20 开源项目周报 Top15
根据Github Trendings的统计,本周(2025-01-20统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10Rust项目2TypeScript项目1C++项目1Jupyter Notebook项目1Go项目1Tabby: 自托管的AI编码助手 创建周期:310 天开发语言:Rust协议类…...

【Rabbitmq】Rabbitmq高级特性-发送者可靠性
Rabbitmq发送者可靠性 发送者重连发送者确认1.开启确认机制2.ReturnCallback3.ConfirmCallback MQ的可靠性数据持久化交换机持久化队列持久化消息持久化 Lazy Queue 总结其他文章 Rabbitmq提供了两种发送来保证发送者的可靠性,第一种叫发送者重连,第二种…...

K8S中Service详解(一)
Service介绍 在Kubernetes中,Service资源解决了Pod IP地址不固定的问题,提供了一种更稳定和可靠的服务访问方式。以下是Service的一些关键特性和工作原理: Service的稳定性:由于Pod可能会因为故障、重启或扩容而获得新的IP地址&a…...

Effective C++读书笔记——item23(用非成员,非友元函数取代成员函数)
一、主要观点: 在某些情况下,使用 non-member、non-friend 函数来替换 member 函数可以增强封装性和可扩展性,提供更好的软件设计。 二、详细解释: 封装性: 类成员函数的封装性考量:成员函数可以访问类的…...

云原生前端开发:打造现代化高性能的用户体验
引言:前端开发的新风向 在过去的几年中,前端开发领域经历了快速的演变,从早期的静态网页到如今复杂的单页应用(SPA),再到微前端架构和渐进式Web应用(PWA),前端技术一直处…...

循环队列(C语言版)
循环队列(C语言版) 1.简单介绍循环队列2.使用何种结构来实现3.基本结构4.初始化5.判空判满6.向循环队列插入一个元素7.从循环队列中删除一个元素8.获取队头队尾元素9.释放空间10.完整代码 🌟🌟hello,各位读者大大们你们好呀&#…...

考研408笔记之数据结构(五)——图
数据结构(五)——图 1. 图的基本概念 1.1 图的定义 1.2 有向图和无向图 在有向图中,使用圆括号表示一条边,圆括号里元素位置互换没有影响。 在无向图中,使用尖括号表示一条边,尖括号里元素位置互换则表示…...

没有公网IP实现seafile本地IP访问和虚拟局域网IP同时访问和上传文件
前言 Ubuntu 24.04 LTSDocker 安装 seafileOpenWrtTailscale Ubuntu 24.04 LTS 通过 docker desktop 安装 seafile 搭建个人网盘中,已经实现了本地局域网放问Ubuntu IP来访问Seafile,以及通过 Ubuntu 的 Tailscale IP 访问Seafile。但是,文…...