主頁 > 軟體工程 > Git基本使用指南

Git基本使用指南

2020-09-11 02:45:03 軟體工程

一、概述

1.    Git與SVN比較

目前用到最廣泛的版本控制軟體就是SVN和Git,那么這兩者之間有什么不同之處呢?

1)     SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器!

2)     SVN只有一個單一的集中管理的服務器,保存所有檔案的修訂版本,而協同作業的人們都通過客戶端連到這臺服務器,取出最新的檔案或者提交更新,

3)     Git每一個終端都是一個倉庫,客戶端并不只提取最新版本的檔案快照,而是把原始的代碼倉庫完整地鏡像下來,每一次的提取操作,實際上都是一次對代碼倉庫的完整備份,

4)     Git具備強大的分支管理功能,SVN實際上不具備,

 

2.    為什么選擇Git

SVN的優點:

1)     管理方便,邏輯明確,符合一般人思維習慣,

2)     易于管理,集中式服務器更能保證安全性,

3)     代碼一致性高,

SVN的缺點:

1)      提交并非每次都能夠成功,如果有其他人先于你提交,會提示“改動基于過時的版本,先更新再提交”… 諸如此類;

2)     沖突解決是一個提交速度的競賽:手快者,先提交,平安無事;手慢者,后提交,可能遇到麻煩的沖突解決,

Git更適合分布式開發,離線作業,強調個體,任意兩個開發者之間可以很容易的解決沖突,最重要的是Git具備強大的分支管理功能,非常適合產品開發,

 

二、基本操作

1.    獲取幫助

通過git命令可以查看所有命令的介紹

 

  

2.    倉庫的克隆

git獲取倉庫的命令是clone而不是checkout,從這就可以看出Git和SVN的區別,

Git獲取的是整個庫的資訊,可以查看所有日志資訊,

   

3.    提交代碼

在檔案夾下運行commit命令,將檔案提交到本地版本庫,

由于本地倉庫只有你一個人在使用,所以請放心提交,不需要考慮BUG等因素,PUSH時就要小心了,

有些檔案是不需要提交到版本管理的,比如 .vs 檔案夾、bin、obj檔案夾等,應該將其加入忽略串列中,

Git提交時要求輸入關于本次提交的說明,請認真填寫,這樣就不用維護額外的版本修改日志了,對于確實無關緊要的提交,可以團隊約定輸入一個字符,如“#”,

 

    

4.    同步倉庫

同步操作有兩種:

1、 PULL:將遠程服務器代碼同步到本地

2、 PUSH:將本地代碼同步到遠程服務器

具體的操作流程應該如下:

1、        commit的操作應該是頻繁進行的,和遠程庫無關;

2、        執行PULL操作獲取團隊最新代碼;

3、        本地確認編譯成功后PUSH到遠程庫,以便分享個人代碼,PUSH前應該確認個人版本是可以編譯通過的,

模擬一個操作場景:

1)        A用戶早上PULL了最新版本,然后在此版本基礎上進行了一天的開發,下班時進行了PUSH操作,沒有發生任何問題;(應該先PULL再PUSH)

2)        B用戶早上也PULL最新版本,開發了一天,此時B進行PUSH會報錯(本地庫版本和遠程庫不一致),必須先進行PULL獲得最新版本后才能進行PUSH,(PUSH前應保證版本可以編譯)

3)        如果兩個用戶修改了同一個檔案,當B用戶在進行PULL時會進行合并,一般不會發生沖突,A用戶會在下次PULL時獲得合并后的版本,

4)       如果兩個用戶修改了同一個檔案的兩個地方就會引起沖突,

 

5.    解決沖突

版本沖突在兩個用戶修改同一個檔案的同一個位置時發生,修改同一個檔案的不同的位置會自動合并,不會沖突,二進制檔案沒有合并功能,任何同時修改都會沖突,

一個沖突解決的示例:

這是代碼的原始版本:

        static void Main(string[] args)

        {

            Console.WriteLine("Hello");

         

            Console.ReadLine();

        }

A用戶修改后:

        static void Main(string[] args)

        {

            Console.WriteLine("Hello");

            Console.WriteLine("Hello:I'm Good Boy!");

            Console.ReadLine();

        }

B用戶修改后:

        static void Main(string[] args)

        {

            Console.WriteLine("Hello");

            Console.WriteLine("Hello:I'm BAD Boy!");

            Console.ReadLine();

        }

首先A用戶率先進行了commit 和 PUSH,成功,B用戶此時也準備提交,提交前,要進行一次PULL,此時發生沖突:自動合并失敗!

CONFLICT (content): Merge conflict in ConsoleApp1/ConsoleApp1/Program.cs

Automatic merge failed; fix conflicts and then commit the result.

打開沖突檔案,可以看到:

        static void Main(string[] args)

        {

            Console.WriteLine("Hello");

<<<<<<< HEAD

            Console.WriteLine("Hello:I'm BAD Boy!");

=======

            Console.WriteLine("Hello:I'm Good Boy!");

>>>>>>> 129dfb44dd2978700d82493d9fa966e598b85535

            Console.ReadLine();

        }

    }

可以看到沖突內容包含在<<<<<<<與>>>>>>>之間,通過======隔開,前面是本地版本,后面是遠程版本,

處理辦法:直接修改這個檔案,然后commit、PULL、PUSH即可,

還有一種沖突是版本庫洗掉了一個檔案,本地還進行了修改,這也形成沖突,

AA.txt deleted in 777b20bb5a04b3c3489318c5e7d6723d5d38d50f and modified in HEAD. Version HEAD of DOC/AA.txt left in tree.

處理辦法:先將沖突檔案移開,commit后再PULL就可以成功,如果還需要這個檔案,再重新commit即可,

 

三、進階操作

1.    版本標記

為了合并、回退等操作方便,我們會對重要版本進行標記,在log界面找到指定版本,右鍵選擇:“create tag at this version…”,

 

2.    恢復誤洗掉的檔案

如果檔案(或檔案夾)被誤洗掉,并且已經清慷訓收站,可以從本地版本庫取得最新提交的檔案,注意:只有提交過的版本才能恢復,沒有提交的內容是不可能找回的,所以要經常提交,

首先通過日志找到洗掉之前的某個版本,在其檔案上右鍵選擇“Revert to this version”即可,對于不想要的檔案,如果想恢復到之前版本,也可以通過這個方法處理,

   

3.    獲取指定版本庫

可能近期寫的代碼一團糟,已經無法走上正軌了,希望恢復到某個穩定的版本重新開發,這就需要重置版本,首先在日志視窗找到要恢復的點,右鍵選擇:”reset XXX to this version…”

重置型別選擇“Hard”:

  

Hard表示強制恢復到指定版本,Mixed表示保留修改的檔案,

如果在回退前沒有PUSH過版本,回退后需要PUSH的話直接PUSH就可以了,如果回退的版本早于最后一次PUSH的版本,則需要進行強制PUSH(Hard),

需要說明的是,遠程版本回退應該是一個集體行為,不存在專案組某個人進行版本回退,但其他人繼續使用當前版本的情況,回退點之后的版本是要拋棄掉的,

 

四、分支管理

1.    分支管理概述

一般來說主線版本(master)是不會用來開發的,只用來進行版本發布,如果一個專案采用master單線版本進行開發,建議不要采用Git進行版本管理,采用SVN會更加方便一點,

下面介紹一下版本分支管理的主要流程與意圖:

某公司1號發布了產品版本V1.0,15號開發人員在開發V1.1程序中接到客戶反饋,發現重大BUG需要緊急修復,假設采用單分支開發,就必須在當前分支進行修復并發布,造成的問題是本次發布的版本包含未經驗證的V1.1版本的內容,

正確的做法應該是:master主分支發布V1.0版本后,創建分支V1.1進行下一個版本開發,當收到用戶BUG反饋時,創建V1.0_DEBUG分支進行修復,并發布,當V1.1版本開發完成并驗證通過后,將V1.1分支合并到master分支,同時合并V1.0_DEBUG分支修復的BUG,

版本合并后,繼續創建V1.2版本進行下一個版本開發,V1.1版本發現的BUG可以繼續在原來V1.1分支上進行修復,V1.0_DEBUG版本可以不用繼續維護了,之前發出的版本如果發現問題,可以在V1.1版本進行修改,并將客戶版本升級到V1.1 ,

 

2.    創建分支

一般通過Git管理平臺創建分支,并為分支設定權限,也可以在本地創建分支,然后Push到遠程服務器,如果要在某個時間點創建分支,在日志視窗找到指定的時間點,右鍵選擇“Create Branch at this version…”即可,本地創建分支后,需要切換到該分支并執行PUSH操作才能將分支同步到服務器,

 

3.    在某分支上進行開發

在固定的某個分支上進行開發,參照本文第二、第三部分的描述即可,本地克隆了版本庫之后,立即切換到開發分支,第一次切換時會在本地建立相同名稱的本地分支,

 

4.    分支的合并

通過Fetch命令獲取其他分支內容,Fetch命令把遠程服務器上所有版本同步到本地,但不做進一步操作,

通過Merge命令進行版本合并,合并時需要選擇對方分支的名稱,

 

  

5.    Fetch與Pull的區別

Pull命令相當于 Fetch + Merge ,就是把遠程庫同步到本地并自動進行合并,如果要合并其他分支,Pull時需要選擇其他遠程分支的名稱,

   

采用PULL或Fetch + Merge沒有本質區別,唯一的區別就是在進行分支合并時Fetch后可以先觀察一些修改的內容在進行合并,建議在同一個分支作業時就采用Pull,在分支之間進行合并時,采用Fetch + Merge,

 

6.    分支沖突

合并版本后,對所有沖突進行手動修改,修改完成后Commit、PUSH即可,

需要注意幾點:

1、 永遠以master分支為發布分支;

2、 master會合并develop和fixbug版本,develop也會合并fixbug版本,不要有其他方向的合并;

3、 master版本合并其他版本后,通過新建分支的方式繼續開發,原來其他分支可以洗掉掉,

4、 如果develop合并fixbug時有沖突,master在合并develop和fixbug時可能任然會沖突,如果develop版本已經合并了所有fixbug,那么master版本在合并develop后可以不用重復合并fixbug,

 

五、Git版本管理最佳實踐

以下是一個常見的版本管理的流程:

 

  具體流程描述如下:

1)       首先建立版本庫,自動創建master版本,在master版本上持續開發,直到發布V1.0版本;

2)       V1.0版本發布后同時面臨兩個任務:V1.1版本開發和V1.0版本的Bug修復,此時創建V1.1_develop分支和V1.0_bugfix兩個分支,相關的開發團隊應該立即Fetch庫后Switch到各自的庫上開展作業;

3)       新版本V1.1_develop研發完成并驗證后,合并到master庫,同時master庫合并V1.0_bugfix分支,經驗證后發布V1.1版本;

4)       洗掉V1.1_develop和V1.0_bugfix分支;

5)       創建新分支,回圈以上程序,

 

需要注意幾點:

1)        如果更嚴謹一些的話,應該還要具備測驗分支,測驗分支從develop分支創建,測驗通過后合并到主分支,

2)        以上第三個程序的操作,可以更積極一點,master版本可以更頻繁地合并兩個版本以及時處理沖突,develop分支也可以積極合并fixbug分支,但fixbug分支不能合并其他分支,

3)        穩定版本發布后即可洗掉所有臨時分支,

 

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

標籤:其他

上一篇:sonar安裝和使用

下一篇:初識PMP PMBOK初解(指南第一章引論)

標籤雲
其他(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