主頁 > 軟體工程 > 代碼管理工具-Git基礎介紹及常用技巧

代碼管理工具-Git基礎介紹及常用技巧

2022-04-28 07:23:57 軟體工程

目錄
  • Git起源
  • 基本概念
  • Branch、HEAD和Commit tree
  • Git分支
    • git merge 和 git rebase 的區別和抉擇
    • 與遠程倉庫的互動
  • 關于一些實際開發場景的問題和解決方式

前言:本文主要介紹git的原理、使用和一些技巧,目的在于使讀者對git的了解不僅僅局限于簡單的使用push、pull命令,而要做到知其然且知其所以然,當然,本文并不會深入去探討諸如git的實作原理之類的深層次東西,畢竟它只是一個代碼管理工具罷了,作為使用者,我們只要達到真正熟練使用的地步就夠了,至于更深層次的東西,諸位有興趣的可以自行學習研究,

另外,本文分支相關圖片取自learngitbranching,這是個用游戲的方式,圖文結合學習git分支的網站,相當nice,推薦大家去完整過一遍,相信對于git的理解會更上一層樓,

Git起源

git是由Linux的作者Linus花兩周時間寫出的分布式版本控制軟體,在這之前,Linux社區使用BitKeeper作為版本控制系統,但是由于社區中有人試圖破解BitKeeper的協議,這惹惱了BitKeeper的東家BitMover公司,于是BitMover決定識訓linux社區的免費使用權,

在這樣的背景下,Linus花了兩周時間寫出了git,在一個月內替換了BitKeeper,作為Linux的版本控制工具,并在后面不斷完善,最終成為了現在代碼版本控制的首選

基本概念

三種作業域:

  • git目錄(git direcdtory):即倉庫(Repository),保存專案中所有版本和相關資訊,是git存放資料和資訊的地方
  • 作業目錄(work directory): 是對應專案的某個版本的檔案集合,對應從 git 目錄中解壓出來的供用戶進行操作和修改的資料和資訊
  • 暫存目錄(staging area):用于記錄下次commit時需要保存的檔案串列

三種檔案狀態:

  • committed:已提交狀態,表示資料檔案已經被保存至本地資料倉庫中,
  • modified:修改狀態,表示檔案已被修改,但是尚未被提交(保存),
  • staged:暫存狀態,表示是被標記了的被修改檔案,在下次提交時會將所有標記過的修改保存,
    另外新增的檔案為untracked file,未在git管理范圍內,需要先通過git add添加到暫存目錄,然后其狀態會變為staged
    git
    如圖所示,git分為遠端和本地,遠程遠程服務器存盤了倉庫資訊,而本地則是三種作業域都有,

Branch、HEAD和Commit tree

本地提交代碼到遠端的一般流程:

  1. git add,將修改保存到暫存區(stage area)
  2. git commit,將暫存區中的檔案推送到本地分支,本地倉庫更新
  3. git push,將本地倉庫的更改推送到遠程倉庫,遠程倉庫更新

可以看到,想要更新代碼,commit是必不可少的,每次commit都會生成一個作業目錄的快照(前提是有修改),在git中,這些commit的快照資料使用樹(tree)結構來管理,稱為提交樹(Commit Tree)或者作業樹(Work Tree),

Git 的分支(Branch),其實本質上僅僅是指向提交物件的可變指標,分支是git的核心所在,因為分支的存在,作業樹才是作業樹而不是作業"線",可以將每個分支看作作業樹的分叉,專案可以在不同分支上并行開發,然后在合適的時機又可以合并在一起,這都是分支的作用,

HEAD表示當前所處提交位置,通常來說,HEAD是指向某個分支的,當然也可以手動切換將HEAD指向作業樹中的任意commit(這種情況稱為HEAD分離),
Branch
圖中一共有c0-c4四個提交,main、bugFix和feature三個分支,三個分支分別指向C1、C3、C4三個提交,HEAD處于分離狀態,指向C2
了解了以上的基礎概念以后,讓我們來探討一下git分支相關內容,

Git分支

之前說了,分支的存在是為了并行開發,每一個分支都會指向一個具體的提交,需要多人協作的專案離不開對分支的操作,
通常來說,新建一個專案時默認分支為master,可以根據需要新建develop、release等分支,

下面介紹一些常見的git分支相關命令

  • git commit,以當前提交為父節點生成新的子提交節點,并且當前HEAD/Branch會指向新生成的節點
  • git branch,單獨使用時查看所有分支,后面加一個branchName表示在當前節點創建名為branchName的新分支,git checkout -b branchName也能達到相同的效果,區別在于后者會將HEAD指向新創建的分支
  • git checkout BRANCH/COMMIT,切換到對應的分支或者提交節點,之前有提過,直接切換到提交節點就是HEAD分離狀態
  • git merge BRANCH/COMMIT,將當前提交節點和指定提交節點合并并生成新的提交節點,新生成的節點有兩個父節點,
  • git rebase BRANCH/COMMIT,將當前分支所在節點及之前的節點中有且在另一分支/節點中所沒有的節點全部按序復制一份到目標分支,然后將當前BRANCH/HEAD移到目標位置,
  • git reset COMMIT.撤銷commit到指定提交,與git branch -f CURRENT_COMMIT COMMIT效果是一樣的,但是這種更改只能在本地體現,是不能同步到遠程的
  • git revert COMMIT,要想撤銷能同步到遠程,就得用到git revert COMMIT,此命令會通過新生成提交節點的方式撤銷指定的提交節點
  • git cherry-pick COMMIT_1 COMMIT_2 ... ,選取指定的一些節點按序rebase到當前分支

git merge 和 git rebase 的區別和抉擇

git rebase:

  • 優點:提交樹呈線性,干凈簡單
  • 缺點:修改了提交樹的歷史

git merge:

  • 優點:提交記錄順序正確,不會造成迷惑
  • 缺點:多分支時顯得看起來很復雜

兩者如何抉擇,該使用哪條命令來合并,這取決于用戶的習慣,如果對提交歷史順序的正確性有要求,就用git merge,否則使用git rebase

與遠程倉庫的互動

通常來說,開發的一般流程是在遠程建立一個倉庫,然后開發人員各自在本地clone倉庫,新建自己的分支進行開發,開發完成后再推送到遠程分支,再合并到主分支,
當我們clone遠程倉庫到本地時,會在本地復制一份倉庫資訊和作業目錄
Clone
注意,本地多了一個origin/main的分支,這個分支叫做遠程分支,它反映了你最近一次操作遠程倉庫的狀態,遠程分支比較特殊,不能像普通分支一樣通過checkout、branch等命令直接操控,必須通過pull、push、fetch等命令與遠端同步,

下面介紹一些常見的與遠程倉庫互動的命令:

  • git clone Repository,將遠程倉庫克隆到本地,可通過git clone -b branchName Repository命令指定克隆的分支,
  • git fetch,下載遠程分支的最新狀態到本地,只會更新本地的遠程分支,不會更改HEAD和本地分支遠程
    有更新
    Clone1
    使用 git fetch后
    Clone2
  • git pull,可以視作 git fetch + git merge 的縮寫,存在下列常見情況,遠程分支有人提交了更新,自己本地也提交了更新,這時候就需要先拉取最新的代碼
    使用git pull,第一步是下載最新分支更改,即git fetch
    ![git pull1](https://img2022.cnblogs.com/blog/1491971/202204/1491971-20220427100530923-1663855047.png
    第二步合并當前分支與遠程分支,即git merge o/main
    git pull2
  • git push,將當前分支的本地更改推送到遠程分支,git push會更新本地的遠程分支,并且將修改同步到遠端對應的分支
    git push1
    使用git push推送
    git push2

關于一些實際開發場景的問題和解決方式

前提:團隊目前使用develop分支作為本地測驗環境,Release分支作為代碼備份,通過手動部署的方式部署到真實環境,也就是說,每次開發完成以后會將develop分支合到release分支,

問題:在某次開發后develop最新提交為C2,但是C2忘了合并到release分支,然后又另外創建了個分支nas開發nas相關功能C3,現在nas已經合并到develop分支,這時候nas相關功能由于存在一些問題,需要回滾,請問這時候應該怎么做?
Condition

解決方案:使用git revert C3回滾
Resolve1

在回滾以后另外新建分支開發新功能C4,之后又想將nas分支的功能重新合并到develop,應該怎么做?
Resolve2

解決方案: git revert C3'
Resolve3

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466056.html

標籤:其他

上一篇:如何在已經設計好的Windows表單上訪問DataGridView屬性

下一篇:代碼管理工具-Git基礎介紹及常用技巧

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more