振南技术干货集:研发版本乱到“妈不认”? Git!(2)

news2024/12/25 23:57:14

注解目录

1、关于 Git

1.1Git 今生

(Git 和 Linux 的生父都是 Linus,振南给你讲讲当初关于 Git 的爱恨情愁,其背后其实是开源与闭源两左阵营的明争暗斗。)

1.2Git的爆发

(Git 超越时代的分布式思想。振南再给你讲讲旧金山三个年轻人创办 GitHub,打败Google,逆袭上位的创业故事。据说 GitHub 服务器要放到火星去? )

2、用Git代码

2.1Git本地化化使用

(以实例来讲解代码仓库的创建、提交、分支等基础内容。)

2.2 Git 的远端使用

(以实例来讲解仓库的克隆、推送等基础内容。)

2.3代实(Git 绝不会把代码弄丢。一次有惊无险的代码追回经历,根源是对 Git 机制理解不深。)

3、用Git 管理硬件PCB

(对于硬件资源你是如何管理的? final _final _打死不改_final_1.2.zip? 还是用 Git 吧。)

3.1Git的增量

(Git 具体是如何对资源进行管理的? )

3.2 AD 中的Git

(AD 是原生支持 Git 的,让我们把它利用起来。)

3.3PCB 工程的协作开发

(团队协作中的冲突是如何产生的?如何解决冲突? )

2

用 Git管理软件代码

2.1Git本地化化使用


当你在开发一个完全独立的,不需要公开或多人协作的项目时,就可以使用 Git 的本地化仓库。下面振南举例进行说明。

安装好 Git 之后,在要管理的代码工程目录下单击右键,选择 Git Bash,如图 4.4 所示。

然后 git init,这样就创建了一个本地的仓库。对,就是这么简单。创建成功后,可以看到个名为.git 的目录,如图 4.5 所示。

从图中我们可以看到(master),这是当前仓库所处的分支。分支(Branch)是 Git 的一个重要概念。一个仓库可能会有很多分支,其中有一个分支为默认主分支,一般主分支名称为master 或 main。分支可以被创建、拷贝和删除,而各分支之间可以合并。这些是 Git 最最基本的一些操作,请大家深入去理解。

OK,我们现在创建了一个空仓库,而且它有一个主分支 master,如图 4.6 所示。

对,它就是这么空空如也。接下来我们把要进行版本管理的文件添加到仓库中,使用 gitadd 命令,如图 4.7 所示。

只有被添加到仓库里来的文件,才能进入到 git 的版本管理体系中来。一个项目的文件可能会非常多,难道要一个个去 add 吗?如果真是这样,那 Git 就不会有今天的辉煌了。直接


图4.4 代码工程目录下右键选择 Git Bash


图4.5 创建本地的git仓库


图4.6 一个只有一个主分支 master的空仓库


图4.7 向仓库中添加文件以对其进行版本管理

使用 git add.即可。但是这样又出现一个问题,我可能并不想把所有文件都添加到仓库中,比如一些编译的中间文件.obi..o 等,因为对这些文件进行版本管理毫无意义,而且还会使仓库越来越臃肿。为什么会越来越臃肿?往后看。

为了解决这个问题,git 提供了.gitignore 这个文件,我们可以把不想加入到仓库中的文件弓到此文件中,比如 *.obi。这样我们执行 git add.的时候,git 就会自动为我们忽略这些文件。

OK.现在我们将这个目录下的所有文件都加入到仓库中,如图 4.8 所示。


图4.8 向仓库中添加所有文件

如果文件比较多,这个操作可能会比较花时间接下来,我们来尝试进行第一次提交 commit,如图 4.9 所示


图4.9 尝试进行第一次提交

git 提示“Please tell me who you are”好吧,那我们用提示中的 git config 命令来设置账户邮箱和用户名,如图 4.10 所示。

再次尝试进行 commit,如图 4.11 所示。

可以看到 git 罗列出了我们前面 add 的所有文件,这说明这些文件确实已经进入到 git 的管理体系中了。在提交的时候,可以通过-m 来添加一些注释,来对此次提交进行一些必要的描述。


图4.10 设置账户邮箱和用户名


图4.11 对代码进行提交

我们可以使用 git log 来查看当前分支曾经的提交历史,如图 4.12 所示


图4.12 通过git log查看当前分支的提交历史

好吧,我们只提交过一次

接下来,我们对文件作一些修改(把 arch_flags.c 文件内容清空),如图 4.13 所示。

然后再提交一次,如图 4.14 所示。

此时,如果我们想看一下上一个版本的代码,该如何操作?仔细观察每一次 commit,git都会生产一个 commit-id(40 个字符),通过它我们可以进入任何一次提交,去查看当时的代码,如图 4.15 所示。

此时,我们再去看一下刚才修改的 arch_flags.c 这个文件,如图 4.16 所示。可以看到,arch_flag.c 文件又恢复了原来的内容,是不是很神奇?这就是 Git 为我们带来的版本管理强大功能的冰山一角。

进入某个 commit 后,可以查看代码,但是并不能修改它,因为每一次 commit 都是一个固定的版本。那如何基于某一个中间 commit 进行后续开发呢? 那我先要问问你为什么会有这种自废武功的操作?你理直气壮地说:“因为我后悔了,我对这个 commit 之后的代码开发不满意,我希望回去重新来!”OKGit 给你后悔药。

我们让代码回滚,如图 4.17 所示。


图4.13 对文件做一些修改


图4.14 对代码再一次提交


图4.15 使用git checkout进入到某一次提交


图4.16 切换commit之后arch_flags.c文件恢复了原来的内容


图4.17 将代码回滚到某一个commit

上图中,先从 commit 的临时分支切回到 master 分支,然后使用 git reset 命令将版本回滚到某个 commit 上。最后,再次 git log 就会发现,第二次提交已经消失了。我们这个时候就可以开始在这颗“后悔药”上继续开发了。

但是你又怎么保证你不会后悔吃了后悔药? 有点作,no 作 no Die,想好再干。OK,Git 满足你,如图 4.18 和图 4.19 所示。


图4.18 从 master分支的某个commit开出一个新的分支test


图4.19 从 master分支的某个commit开出一个新的分支test(示意图)

我们可以从 master 分支的某个 commit 开出一个新的分支,然后在这个新的分支上继续开发。最后再合并到 master 上,如图 4.20~10.22 所示。


图4.20 在test分支上对arch_flags.c文件作一些修改


图4.21 在test分支上对代码进行提交


图4.22 将test分支合并到 master分支上

图 4.22因为清屏的问题,没有截到图。过程是先 checkout master,然后 git merge test。这个时候会提示 arch_flags.c 有冲突,并且自动处理冲突失败(需要手动处理),同时标识变成了(masterlMERGING),说明当前分支正在进行合并。

有人会问:“冲突是怎样产生的? 冲突是什么样的?”原则上来说,在两个分支的同一个文件中,同一行的内容不同,那么就会产生冲突,而且 Git 并不能自动处理,因为它根本不知道该舍谁留谁。

冲突的解决通常需要借助于一些工具,比如 kdiff3 等。我一直在使用 VScode,我也建议大家使用它,因为它的功能实在是太强大了,如图 4.23 示。


图4.23 使用 VScode对冲突进行解决

上面说,冲突的本质是一个去留的问题。仔细观察上图,会发现代码中有一个分割线==-==,它上面是 master 分支当前这一行的内容,下面则是合并的源分支,即 test 分支此行的内容。一个称为 Current Change选择,另一个称为Incoming 你需要在这两者之间做出选择。在冲突的顶端有几个选项Accept Current Change和Accept Incoming Change,我们选择后者。在解决了冲突之后我们对 master分支进行再一次commit,标识中的MERGING就消失了,如图 4.24 所示。


图4.24 对完成 merge的 master分支进行commit

此时,似乎 test 分支已经没有存在的必要了,我们可以将它删除,使用命令 git branch-delete test 。

当然,如果我们发现在 test 分支上于不下去了,又想回到 master 分支,那么你可以直接干掉 test 分支,回归 master。

以上一整套的操作其实映射出几个问题:

(1) 不要轻易地删除分支或回滚,以及其他可能造成数据丢失的行为,三思而行(虽然在git 的体系下,并不会真正的造成丢失,后面会有一个数据拯救追回的实例);

(2) 你应该有一个主分支,比如 master 或 man,并目秉持亚肃的态度,不轻易地直接对其进行改动。并保证主分支上的代码是相对成熟的:

(3) 每开一个子分支一定要知道为什么开它,以及它的使命是什么? 原则上来说,一切子分支都应该为主分支服务。

以上振南只是对 Git 的本地化操作的一些皮毛进行了介绍,我想已经足够大家应付一般的情况了。

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

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

相关文章

开源绘画krita中的笔刷压感开启技巧

一、问题描述 之前用过高漫的绘图板,在krita中没有效果, 原来是因为压感没有开启。方法如下。 二、解决方法 如下图点击笔刷设置按钮,打开 笔刷编辑器,之后如图顺序,从左栏点击笔刷控制属性“大小”,之…

【MySQL基本功系列】第二篇 InnoDB存储引擎的架构设计

通过上一篇文章,我们简要了解了MySQL的运行逻辑,从用户请求到最终将数据写入磁盘的整个过程。当数据写入磁盘时,存储引擎扮演着关键的角色,它负责实际的数据存储和检索。在MySQL中,有多个存储引擎可供选择,…

51单片机PCF8591数字电压表LCD1602液晶显示设计( proteus仿真+程序+设计报告+讲解视频)

51单片机PCF8591数字电压表LCD1602液晶设计 ( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0060 51单片机PCF8591数字电压表LCD1602液晶设计 1.主要功能&a…

Python高级语法----Python装饰器的艺术

文章目录 装饰器基础示例代码:执行结果:参数化装饰器示例代码:执行结果:类装饰器示例代码:执行结果:装饰器的堆栈示例代码:执行结果:在Python中,装饰器是一种非常强大的特性,允许开发人员以一种干净、可读性强的方式修改或增强函数和方法。以下是一个关于Python装饰器…

如何使用安卓手机数据恢复软件从安卓手机恢复数据

在 Android 上丢失数据并不是世界末日。拿起您的设备,利用最好的 Android 数据恢复软件来恢复手机内存或 SD 卡中的文件、通话记录、消息、联系人、照片、视频等。 在使用 Android 手机的过程中,您会体会到数字存储的便利性,它可以保存大量数…

elemenui的Upload上传整合成数组对象

1. 普通直接上传 <el-upload action"" :before-upload"doBeforeUpload"><el-button type"success" size"mini">导入</el-button></el-upload> methods:{doBeforeUpload(file) {let reader new FileReader(…

简单得令人尴尬的FSQ:“四舍五入”超越了VQ-VAE

©PaperWeekly 原创 作者 | 苏剑林 单位 | 月之暗面 研究方向 | NLP、神经网络 正如 “XXX is all you need” 一样&#xff0c;有不少论文都以“简单得令人尴尬”命名&#xff08;An Embarrassingly Simple XXX&#xff09;&#xff0c;但在笔者看来&#xff0c;这些论文…

8种很坑的SQL错误用法

1、LIMIT 语句 分页查询是最常见的场景之一&#xff0c;但也通常也是最容易出问题的地方。例如对于下面简单的语句&#xff0c;一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引&#xff0c;性能迅速提升。 好吧&#xf…

docker 拉取镜像

2.2.1、拉取镜像java:8(jdk1.8) docker pull java:8 2.2.2、拉取镜像mysql:8.2.0 docker pull mysql:8.2.0 2.2.3、拉取镜像redis:7.0.14 docker pull redis:7.0.14 2.2.4、拉取镜像nginx:1.25.3 docker pull nginx:1.25.3 2.2.5、查看镜像 docker images 启动镜像 …

Vatee万腾的科技决策力奇迹:Vatee科技决策力的独特之选

在金融投资的复杂领域中&#xff0c;Vatee万腾以其独特的科技决策力创造了一场真正的奇迹。这不仅是一种引领投资者走向成功的选择&#xff0c;更是一种开启新时代的科技决策奇迹。 Vatee的科技决策力背后蕴藏着强大的智慧和创新。通过大数据分析、智能算法的运用&#xff0c;V…

华为防火墙二层透明模式下双机热备主备备份配置(两端为交换机)

这种模式只能是主备备份模式&#xff0c;不能是负载分担&#xff0c;因为会有环路。 故障切换是&#xff0c;如果主故障&#xff0c;主设备所有接口全都会down状态&#xff0c;然后再up一次&#xff0c;用于改变mac转发表。 FW1 hrp enable hrp interface GigabitEthernet1/0…

【赠书活动】嵌入式虚拟化技术与应用

文章目录 前言 1 背景概述 2 专家推荐 3 本书适合谁&#xff1f; 4 内容简介 5 书籍目录 6 权威作者团队 7 粉丝福利 前言 随着物联网设备急剧增长和万物互联应用迅速发展&#xff0c;虚拟化技术成为嵌入式系统焦点。这反映了信息技术迫切需求更高效、灵活和可靠系统。…

Excel 常用技巧

1: 拼接 公式: C1&B1&A1 如 D CBA 将公式输入目标列之后回车即可得到结果 , 如果有多行需要处理 , 光标选中目标单元格右下角变为 按着左键下拉即可 最后选择转换功能转换为文本即可 2: 时间戳转时间格式 公式: TEXT((B2/10008*3600)/8640070*36519,"yyyy/mm…

100V耐压内置MOS ESOP8 40V输入转5V 2.1A恒压输出

100V耐压内置MOS ESOP8 40V输入转5V 2.1A恒压输出 SC9102 是一款宽电压范围降压型 DC-DC 电源管理芯片&#xff0c;内部集成使能开关控制、基准电源、误差放大器、 过热保护、限流保护、短路保护等功能&#xff0c;非常适合宽电压输入降压使用。 SC9102 零功耗使能控制&…

Transmit :macOS 好用的 Ftp/SFtp 工具

Transmit 是一种功能强大的 FTP/SFTP/WebDAV 客户端软件&#xff0c;是一个 Mac OS X 平台上设计的文件传输软件。它由 Panic&#xff08;一家以软件工具为主的公司&#xff09;开发和维护&#xff0c;是一款非常受欢迎且易于使用的软件&#xff0c;而且被广泛认为是 Mac OS X …

【C++】哈希 Hash(闭散列、开散列介绍及其实现)

一、unordered系列关联式容器 在 C98 中&#xff0c;STL 提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 O(logN)&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&…

ChatGPT显现“ Something went wrong. If this issue persists ...”什么原因?如何解决?

一、报错提示 Something went wrong. If this issue persists please contact us through our help center at help.openai.com. 二、解决方案 一般是代理节点出现问题 ChatGPT退出登录 关闭代理并重新启动代理 切换其他节点 清除浏览器缓存 重新登录ChatGPT 三、其它思路…

模电学习路径--google镜像chatgpt

交流通路实质 列出电路方程1&#xff0c;方程1对时刻t做微分 所得方程1‘ 即为 交流通路 方程1对时刻t做微分&#xff1a;两个不同时刻的方程1相减&#xff0c;并 令两时刻差为 无穷小 微分 改成 差 模电学习路径&#xff1a; 理论 《电路原理》清华大学 于歆杰 朱桂萍 陆文…

使用大型语言模型进行文本摘要

路易斯费尔南多托雷斯 &#x1f4dd; Text Summarization with Large Language Models。通过单击链接&#xff0c;您将能够逐步阅读完整的过程&#xff0c;并与图进行交互。谢谢你&#xff01; 一、介绍 2022 年 11 月 30 日&#xff0c;标志着机器学习历史上的重要篇章。就在这…

jacoco插桩源码,看这一篇就够了

知识储备 众所周知&#xff0c;jacoco的功能主要分成两块&#xff1a; jacoco agentjacoco cli 其中jacoco agent主要用来对业务方服务进行插装&#xff0c;而cli则提供一些工具对插桩数据进行处理&#xff0c;比如dump&#xff0c;merge,report等&#xff0c;今天我们着重通…