【Linux】Linux開發必備:Git版本控制與GDB調試全指南

前言:在Linux開發流程中,版本控制與程序調試是保障項目穩定性和開發效率的兩大核心環節。Git作為當前最主流的分布式版本控制系統,能高效管理代碼迭代、追蹤修改記錄并支持多人協同開發;GDB(GNU調試器)是Linux下調試C/C++程序的利器,可幫助開發者定位代碼邏輯錯誤、跟蹤變量變化,快速排查運行時問題。本文將從實戰角度出發,詳細拆解GIt的核心操作與GBDB的調試技巧。

一、Git:從基礎到實踐的版本控制

1.1為什么需要版本控制?

  • 版本控制的價值:記錄代碼每一次修改(誰改、改了什么、什么時候改),支持一鍵回滾到歷史版本,實現多人并行開發時的代碼同步與沖突解決
  • 對比傳統“復制副本”方式:告別 “項目 - v1.doc”“項目 - 最終版 2.doc” 的混亂命名,用 Git 統一管理版本,減少冗余文件

1.2 Git簡史:從Linux內核開發需求誕生的工具

  • 背景:2005年,Linux內核開發團隊因商業版本控制系統BitKeeper終止授權,由Linus Torvalds主導開發Git
  • 核心設計目標:
    1. 速度快:高效處理超大規模項目(如Linux內核,百萬級代碼量)
    2. 完全分布式:無需依賴中央服務器,本地可完成版本管理,聯網后同步即可
    3. 支持非線性開發:輕松創建、合并分支,滿足多人并行開發需求

1.3Git環境搭建:Linux下的安裝和初始化配置

(1)在Linux安裝Git(以Centos/Ubuntu為例)
  • Centos系統:
     //1.先下載gitsudo yum install git//2.再查看git版本,確認是否下載下來了git --version
  • Ubuntu系統:
sudo apt install git -ygit --version
(2)在github/gitee創建項目(下面以gitee為例)
  • 注冊賬號:按照網站提示寫即可
    在這里插入圖片描述

  • 創建倉庫:

    1. 登錄成功后,進入個人主頁,在右上方?按鈕,點擊新建倉庫
      在這里插入圖片描述

    2. 跳轉到新頁面輸入項目名稱及其他設置:
      在這里插入圖片描述

    3. 創建完后,在創建好的倉庫頁面中復制倉庫鏈接,以備接下來進行下載:
      在這里插入圖片描述

(3)將倉庫克隆到Linux下
  • 創建一個放置代碼的目錄(往后的要提交到遠程倉庫的代碼最好放在這個目錄下
git clone [url]//url就是上一步復制的倉庫鏈接

在這里插入圖片描述

  • Git“三板斧”–提交代碼到遠程倉庫:
操作步驟命令作用示例
1.暫存代碼git add 文件名將修改的文件加入 “暫存區”,標記為待提交狀態暫存單個文件:git add main.c;暫存所有修改:git add .
2.本地提交git commit -m "提交說明"(提交說明一定要有,即使不寫,也要寫上雙引號)將暫存區的修改提交到 “本地倉庫”,并添加說明(必須寫清楚修改內容)git commit -m “修復main函數中的邏輯錯誤,添加參數校驗”
3.遠程同步git push將本地倉庫的提交同步到遠程 Gitee 倉庫執行后輸入 Gitee用戶名和密碼
(4)首次使用配置:設置用戶信息(關鍵!!!)

Git需要知道提交者的姓名和郵箱,用于標記每一次代碼的歸屬,配置命令如下:

# 全局配置(對當前用戶所有Git倉庫生效) 
git config --global user.name "你的姓名" # 如"Zhang San" 
git config --global user.email "你的郵箱" # 如"zhangsan@example.com" # 查看配置是否生效 
git config --list # 輸出中應包含user.name和user.email的配置

在這里插入圖片描述

(5)常用輔助命令:查看狀態與歷史
  • 查看當前代碼修改狀態:git status(顯示哪些文件被修改、哪些被暫存)
  • 查看提交歷史:git log(顯示所有提交記錄)
  • 拉取遠程倉庫最新代碼:git pull(建議先拉取再提交,避免沖突)

1.4 進階技巧:.gitignore忽略文件與免密提交

(1).gitignore:忽略無需版本控制的文件

有些文件(如編譯生成的.o文件、可執行文件、日志文件)無需納入 Git 管理,可通過創建.gitignore文件指定忽略規則:
1. 在倉庫根目錄創建.gitignore:

       vim .gitignore

2.寫入忽略規則(示例):

     # 忽略所有.o文件 *.o # 忽略可執行文件(如main) main # 忽略日志目錄 log/

在這里插入圖片描述

3.提交.gitignore到倉庫(同代碼提交步驟)

      git add .gitignore git commit -m "添加.gitignore,忽略編譯產物和日志" git push
(2)配置免密提交:避免每次push輸入賬號密碼
方法一:SSH密鑰
  • 步驟一:檢查本地是否已存在SSH密鑰,執行命令:
ls -la ~/.ssh/

若輸入中包括id_rsa(私鑰)和id_rsa.pub(公鑰),即已存在密鑰,直接跳到步驟三;若無,繼續第二步

  • 步驟二:執行以下命令生成RSA類型的SSH密鑰,過程中無需輸入復雜密碼(按3次回車鍵即可)
  ssh-keygen -t rsa -C "你的 Gitee 綁定郵箱" # 替換為你注冊 Gitee 時用的郵箱

輸出示例:
在這里插入圖片描述

  • 步驟三:查看并復制SSH公鑰,執行以下命令
   cat ~/.ssh_rsa.pub/

如下,復制密鑰即可:
在這里插入圖片描述

  • 步驟四:在gitee上配置 SSH公鑰
    1. 登錄Gitee賬號,點擊右上角設置

    2. 在左側菜單找到安全->SSH公鑰,點擊添加公鑰,如下
      在這里插入圖片描述

    3. 點擊確定,并驗證賬號密碼,完成公鑰配置。

  • 步驟五:驗證SSH連接并修改倉庫遠程地址
  1. 執行如下命令:
 ssh -T git@gitee.com

在這里插入圖片描述

  1. 查看當前遠程地址(確認是否是HTTPS格式)
    git remote -v

若輸出含https://gitee.com/...,不包括你的用戶名和倉庫名,需要進行下一步修改;

  1. 修改遠程地址為SSH格式:
    git remote set-url origin git@gitee.com:你的用戶名/你的倉庫名.git 
  1. 驗證修改結果:
    git remote -v

輸出如下效果即成功:
在這里插入圖片描述

  • 步驟六:測試免密碼提交
    執行git push提交代碼,此時無需輸入賬號密碼,直接完成同步(首次使用SSH可能需要確認密鑰,后續永久免密)

在這里插入圖片描述

方法二:系統配置
  • 步驟一:在根目錄創建文件.git-credentials,并進入文件,輸入內容plaintext https://{username}:{password}@github.com
cd ~ 
touch .git-credentials 
vim .git-credentials 
https://{username}:{password}@github.com  //username即用戶名,password即用戶密碼
  • 步驟二:在終端輸入以下命令
git config --global credential.helper store
  • 步驟三:打開~/.gitconfig文件,會發現多了一項
[credential] 
helper = store

在這里插入圖片描述

  • 步驟四:測試免密提交,執行git push提交代碼,此時無需輸入賬號密碼,直接完成同步(與法一效果相同)

二、GDB:Linux下的C/C++程序調試利器

2.1調試前準備:編譯時添加-g選項(生成調試信息)

  • 程序的發布方式有兩種,debug模式和release模式,Linux下用gcc/g++編譯程序時,默認是release模式(無調試信息,無法用GDB調試),需添加-g選項開啟debug模式:
//編譯test1.c,生成帶調試信息的可執行文件test1
gcc test1.c -o test1 -g//查看調試信息
gdb test1

在這里插入圖片描述

2.2 GDB基礎操作:啟動、退出與核心調試命令

(1)啟動與退出GDB
  • 啟動GDB:gdb 可執行文件名(如上圖),進入GDB交互頁面(提示符為gdb
  • 退出GDB:輸入quit或ctrl+d
(2)GDB基礎命令
命令作用樣例
list(l) 行號或函數名或文件名:行號顯示源代碼,從上次位置開始列出n行或指定函數的源代碼或指定文件的源代碼list 10或mian或test1.c:2
run?從程序開始連續執行run?
next(n)單步執行,不進入函數內部next(n)
step(s)單步執行,且進入函數內部step(s)
break(b) 文件名:(可省略)行號或函數名在指定行數設置斷點或在函數開頭設置斷點break test1.c:10或main
info(i) break(b)/breakpoints查看當前所有斷點信息/斷點列表info b/breakpoints
info(i) locals查看當前棧的局部信息(查看臨時變量)info locals
finish執行到當前函數返回,然后停止finish
print§ 表達式/變量打印表達式的值/指定給變量的值print a+b/x
set var 變量=值修改變量的值set var i=10
delete(d) breakpoints -/序號n(可省略)刪除所有斷點/刪除序號為n的斷點d breakpoints 1
disable/enable breakpoints禁用/啟用所有斷點disable/enable breakpoints
display 變量名跟蹤顯示指定變量的值(每次停止)display x
undisplay 編號取消對指定編號變量的跟蹤undisplay x
backtrace(bt)查看當前執行棧的各級函數條用及參數bt
quit(q)退出GDB調試器q

2.3 GDB進階技巧:監視變量、條件斷點與棧幀查看

示例代碼sum.c:

#include <stdio.h>// 求和函數:計算s到e的累加和
int Sum(int s, int e) {int result = 0;for (int i = s; i <= e; i++) {result += i;}return result;
}int main() {int start = 1;int end = 100;int total = Sum(start, end);printf("1到100的和:%d\n", total);return 0;
}
(1)watch:監視變量的變化(變量修改時自動斷點)

示例:
在這里插入圖片描述

(2)條件斷點:滿足特定條件才觸發斷點

當循環次數較多(如100次),只想在某一次循環(如i=50)時斷點,用條件斷點:

  • 方式一:新增斷點時直接加條件:b 行號 if 條件
(gdb) b 6 if i == 50 # 在第6行(result += i)設斷點,僅當i=50時觸發 
Breakpoint 3 at 0x40052a: file sum.c, line 6.
  • 方式二:給已有斷點追加條件:condition 斷點編號 條件
(gdb) b 6 # 先設普通斷點(編號假設為3) 
(gdb) condition 3 i == 50 # 給3號斷點加條件 
(gdb) info b # 查看斷點,會顯示“stop only if i == 50”

在這里插入圖片描述

(3)棧幀查看:bt 與info locals 定位函數調用鏈

當程序崩潰或執行到深層函數時,用bt(backtrace)查看函數調用棧,用info locals查看當前函數的局部變量:

在這里插入圖片描述

2.4 優化調試體驗:安裝cgdb(代碼分屏的GDB)

默認 GDB 為純命令行界面,無法同時顯示代碼和調試命令,cgdb是 GDB 的增強工具,支持 “代碼分屏”:

  • 安裝:(centos/Ubuntu)
#Centos
sudo yum install cgdb -y#Ubuntu
sudo apt install cgdb -y
  • 使用:cgdb 可執行文件名(如cgdb sum),界面分為上下兩部分:上半部分顯示源代碼,下半部分顯示GDB命令行
  • 快捷鍵:按ESC切換到代碼區(可用方向鍵滾動代碼),按i切換回命令行
    效果如下:
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97838.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現 TypeScript 內置工具類型(源碼解析與實現)

目標讀者&#xff1a;已經熟悉 TypeScript 基礎語法、泛型、條件類型的同學。本文按常見工具類型的分類與順序實現并解釋 Partial、Required、Readonly、Pick、Omit、Record、Exclude、Extract、NonNullable、ReturnType、Parameters、ConstructorParameters、InstanceType、Th…

Spring Boot + Nacos 配置中心示例工程

1?? 工程結構 nacos-demo├── pom.xml└── src├── main│ ├── java│ │ └── com.example.nacosdemo│ │ ├── NacosDemoApplication.java│ │ ├── config│ │ │ └── AppProperties.java│ │ └── cont…

(二)文件管理-基礎命令-pwd命令的使用

文章目錄1. 命令格式2. 基本用法3. 高級用法4. 注意事項1. 命令格式 pwd [OPTION]...[OPTION]: 可選選項&#xff0c;用于改變命令的默認行為。最主要的兩個選項是 -L 和 -P。它不需要任何參數&#xff08;如文件名或目錄名&#xff09; 2. 基本用法 用法&#xff1a;pwd 是…

Leetcode_202.快樂數_三種方法解決(普通方法解決,哈希表解決,循環鏈表的性質解決_快慢指針)

目錄第一種方法&#xff1a;暴力解法暴力ac代碼&#xff1a;第二種方法&#xff1a;哈希表哈希表ac代碼:第三種方法&#xff1a;根據循環鏈表的性質(快慢指針)第一種方法&#xff1a;暴力解法 最暴力的思路就是直接使用循環往下一直計算&#xff0c;這樣特別浪費時間&#xff…

代碼隨想錄刷題Day48

這次博客主要是對做過的關于二叉樹系列的題目進行整理和分類。二叉樹&#xff0c;要處理整個樹&#xff0c;一般少不了遍歷。遍歷主要可以分為&#xff1a;遞歸系列、層序遍歷。如果不遍歷的話&#xff0c;那就是處理特殊的樹了&#xff0c;比如完全二叉樹。遞歸系列基本的遞歸…

汽車工裝結構件3D掃描尺寸測量公差比對-中科米堆CASAIM

汽車制造過程中&#xff0c;工裝結構件的尺寸精度對整車裝配質量和生產進度有重要影響。傳統測量工具如卡尺和三坐標測量機采用接觸式工作方式&#xff0c;檢測過程耗時較長&#xff0c;對于具有復雜曲面特征的工件&#xff0c;難以全面獲取尺寸數據。激光三維掃描技術改變了傳…

Docker Pull 代理配置方法

本文介紹通過網絡代理加速Docker鏡像拉取的方法。 配置方法 當執行docker pull從Docker Hub 拉取鏡像時&#xff0c;其網絡連接由守護進程docker daemon進行維護。 要修改其代理設置&#xff0c;可配置其systemd服務&#xff0c;步驟如下&#xff1a; &#xff08;1&#xf…

機電裝置:從基礎原理到前沿應用的全方位解析

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 機電裝置的基本概念與發展歷程 機電裝置&#xff08;Mechatronic D…

《SVA斷言系統學習之路》【03】關于布爾表達式

序列中使用的表達式基于其所含變量的采樣值進行評估。表達式評估的結果為布爾值&#xff0c;其解釋方式與過程性if語句條件中的表達式完全相同&#xff1a;若表達式計算結果為X、Z 或 0&#xff0c;則被解釋為假&#xff1b;否則即為真。但是&#xff0c;對可出現在并發斷言中的…

指針高級(2)

6.數組指針#include <stdio.h> int main() {/*練習&#xff1a;利用指針遍歷數組*///1.定義數組int arr[] { 10,20,30,40,50 };int len sizeof(arr) / sizeof(int);//2.獲取數組的指針//實際上獲取的&#xff1a;數組的首地址int* p1 arr;int* p2 &arr[0];printf…

如何高效記單詞之:抓住首字母——以find、fund、fond、font為例

find、fund、fond、font這幾個單詞&#xff0c;你都認識嗎&#xff1f;這幾個單詞&#xff0c;意思大體如下&#xff1a; find v.找到&#xff1b;發現fund n.基金fond a.喜歡的&#xff1b;喜愛的&#xff1b;深情的font n.字體&#xff0c;字型&#xff0c;字形 這幾個單詞在…

Ubuntu下把 SD 卡格式化為 FAT32

在 Ubuntu 下把 SD 卡格式化為 FAT32&#xff0c;按下面做&#xff08;會抹掉整卡數據??&#xff09;&#xff1a; 1) 找到你的 SD 卡設備名 lsblk -p記下整盤設備&#xff0c;比如 /dev/sdb&#xff08;USB 讀卡器常見&#xff09;或 /dev/mmcblk0&#xff08;內置讀卡器&am…

涉私數據安全與可控匿名化利用機制研究(上)

文章目錄前言一、涉私數據的概述及分類&#xff08;一&#xff09;涉私數據的“知情同意原則”&#xff08;二&#xff09;涉私數據的分類二、涉私數據可控匿名化利用機制&#xff08;一&#xff09;數據產品與涉私數據的利用形式&#xff08;二&#xff09;通過可信數據空間受…

Redis 的跳躍表:像商場多層導航系統一樣的有序結構

目錄 一 、從 "超市貨架" 的痛點看跳躍表的價值 1.1、跳躍表與商場導航系統的結構對應 1. 1.1、zskiplistNode&#xff1a;帶導航標記的 "商品"&#xff08;跳躍表節點&#xff09; 1.1.1.1、level []&#xff1a;商品上的多層導航標記 1.1.1.2、back…

小程序點擊之數據綁定

<return /><view class"all-wrap" style"padding-top:{{topHeight}}px;"><view class"my-title">我的收藏</view><scroll-viewclass"collect-list-container"scroll-yscroll-top"{{scrollTop}}"…

數據結構——順序表和單向鏈表(2)

目錄 前言 一、單向鏈表 1、基本概念 2、單向鏈表的設計 &#xff08;1&#xff09;節點設計 &#xff08;2&#xff09;初始化空單向鏈表 &#xff08;3&#xff09;、初始化數據節點 &#xff08;4&#xff09;數據節點 &#xff08;5&#xff09;判斷鏈表是否為空 …

More Effective C++ 條款26:限制某個類所能產生的對象數量

More Effective C 條款26&#xff1a;限制某個類所能產生的對象數量核心思想&#xff1a;通過控制類的實例化過程&#xff0c;限制程序中該類的對象數量&#xff0c;可以防止資源過度使用&#xff0c;確保系統資源合理分配&#xff0c;并實現單例或有限實例模式。 &#x1f680…

CMS系統維護中常見的安全威脅及防護指南!

內容管理系統&#xff08;CMS&#xff09;已成為網站建設的核心工具&#xff0c;但隨之而來的安全風險卻常被低估。超過70%的網站使用CMS構建&#xff0c;而其中近半數曾遭遇安全漏洞威脅。作為運維人員和開發者&#xff0c;了解這些安全威脅并采取相應防護措施至關重要。 一、…

springboot knife4j 接口文檔入門與實戰

Spring Boot3 Knife4j 項目地址https://gitee.com/supervol/loong-springboot-study&#xff08;記得給個start&#xff0c;感謝&#xff09;Knife4j 介紹在國內 Java 開發領域&#xff0c;Knife4j 是一款廣受歡迎的 API 文檔工具&#xff0c;它基于 OpenAPI 規范&#xff0c;在…

Spring Boot 事務失效的八大原因及解決方案詳解

在 Spring Boot 項目開發中&#xff0c;聲明式事務管理通過 Transactional 注解提供了極大的便利。但許多開發者都曾遇到過事務不生效的困擾。本文將詳細分析導致 Spring Boot 事務失效的八大常見情況&#xff0c;并提供相應的解決方案。1. 數據庫引擎不支持事務問題分析&#…