Linux工具(三)

news2024/11/20 1:20:53

       继Linux工具(一)和Linux工具(二),下面我们就来讲解Linux最后的两个工具,分别是代码托管的版本控制器git和代码调试器gdb。

目录

1.git-版本控制器

从0到1的实现git代码托管

检测并安装git

新建git仓库

将远程仓库克隆到本地

提交代码三板斧-add、commit和push

git log 查看日志信息

仓库开源代表着仓库可以被别人随意篡改吗? 

多人协作中如何保证代码同步?(git pull同步远端和本地仓库)

.gitignore-文件过滤器

2.Linux调试器-gdb使用

gcc/g++编译模式

如何证明gcc/g++ 编译的程序是release版本?  

如何让Linux以debug模式编译代码?

gdb的使用命令

程序显示与运行

断点

单句执行与监视

行动是打败焦虑最好的办法


1.git-版本控制器

      git 是一种分布式版本控制系统,广泛用于软件开发和版本管理。它可以追踪文件和目录的变化,记录每个版本的修改历史,并支持多人协作开发。

从0到1的实现git代码托管

检测并安装git

        首先,我们需要检查自己的环境下是否有git工具,我们可以通过命令  git --version 来查看我们的git的版本,只要能找到就说明我们有git工具,如果没有找到,我们就要安装git工具,安装我们之前也已经讲过,执行命令 sudo yum install -y git  ,然后按提示操作即可。

新建git仓库

我们需要有一个自己的git账户 ,网址:Gitee - 企业级 DevOps 研发效能平台

接着,我们点击上方的加号新建仓库,然后按照需求填写仓库名称等,

这样就可以生成我们的一个空仓库,

接着,我们可以将这个仓库设置为开源,让所有人都可以看到,我们在仓库页面点击管理-> 基本信息->点击开源(注意,空仓库首次开源时必须要更新代码后方可生效)即可,但是还是强烈建议在更新过代码之后再更改为私有

将远程仓库克隆到本地

进入仓库主页,点击克隆/下载 ,我们直接用默认的http模式即可,我们复制这个网址,

接着,我们打开XShell并进入我们对应的普通用户下,输入命令git clone +[复制的网址] ,然后,如果是第一次克隆,就会提示我们输入gitee的账户名和密码,我们就按照注册时用的账户名和密码输入即可(下面的图片没有给出输入账号和密码部分),如果你在上面的操作中就提前将你的仓库开源了,就没有有输入用户名和密码这一个环节了,但是对后续会产生什么影响,这里笔者也不太清楚~~~

这里,我首先建立了一个git目录,然后我想在git目录下将远端的仓库克隆到我们的git目录下,方便以后查找,这里也可以选择不建。

这里可以看到我们远端的仓库已经被克隆到本地目录里面来了,其实,当我们进入仓库目录,输入命令ls -al 查看所有的文件时。我们发现一个叫做  .git的文件,这个文件才是我们真正的本地仓库,在上传代码时,也是将代码传入到 .git,再由 .git将上传的代码同步到远端。

注意,这个 .git文件我们一定不要对其做任何的操作,否则仓库可能会出现问题。

提交代码三板斧-add、commit和push

     如何将我们平时所写的代码提交到远程的仓库中呢?首先,我们需要找到我们对应的需要被提交的代码所在的目录,我们可以直接将保存的代码的目录拷贝到我们的仓库下

首先,我们需要将代码提交到我们本地的仓库,也就是上面我们说的那个 .git目录,我们需要用到add和commit命令:

git add .    //提交当前目录下所有能够提交的文件
//git add processbar  //提交当前目录中特定的某个文件

git commit -m "对该代码的命名,一般不要乱写,因为我们在这里写的日志可以被溯源查看,这个稍后会提到"  //commit命令必须要带这个命名环节,也就是日志

输入命令后,我们可能会遇到一下情况:

这种情况,说明我们没有配置对应的邮箱和用户名,也可能是我们第一次登录验证时使用的不是邮箱登录,或者说我们当时注册gitee账号时不是我们之前输入的登录方式注册的,具体笔者没有尝试过,不过这里我们验证就行,根据上面给我们提示的命令行,我们的邮箱就是gitee账号绑定的主邮箱,而用户名就是个人主页的“@”后面的字符串

我们接着输入下面的两行命令,即可完成配置:

git config --global user.email "添加自己的邮箱"

git config --global user.name "个人用户名"

接着,我们就可以继续提交代码到本地仓库了,

上面的操作,我们只是将我们的代码提交到了本地仓库,在远端仓库是看不到的,我们需要将我们提交的本地的代码同步到远端仓库,也就是我们的最后一个命令:push

git push

然后会提示我们需要再次输入gitee的用户名和密码,我们接着输入一遍即可,这也是阻止他人恶意修改远端仓库代码的途径之一

接着,我们回到我们的gitee对应的仓库页面,刷新页面,就会显示我们新上传的代码了,这里需要注意,如果你想要好看的小绿点的话,那么我们就需要在确认邮箱时保证这个邮箱使我们gitee账户绑定的邮箱才行

然后,为了可以让别人看到,我们可以在这里设置开源了。

git log 查看日志信息

       在我们的仓库开源之后,也就一位置任何人都能访问我们的仓库了,其他人只需要将我们的仓库克隆到他的本地,就能够查看我们的代码提交信息了,比如git log就可以查看仓库主人的代码提交日志,

现在其实是有三个身份,分别是本地仓库,远端仓库和其他访问人员(比如面试官等)

仓库开源代表着仓库可以被别人随意篡改吗? 

        有些人可能会好奇,我把仓库开源了,是不是任何人只要克隆了我的仓库到本地,就一定能修改我自己的代码呢?这个是不一定的,对于开源的仓库,虽然任何人都有了克隆仓库到自己本地的权利,但是其他人将自己修改的代码想要更新同步到我的仓库就必须要有仓库主人的允许,比如,其他人在push阶段会出现验证仓库主任的账号和密码行为,只要其他人不能push,他们再怎么玩都只能在自己的本地仓库上玩,永远影响不到远端仓库。

多人协作中如何保证代码同步?(git pull同步远端和本地仓库)

      多人协作的本质是其他人将同一个人的仓库克隆到各自的本地仓库中,每个人都在这个本地仓库中贡献自己的代码,但是,如何保证多人开发中的代码仓库的内容时同步的呢?比如,张三刚克隆了李四的代码仓库到本地,紧接着李四又在自己的代码仓库中更新提交了一份代码并push同步到了远程仓库,而此时张三并不知情,他此时也想向这个仓库中贡献自己的代码,但是,当张三写完代码并且尝试着push到这个仓库时,就会出现问题,提示我们出现了错误,这是我们就能意识到张三这小子背着我又偷偷更新了代码了,然后我们就需要再次pull将我们本地的仓库再次和朱咱三的远端仓库进行同步之后再进行我们的协作,这样一来,就能够保证团队中的每个人都能实时同步代码到他们的本地仓库中。

.gitignore-文件过滤器

     在我们的本地仓库中有一个 .ignore文件,这个文件在本地起一个类似于“过滤器”的作用,可以拦截特定后缀的文件,在我们上传代码时,就会拦截对应后缀的文件,使其不会被提交到远端仓库,我们也可以打开这个文件看一下,

       像这个文件里面含有的特定后缀的文件,均不会被提交到远端仓库中,我们也可以随意的自己定义,对远端提交仓库的文件类型进行限制,日常我们自己提交代码基本不需要修改该文件,需要修改时,我们可以直接将需要拦截的文件后缀添加到  .gitignore 中即可。

2.Linux调试器-gdb使用

gcc/g++编译模式

        程序的发布方式有两种,debug模式和release模式,Linux下gcc/g++出来的二进制程序,默认是release模式一份代码如果希望被调试,那么这份代码的发布模式必须是debug模式,在开模式下,我们一般都是采用debug版本,方便我们测试程序,完成开发后,我们将程序设置为release版本,交给后续的测试人员再次进行测试,release版本是对debug版本的各种优化,release版本一般就会是用户使用的版本,而测试人员就需要对用户测试人员的版本进行测试,所以,测试人员测试的都是release版本,测试完毕就会将程序以release版本发布到公司对应的服务器上供其他人下载使用,这里一般都会分批上线,也就是先选择一小批用户进行下载,没有发现问题,再逐步开放至全体用户,这就是所谓的灰度上线,和我们日常的听说的游戏内测的概念差不多。

如何证明gcc/g++ 编译的程序是release版本?  

    我们尝试编写如下的代码并运行生成可执行程序,

输入命令  gdb mycode , 

       我们可以发现,gdb 没有找到可以进行调试的debug标志,也就代表这份代码不能被调试,间接证明了Linux默认情况下生成的代码是release版本的。

      当然,我们还有一些更加直接的方式来证明,比如,按我们正常的理解,debug模式下的程序大小一般都会比release模式下大,因为debug模式会给程序某些调试信息,我们可以利用同一份代码,同时编译出debug和release版本的两个不同的可执行程序来比较其大小,这一点比较简单,这里就只给出对应的结果。

      在Linux中,形成的可执行程序有一个确定的格式,ELF格式,里面包含了这个可执行程序的信息,我们可以通过浏览不同编译模式下,其形成的可执行程序的二进制信息,来查看对应的可执行程序中是否有debug信息。

//查看release模式编译的代码的信息中是否含有debug标志,grep管道过滤 ,-i表示忽略大小写
readelf -S mycode-r | grep -i debug  
//查看debug模式编译的代码的信息中是否含有debug标志
readelf -S mycode-g | grep -i debug

如何让Linux以debug模式编译代码?

    我们可以通过在编译指令后面加 -g ,来表示我们想要以debug模式编译代码,像上面的代码,我们可以直接修改makefile文件即可,

下面,我们再次使用gdb来尝试调试新的可执行程序mycode,此时代码就不再显示找不到debug标志了,说明此时代码是debug版本。

gdb的使用命令

程序显示与运行

list(l) (行号):显示当前输入行号(不输入时默认从0开始),接着上次的位置往下列,每次列10行,这里有一个细节,gdb具有自动记录上一次命令和结果的功能,如果我们的程序大于十行,而我们又想让它一次显示完我们的程序,我们可以在第一次输入list命令后直接一直按回车就可以打印完全部程序。

 r或run:运行程序。 

断点

      在vs中,在调试时我们经常会以打断点然后按F5直接将程序运行到断点处停下来供我们调试,那么在gcc/g++中如何利用断点的呢?

break(b) 行号:在某一行设置断点

break(b) 函数名:在某个函数开头设置断点

info break(b):查看断点信息。

       这里的打断点命令还可以分文件进行,也就是说,我们可以通过指定文件来给特定的文件里的某一行打断点,这一点正是适用于多文件编译模式。

delete(d) breakpoints:删除所有断点

delete(d) n:删除序号为n的断点(注意,这里删除断点要根据断点的编号来删除,不能像我们打断点一样删除)

        注:断点的序号在一个调试周期内会一直递增,换句话说,断点编号会一直维持递增状态,不论某个断点是否已经被删除,举个例子,比如我们在一个gdb调试周期内,删除了序号为3的断点,那么此后我们打的断点编号将会是大于3的,这个状态在整个gdb调试周期内都有效,一个gdb调试周期内设置的断点,也会随着该gdb调试周期的结束而自动销毁

disable  :禁用断点

enable  :启用断点

单句执行与监视

n 或 next:单条执行,相当于vs中的逐过程,相当于F10

s或step:进入函数调用,相当于vs中的逐语句,也就是F11

p 变量(&变量):打印变量值或者变量的地址

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪,注意这个命令和删除断点命令相似,需要我们输入对应的变量名对应的编号,该命令才能生效,

until 行号:跳至X行,通常用来跳出一个循环或者函数

finish:执行到当前函数返回,然后停下来等待命令

continue(或c):从当前位置开始一直执行到下一个断点处

bt:查看调用堆栈,函数栈帧信息

set var :修改变量的值

quit(或ctrl+d):退出gdb

       由于调试的场景过多,这里不可能一一介绍完全,所以想要深入学习的话,可以自行去网上搜一下条件断点之类的拓展命令。 

   

      Linux工具篇到这里就暂时告一段落了,后序随着更加深入的学习,我们还会更加深入的学习Linux相关的工具并进行拓展,希望本系列文章可以真正帮助到大家。

行动是打败焦虑最好的办法

     买了一堆书没读,报了一堆课程没上,心中有无数欲望的人,这样的人几乎没有主动做成过一件事,比如养成早起、跑步、阅读的习惯,练就一些技能,或者考个好成绩,有高收入等等。

     行动,是打败焦虑的最好的方法。当你不知道该怎么办的时候,就把手头的每件小事做好,当你不知道怎么开始时,就把离你最近的那件事情做好。

      有时候,坚持了你不想干的事之后,便会得到你想要的东西,自律的苦轻于鸿毛,后悔的痛重于泰山。像每天早睡早起,坚持锻炼,你就已经战胜了大多数的人。你退缩的越多,能让你喘息的空间就越有限,“再见少年拉满弓,不惧岁月不惧风”,你的未来是什么样取决于你现在做什么样的选择。

      

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

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

相关文章

rk3588 香橙派 vncserver连接 图形界面远程登陆

直接使用windows远程连接失败 然后看有用vncserver 进行连接的方案 需要再rk3588板端执行: sudo apt-get install xfce4 sudo apt0get update vncserver vncpasswd配置vnc 密码。不配置只看密码 下载vncserver 后不会自动启动,不会启动 需要执行 vncse…

Spring基础以及核心概念(IoC和DI)

1.Spring是什么 Spring是包含了众多工具方法的IoC容器 2.loC(Inversion of Control )是什么 IoC:控制反转,Spring是一个控制反转容器(控制反转对象的生命周期) Spring是一个loC容器,我们之前学过的List/Map就是数据存储的容器,to…

【1.1】神经网络:关于神经网络的介绍

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 神经网络(随缘更新) ✨特色…

黑马点评-02使用Redis代替session,Redis + token机制实现

Redis代替session session共享问题 每个Tomcat中都有一份属于自己的session,所以多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时可能会导致数据丢失 用户第一次访问1号tomcat并把自己的信息存放session域中, 如果第二次访问到了2号tomcat就无法获取到在1号…

7 航空公司客户价值分析

第7章 航空公司客户价值分析 7.1 了解航空公司现状与客户价值分析7.1.1 了解航空公司现状7.1.2 认识客户价值分析7.1.3 熟悉航空客户价值分析的步骤与流程 7.2 预处理航空客户数据7.2.1 处理数据缺失值与异常值7.2.2 构建航空客户价值分析的关键特征1. RFM模型介绍2. RFM模型结…

Golang--channel+waitGroup控制并发量

文章目录 channelwaitGroup控制并发量前言示例 channelwaitGroup控制并发量 前言 golang的goroutine非常轻量级,同时启动数万协程都没问题。如果不对并发量进行控制,比如同时产生数百万的协程,会压垮服务器通过控制channel缓冲区的大小&…

阿里云服务器支持免费更换公网IP吗?

阿里云服务器支持免费更换公网IP吗?支持!创建6小时以内的云服务器ECS可以免费更换三次公网IP地址,超过6小时的云服务器,可以将公网固定IP地址转成弹性EIP,然后通过换绑EIP的方式来更换IP地址。阿里云服务器网分享阿里云…

3D孪生场景SDK:Viwer 孪生世界

NSDT 编辑器 提供三维场景构建、场景效果设计、场景服务发布全流程工具等,其场景编辑器支持资产管理、灯光设置、骨骼动画等功能;致力于协助资源不足的中小企业及个人快速开发数字孪生场景,帮助企业提高生产力、实现降本增效。 NSDT编辑器简…

SLAM面试笔记(8) — 计算机视觉面试题

目录 问题1:目标检测的算法分类 问题2:卷积神经网络的组成 问题3:输入层的作用 问题4:卷积层作用 问题5:卷积核类型 问题6:11卷积核作用 问题7:卷积核是否越大越好 问题8:棋…

Day-08 基于 Docker安装 Nginx 镜像-负载均衡

1、反向代理后,自然而然就引出了负载均衡,下面简单实现负载均衡的效果; 2、实现该效果需要再添加一个 Nginx ,所以要增加一个文件夹。 /home|---mutou|----nginx|----conf.d|----html|----conf.d2|----html3 1.创建 html3 文件夹, 新建 index…

Qt实现 图片处理器PictureEdit

目录 图片处理器PictureEdit1 创建工具栏2 打开图片3 显示图片4 灰度处理5 颜色反转6 马赛克 图片处理器PictureEdit 创建工程&#xff0c;添加资源文件 1 创建工具栏 widget.h中 #include <QWidget> #include<QPixmap> #include<QFileDialog> #include&l…

3D孪生场景搭建:模拟仿真

前面几期文章介绍如何使用NSDT 编辑器 搭建3D应用场景&#xff0c;本期介绍下孪生场景中一个一个非常重要的功能&#xff1a;模拟仿真。 1、什么是模拟仿真 模拟仿真是一种用于描述、分析和模拟现实世界中系统、过程或事件的计算机模型和程序。仿真通过输入各种参数和条件&am…

雷达电子箔条干扰和雷达诱饵简介

一、JAMMING 利用箔条、角反射器和诱饵进行机械干扰。 1、箔条(Chaff) 箔条是一种雷达干扰,在这种干扰中,飞机或其他目标散布一团薄薄的铝、金属化玻璃纤维或塑料,它们要么作为一组主要目标出现在雷达屏幕上,要么以多次回击淹没屏幕。 图1 箔条 2、箔条的雷达散射截面…

[算法应用]关键路径算法的简单应用

(0)免责声明: 算法和数据结构都是我自己写的,为了提交这次的作业,所以把去年写过的算法重新翻新了一下,数据结构也简单整理了一下,重新放上来了. 整个程序是可以顺利跑通的,同学们可以用代码检测一下自己的结果对不对,切勿抄袭. (真的不想手推关键路径了....真的....不过复习…

2023-10-06 LeetCode每日一题(买卖股票的最佳时机含手续费)

2023-10-06每日一题 一、题目编号 714. 买卖股票的最佳时机含手续费二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&…

C++转换函数

什么是转换函数? C转换函数是一种特殊的成员函数&#xff0c;用于将一个类的对象转换为另一个类型。它是通过在类中定义特定的函数来实现的。 转换函数的用途&#xff1a; 类型转换&#xff1a;转换函数可以将一个类的对象从一种类型转换为另一种类型。这样可以方便地在不同…

前端还不会低代码?快来学习这5个开源的前端低代码项目

GoView GoView是一个开源项目&#xff0c;其技术栈基于Vue3、TypeScript4、Vite2、NaiveUI、ECharts5和Axios。该项目通过Vue组件实现数据中动态刷新渲染&#xff0c;且其内部图表可以自由替换。 项目地址&#xff1a; https://gitee.com/dromara/go-view 以下是GoView开源项目…

【C++设计模式之备忘录模式:行为型】分析及示例

简介 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于保存和恢复对象的状态。备忘录模式通过将对象的状态封装成一个备忘录&#xff08;Memento&#xff09;&#xff0c;并将备忘录保存在一个管理者&#xff08;Caretaker&#xff…

结构化面试 --- 介绍 + 人际关系

目录 一、介绍 1、认识考试 2、认识考官 3、认识对手 4、认识考场 5、认识规则 6、如何备考 二、人际关系 练习题 第一题&#xff08;换岗&#xff09; 第二题&#xff08;办法&#xff09; 第三题&#xff08;相处&#xff09; 第四题 第五题 第六题 …

初级数值计算理论总结

本文用于总结复习与研究生面试 一问&#xff0c;小伙子会不会数值计算啊一答&#xff1a;会二问&#xff1a;哦&#xff0c;讲讲看二答&#xff1a;讲不出来三问&#xff1a;...... 数值求根 二分法Jacobi 迭代法 Jacobi 迭代改进算法&#xff08;事后加速法&#xff09;&#…