Git 詳解:從概念,常用命令,版本回退到工作流

本文將從 Git 的核心概念講起,詳細介紹常用命令、各階段版本回退、分支控制以及企業內常見的 Git 工作流。

Git 與 GitHub 簡介

Git 簡介

Git 是一個開源的分布式版本控制系統,由 Linus Torvalds 于 2005 年開發。它與集中式版本控制系統(如 SVN)不同,不需要依賴中央服務器,每個開發者的電腦上都有一個完整的版本庫,使得開發者可以在本地獨立進行代碼的提交、分支創建等操作,大大提高了開發的靈活性和效率。即使在沒有網絡的情況下,開發者也能正常開展工作,只需在有網絡時與遠程倉庫進行同步即可。

GitHub 簡介

GitHub 是一個基于 Git 的代碼托管平臺,它為開發者提供了遠程倉庫托管服務,同時還集成了代碼評審、issue 跟蹤、項目管理等功能,是全球最大的開源社區之一。開發者可以在 GitHub 上創建公共或私有倉庫,與其他開發者共享代碼、協作開發項目。除了托管代碼,GitHub 還為開源項目提供了展示和推廣的平臺,許多知名的開源項目(如muduo,sylar)都托管在 GitHub 上。

環境搭建:Windows 與 Ubuntu 下的 Git 安裝及 SSH 配置

Windows Git 環境搭建(含 SSH 私鑰公鑰配置)

  1. 下載安裝 Git:訪問 Git 官方網站(Git),下載適合 Windows 系統的 Git 安裝包。運行安裝包,按照默認選項一路點擊 “Next” 即可完成安裝。安裝完成后,在開始菜單中找到 “Git Bash”,打開它即表示 Git 安裝成功。

  1. 配置 SSH 密鑰
ssh-keygen -t rsa -C "your_email@example.com"
#example: ssh-keygen -t rsa -C "12345678@qq.com"
    • 打開 Git Bash,輸入以下命令生成 SSH 密鑰對,其中 “your_email@example.com” 替換為你的郵箱地址:
    • 一路按回車鍵,會提示設置密鑰的保存路徑,默認路徑為 “C:/用戶/Administrator/.ssh”,可直接按回車鍵使用默認路徑。
    • 接著會提示設置密碼,可直接按回車鍵不設置密碼,也可根據需要設置密碼。
    • 密鑰生成成功后,在 “C:/用戶/Administrator/.ssh” 目錄下會生成 “id_rsa”(私鑰)和 “id_rsa.pub”(公鑰)兩個文件。
    • 打開 “id_rsa.pub” 文件,復制其中的內容。
    • 登錄 GitHub 或其他 Git 托管平臺,進入個人設置頁面,找到 “SSH and GPG keys” 選項,點擊 “New SSH key”,將復制的公鑰內容粘貼到 “Key” 輸入框中,設置一個標題,然后點擊 “Add SSH key” 完成配置。

Ubuntu Git 環境搭建(含 SSH 私鑰公鑰配置)

  1. 安裝 Git:打開終端,輸入以下命令安裝 Git:
sudo apt update
sudo apt install git

安裝完成后,輸入 “git --version” 命令,若顯示 Git 的版本信息,則表示安裝成功。

  1. 配置 SSH 密鑰
ssh-keygen -t rsa -C "your_email@example.com"
    • 在終端中輸入以下命令生成 SSH 密鑰對:
    • 后續步驟與 Windows 系統下相同,設置密鑰保存路徑和密碼(可默認)。
    • 生成的密鑰文件位于 “~/.ssh” 目錄下,同樣復制 “id_rsa.pub” 文件中的內容,添加到 Git 托管平臺的 SSH 密鑰設置中。

測試連接:

ssh -T git@github.com

核心概念:工作區、暫存區、本地倉庫與遠程倉庫

要熟練使用 Git,首先需要理解它的四個核心概念:工作區、暫存區、本地倉庫和遠程倉庫,以及它們之間的交互關系。

工作區

工作區就是你在電腦上實際操作的項目目錄,你對文件的新增、修改、刪除等操作都是在工作區進行的。例如,你在項目文件夾中新建了一個index.html文件,或者修改了style.css文件的內容,這些操作都發生在工作區。

暫存區

暫存區也叫索引區,它是一個臨時存放文件變更的區域。當你在工作區完成對文件的修改后,需要通過特定的命令(git add <filename>)將這些變更提交到暫存區。暫存區的作用是讓你可以選擇性地將工作區中的部分變更提交到本地倉庫,而不是一次性提交所有變更(想要提交所有變更可以使用:git add .)。你可以把暫存區想象成一個緩沖區,它保存了你下一次要提交到本地倉庫的內容。

本地倉庫

本地倉庫是存儲在你自己電腦上的代碼倉庫,它包含了項目的所有歷史版本和元數據。當你將暫存區的變更提交(git commit -m "提交說明")到本地倉庫后,這些變更就被永久地記錄下來了,你可以隨時查看歷史提交記錄、回滾到之前的版本等。本地倉庫是 Git 版本控制的核心,所有的版本管理操作都是基于本地倉庫進行的。

遠程倉庫

遠程倉庫是托管在網絡服務器上的代碼倉庫,它通常用于團隊協作。團隊成員可以將自己本地倉庫的變更推送到遠程倉庫(git push),也可以從遠程倉庫拉取其他成員的變更(git pull),從而實現代碼的共享和同步。常見的遠程倉庫托管平臺有 GitHub、GitLab、Gitee、GitCode 等。

四者之間的交互

工作區、暫存區、本地倉庫和遠程倉庫之間的交互是 Git 工作流程的核心。具體來說,交互過程如下:

  1. 在工作區對文件進行修改(新增、編輯、刪除等)。
  2. 使用git add命令將工作區中需要提交的變更添加到暫存區,此時暫存區記錄了這些變更。
  3. 使用git commit命令將暫存區的變更提交到本地倉庫,本地倉庫會生成一個新的版本記錄。
  4. 使用git push命令將本地倉庫的變更推送到遠程倉庫,讓其他團隊成員可以獲取這些變更。
  5. 當需要獲取遠程倉庫中其他成員的變更時,使用git pull或git fetch命令將遠程倉庫的變更拉取到本地倉庫,然后合并到工作區。

常用 Git 命令及操作流程

掌握常用的 Git 命令是使用 Git 的基礎,下面介紹一些最常用的命令及其用法,以及完整的操作流程。

初始化與配置

  • git init:在當前目錄初始化一個新的 Git 倉庫,會創建一個隱藏的.git目錄,用于存儲倉庫的元數據。
  • git config --global user.name "Your Name":配置全局的用戶名,提交代碼時會顯示該用戶名。
  • git config --global user.email "your.email@example.com":配置全局的郵箱地址,提交代碼時會關聯該郵箱。

倉庫克隆與基礎查看命令

  • git clone <remote_url>:從遠程倉庫克隆一個倉庫到本地,會在本地創建一個與遠程倉庫同名的目錄,并將倉庫內容下載到該目錄。克隆完成后,本地會生成一個默認的main分支,對應遠程的main分支。
  • git status:查看工作區和暫存區的狀態,顯示哪些文件被修改、哪些文件未被跟蹤等信息。
  • git branch:查看本地所有的分支,當前所在的分支會以*標記。
  • git branch -r:查看遠程倉庫的所有分支。

工作區與暫存區操作

  • git add <file>:將工作區中指定文件的變更提交到暫存區。例如,git add index.html將index.html文件的變更添加到暫存區。
  • git add .:將當前目錄下所有未跟蹤和已修改的文件(除了被忽略的文件)添加到暫存區。

暫存區與本地倉庫操作

  • git commit -m "commit message":將暫存區的變更提交到本地倉庫,并添加提交信息,用于描述本次提交的內容。例如,git commit -m "添加首頁輪播圖功能"。

本地倉庫與遠程倉庫操作

  • git push:將本地倉庫的變更推送到遠程倉庫。在推送前,需要確保本地倉庫與遠程倉庫已關聯,并且當前分支對應遠程的相應分支,例如git push origin main將本地main分支的變更推送到遠程main分支。
  • git pull origin <branch>:從遠程倉庫的指定分支拉取變更,并合并到本地倉庫的對應分支。它相當于git fetch和git merge兩個命令的組合。?
  • git fetch origin <branch>:從遠程倉庫的指定分支拉取變更,但不會自動合并到本地倉庫的分支,需要手動執行git merge命令進行合并。

各個階段代碼回退

在使用 Git 的過程中,難免會出現需要回退代碼的情況,不同階段的回退方式有所不同:

1. 提交暫存區之前(git add 之前)

  • 可以直接在文件中進行修改,丟棄不需要的變更。
  • 也可以使用git checkout -- <filename>命令,用本地倉庫中該文件的最新版本覆蓋工作區的文件,從而丟棄工作區的修改。

2. 已經提交到暫存區(git add 之后,git commit 之前)

  • 使用git reset HEAD <filename>命令,將暫存區中該文件的變更舍棄,此時可以重新對文件進行修改后再提交到暫存區。

3. 已提交到本地倉庫(git commit 之后)

  • 首先使用git log命令查看提交日志,找到想要回退到的提交版本的commit id。
  • 然后使用git reset --hard <commit id>命令,將HEAD指針指向指定的版本。
  • 如果只是想將工作區的某個文件回退到本地倉庫中某個版本的代碼,可以先通過git reset --hard <commit id>修改本地倉庫HEAD指針指向,然后再使用git checkout -- <filename>命令用本地倉庫的文件覆蓋工作區文件。

4. 已提交到遠程倉庫

  • 首先使用git reset --hard <commit id>命令,將本地倉庫回退到想要的提交版本。
  • 此時執行git status會發現本地倉庫分支落后于遠程倉庫分支版本,直接git push無法成功推送,需要使用git push -f命令強制推送,將遠程倉庫的分支也回退到相應版本。需要注意的是,強制推送具有一定的風險,可能會覆蓋其他開發者的提交,在團隊協作中應謹慎使用,最好在推送前與團隊成員溝通。

推送代碼沖突

在合并分支的過程中,當兩個分支對同一個文件的同一部分進行了不同的修改時,就會產生合并沖突。Git 會在沖突的文件中標記出沖突的位置,需要手動解決沖突后再進行提交。解決沖突的步驟如下:?

  1. 執行git merge命令后,如果出現沖突,Git 會提示哪些文件有沖突。?
  2. 打開沖突的文件,會看到類似以下的標記:?
<<<<<<< HEAD?當前分支的內容?=======?要合并的分支的內容?>>>>>>> feature/branch?
  1. 根據實際需求,編輯文件,保留需要的內容,刪除沖突標記和不需要的內容。?
  2. 編輯完成后,使用git add <file>命令將解決沖突后的文件添加到暫存區。?
  3. 使用git commit命令提交合并結果。

分支控制

分支是 Git 中非常強大的功能,它允許你在不影響主分支的情況下進行代碼的開發和測試。通過分支,多個開發者可以同時在不同的分支上進行工作,然后將各自的成果合并到主分支。

本地分支控制

  • git branch:查看本地所有的分支,當前所在的分支會以*標記。?
  • git branch <branch_name>:創建一個新的本地分支,<branch_name>是分支的名稱。例如,git branch feature/login創建一個名為feature/login的分支。?
  • git checkout <branch_name>:切換到指定的本地分支。例如,git checkout feature/login切換到feature/login分支。?
  • git checkout -b <branch_name>:創建并切換到新的本地分支,相當于git branch <branch_name>和git checkout <branch_name>兩個命令的組合。?
  • git merge <branch_name>:將指定的本地分支合并到當前所在的分支。例如,當前在main分支,執行git merge feature/login將feature/login分支的變更合并到main分支。?
  • git branch -d <branch_name>:刪除指定的本地分支,需要注意的是,不能刪除當前所在的分支。如果分支還沒有被合并,需要使用git branch -D <branch_name>強制刪除。

遠程分支相關操作

  • git branch -r:查看遠程倉庫的所有分支。?
  • git push origin <branch_name>:將本地創建的分支推送到遠程倉庫,創建對應的遠程分支。例如,git push origin feature/payment將本地feature/payment分支推送到遠程倉庫,創建遠程feature/payment分支。?
  • git checkout -b <local_branch> origin/<remote_branch>:從遠程分支創建一個本地分支,并切換到該本地分支。例如,git checkout -b feature/search origin/feature/search從遠程feature/search分支創建本地feature/search分支。?
  • git push origin --delete <branch_name>:刪除遠程倉庫的指定分支。例如,git push origin --delete feature/old刪除遠程feature/old分支。?
  • git pull origin <remote_branch>:<local_branch>:將遠程指定分支的變更拉取到本地指定分支。如果本地分支不存在,會自動創建。

Git 實際工作流

在實際的開發工作中,為了保證項目的有序進行,通常會遵循一定的工作流規范。

Git Flow 定義了幾種不同類型的分支,每種分支都有特定的用途:?

  • main分支:也稱為master分支,是存放正式發布版本代碼的分支,始終保持穩定可部署的狀態。只有在發布新版本時,才會將develop分支的代碼合并到main分支。?
  • develop分支:是開發分支,用于集成各個功能分支的代碼,包含了下一個版本將要發布的功能。團隊成員的功能開發完成后,會將代碼合并到develop分支。?
  • feature分支:用于開發新的功能,從develop分支創建,開發完成后合并回develop分支。命名通常以feature/為前綴,例如feature/user-login。?
  • release分支:用于版本發布準備,從develop分支創建。在這個分支上只進行 bug 修復和版本相關的配置修改,不添加新功能。發布完成后,將該分支合并到main分支和develop分支。命名通常以release/為前綴,例如release/v1.0.0。?
  • hotfix分支:用于修復main分支上的緊急 bug,從main分支創建。修復完成后,將該分支合并到main分支和develop分支。命名通常以hotfix/為前綴,例如hotfix/fix-login-error。?

Git Flow 的工作流程?

  1. 從main分支創建develop分支,團隊成員基于develop分支進行開發。?
  2. 當需要開發新功能時,從develop分支創建feature分支,開發者在feature分支上進行功能開發。?
  3. 功能開發完成后,通過代碼評審,將feature分支合并回develop分支,并刪除feature分支。?
  4. 當develop分支積累了足夠多的功能,準備發布新版本時,從develop分支創建release分支。?
  5. 在release分支上進行測試和 bug 修復,確保版本的穩定性。?
  6. 版本測試通過后,將release分支合并到main分支和develop分支,并在main分支上打上版本標簽(例如v1.0.0),然后刪除release分支。?
  7. 如果main分支上的正式版本出現緊急 bug,從main分支創建hotfix分支進行修復。?
  8. 修復完成后,將hotfix分支合并到main分支和develop分支,并在main分支上打上新的版本標簽(例如v1.0.1),然后刪除hotfix分支。?

通過遵循 Git Flow 工作流,團隊可以有條不紊地進行開發、測試和發布,減少代碼沖突和版本管理的混亂,提高開發效率和代碼質量。

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

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

相關文章

CMSIS(Cortex Microcontroller Software Interface Standard)ARM公司為 Cortex-M 系列處理器

CMSIS&#xff08;Cortex Microcontroller Software Interface Standard&#xff09;是ARM公司為 Cortex-M 系列處理器&#xff08;如 M0/M3/M4/M7/M23/M33 等&#xff09;定義的一套硬件抽象層標準&#xff0c;旨在簡化嵌入式開發&#xff0c;提高代碼的可移植性和復用性。 核…

[特殊字符] 掃描式處理:Python 自動提取 PDF 中關鍵詞相關表格并導出為 Excel

本文演示如何利用 pdfplumber 批量處理指定文件夾下 PDF 文檔&#xff1a;定位關鍵詞&#xff08;如“主要會計數據”&#xff09;出現的頁碼及下一頁&#xff0c;提取其中的表格并保存為獨立 Excel 文件。適用于財務報告、審計表格、統計報表等場景。 1?? 第一步&#xff1a…

python3的返回值能返回多個嗎?

在Python中&#xff0c;函數可以通過返回一個元組&#xff08;tuple&#xff09; 來間接實現返回多個值的效果。以下是具體說明&#xff1a; 實現方式&#xff1a;直接返回逗號分隔的值 Python會自動將這些值打包成一個元組&#xff1a; def multiple_return():a 1b "he…

UE5 Secondary Materials

首先放入材質A材質B放入Secondary Materials兩個效果就能融合到一起了動態設置secondary material

AUTOSAR進階圖解==>AUTOSAR_SWS_FlashTest

AUTOSAR Flash Test模塊詳解與分析 基于AUTOSAR標準的Flash Test模塊架構、功能與應用分析目錄 1. Flash Test模塊概述 1.1 模塊作用與功能1.2 適用范圍 2. Flash Test模塊架構 2.1 模塊位置2.2 組件關系 3. 狀態管理 3.1 狀態定義3.2 狀態轉換 4. 后臺測試執行流程 4.1 測試間…

msf復現永恒之藍

永恒之藍&#xff08;EternalBlue&#xff09;是利用 Windows 系統的 SMB 協議漏洞&#xff08;MS17-010&#xff09;來獲取系統最高權限的漏洞&#xff0c;利用 Metasploit 框架&#xff08;MSF&#xff09;復現該漏洞是一個復雜且具有一定風險的操作&#xff0c;必須在合法合…

格密碼--LWE,DLWE和ss-LWE

格密碼–LWE&#xff0c;DLWE和ss-LWE 0.數學符號數學符號含義備注Zq\mathbb{Z}_qZq?模qqq的整數集合&#xff0c;即{0,1,2,...,q?1}\{0,1,2,...,q-1\}{0,1,2,...,q?1}用于定義LWE、DLWE、ss-LWE等問題中矩陣和向量的元素取值范圍&#xff0c;是基礎整數環x∈RSx \in_R Sx∈…

【閉包】前端的“保護神”——閉包詳解+底層原理

目錄 一、閉包是什么&#xff1f;概念 二、閉包為什么存在&#xff1f;作用 1. 創建私有變量 2. 實現數據封裝與信息隱藏 3. 模擬私有方法 4. 保存函數執行時的狀態 5. 回調函數和事件處理 6. 模塊化編程 7. 懶加載與延遲執行 三、閉包怎么用&#xff1f;實踐業務場景 …

算法學習筆記:19.牛頓迭代法——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

牛頓迭代法&#xff08;Newtons Method&#xff09;是一種強大的數值計算方法&#xff0c;由英國數學家艾薩克?牛頓提出。它通過不斷迭代逼近方程的根&#xff0c;具有收斂速度快、適用范圍廣的特點&#xff0c;在科學計算、工程模擬、計算機圖形學等領域有著廣泛應用。牛頓迭…

小白學Python,操作文件和文件夾

目錄 前言 一、操作文件路徑 1.獲取當前路徑 2.創建文件夾 &#xff08;1&#xff09;mkdir()函數 &#xff08;2&#xff09;makedirs() 函數 3.拼接路徑 4.跳轉路徑 5.判斷相對路徑和絕對路徑 6.獲取文件路徑和文件名 二、操作文件和文件夾 1.查詢文件大小 2.刪除…

015_引用功能與信息溯源

引用功能與信息溯源 目錄 引用功能概述支持的模型引用類型API使用方法引用格式應用場景最佳實踐 引用功能概述 什么是引用功能 Claude的引用功能允許在回答基于文檔的問題時提供詳細的信息來源引用&#xff0c;幫助用戶追蹤和驗證信息的準確性。這個功能特別適用于需要高可…

ROS2中的QoS(Quality of Service)詳解

ROS2中的QoS&#xff08;Quality of Service&#xff09;詳解1. 主要QoS參數2. 為什么需要設置QoS3. QoS兼容性規則4. 選擇QoS策略的建議5. 調試QoS問題的方法6. 踩坑&#xff1a;訂閱話題沒有輸出可能的原因&#xff1a;調試方法QoS是ROS2中用于控制通信質量和行為的機制。它定…

Cursor三大核心AI功能

一&#xff1a;Tab鍵&#xff1a;智能小助手 1.1 單行/多行代碼補全 在代碼中寫出要實現的功能&#xff0c;第一次按Tab生成代碼&#xff0c;第二次按Tab接受代碼。1.2 智能代碼重寫 對已有代碼重新編寫。 寫個注釋告訴AI重構方法&#xff0c;然后鼠標點到方法內部&#xff0c;…

cesium添加原生MVT矢量瓦片方案

項目中需要基于cesium接入mvt格式的服務并支持屬性拾取查詢&#xff0c;通過一系列預研測試&#xff0c;最后選擇cesium-mvt-imagery-provider開源插件完成&#xff0c;關鍵源碼信息如下&#xff1a; npm i cesium cesium-mvt-imagery-provider //安裝依賴包// 加載圖層import…

AI金融風控:識別欺詐,量化風險的新利器

AI金融風控&#xff1a;識別欺詐&#xff0c;量化風險的新利器深度學習算法穿透海量交易數據&#xff0c;92.5%的不良貸款識別率宣告了金融風險防控新時代的來臨。深圳桑達銀絡科技有限公司在2025年6月申請的“基于人工智能的金融交易反欺詐系統”專利&#xff0c;揭示了金融風…

【unitrix】 5.0 第二套類型級二進制數基本結構體(types2.rs)

一、源碼 這是一個使用 Rust 類型系統實現類型級(type-level)二進制數的設計。 //! 類型級二進制數表示方案&#xff08;第二套方案&#xff09; //! //! 使用嵌套泛型結構體表示二進制數&#xff0c;支持整數和小數表示。use crate::sealed::Sealed;/// 類型級二進制數結構體 …

DAY01:【ML 第一彈】機器學習概述

一、三大概念 1.1 人工智能&#xff08;AI&#xff09; Artificial Intelligence 人工智能AI is the field that studies the synthesis and analysis of computational agents that act intelligently 1.2 機器學習&#xff08;ML&#xff09; Machine Learning 機器學習Fi…

AGX Xavier 搭建360環視教程【一、先確認方案】

設備默認自帶 NVIDIA 硬件編解碼能力&#xff08;NVDEC/NVENC&#xff09;&#xff0c;但是需要你在 OpenCV 和 FFmpeg 里正確啟用 調通 GStreamer 或 nvmpi&#xff0c;才真正能用起來&#xff01;這里的硬解碼是核心&#xff1a;Jetson 平臺的硬解碼&#xff0c;要么走 GStr…

服務器怎么跑Python項目?

在服務器上運行 Python 項目通常涉及 環境配置、依賴安裝、項目部署 和 進程管理。以下是詳細步驟&#xff1a;1. 連接服務器確保你能通過 SSH 訪問服務器&#xff1a;ssh usernameyour_server_ip&#xff08;如果是本地測試&#xff0c;可跳過這一步&#xff09;2. 安裝 Pytho…

【軟件設計師】

UML 類圖中的關系用例圖中的關系 關系例子類圖用例圖順序圖 概念示例通信圖活動圖泳道圖狀態圖