1. 程式人生 > >手把手教你玩轉Git

手把手教你玩轉Git

文章已託管到GitHub,大家可以去GitHub檢視下載!並搜尋關注微信公眾號 碼出Offer 領取各種學習資料!

在這裡插入圖片描述

Git應用


一、初識Git

1.1 Git的簡史

同生活中的許多偉大事物一樣,Git 誕生於一個極富紛爭大舉創新的年代。

Linus在1991年建立了開源的Linux,Linux 核心開源專案有著為數眾多的參與者。 絕大多數的 Linux 核心維護工作都花在了提交補丁和儲存歸檔的繁瑣事務上(1991-2002年間)。 到 2002 年,整個專案組開始啟用一個專有的分散式版本控制系統 BitKeeper 來管理和維護程式碼。 到了 2005 年,開發Samba的Andrew試圖破解BitKeeper的協議,隨後開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關係結束,他們收回了 Linux 核心社群免費使用 BitKeeper 的權力。 這就迫使 Linux 開源社群(特別是 Linux 的締造者 Linus Torvalds)基於使用 BitKeeper 時的經驗教訓,Linus僅僅使用了兩週的時間用C寫出了Git,開發出自己的版本系統,一個月之內,Linux系統的原始碼已經由Git管理了。 他們對新的系統制訂了若干目標:

  • 速度
  • 簡單的設計
  • 對非線性開發模式的強力支援(允許成千上萬個並行開發的分支)
  • 完全分散式
  • 有能力高效管理類似 Linux 核心一樣的超大規模專案(速度和資料量)

自誕生於 2005 年以來,Git 日臻成熟完善,在高度易用的同時,仍然保留著初期設定的目標。 它的速度飛快,極其適合管理大專案,有著令人難以置信的非線性分支管理系統。Git迅速成為最流行的分散式版本控制系統,尤其是2008年,GitHub網站上線了,它為開源專案免費提供Git儲存,無數開源專案開始遷移至GitHub。

這時候是不是有很多小夥伴已經被Linus所驚訝到了呢?使用了兩週時間用C寫出了Git!

1.2 Git到底是什麼?

Git是一個開源的分散式版本控制系統,可以有效、高速地處理從很小到非常大的專案版本管理

1.3 什麼是版本控制系統?

版本控制是指對軟體開發過程中各種程式程式碼、配置檔案及說明文件等檔案變更的管理,是軟體配置管理的核心思想之一。

1.3.1 版本控制系統的作用

版本控制最主要的功能就是追蹤檔案的變更。它將什麼時候、什麼人更改了檔案的什麼內容等資訊忠實地了記錄下來。每一次檔案的改變,檔案的版本號都將增加。除了記錄版本變更外,版本控制的另一個重要功能是並行開發。軟體開發往往是多人協同作業,版本控制可以有效地解決版本的同步以及不同開發者之間的開發通訊問題,提高協同開發的效率。並行開發中最常見的不同版本軟體的錯誤(Bug)修正問題也可以通過版本控制中分支與合併的方法有效地解決。

版本控制系統不僅為我們解決了實際開發中多人協同開發的問題,還提供了一些功能:檢入檢出控制 、分支和合並 、歷史記錄

  • 檢入檢出控制:同步控制的實質是版本的檢入檢出控制。檢入就是把軟體配置項從使用者的工作環境存入到軟體配置庫的過程,檢出就是把軟體配置項從軟體配置庫中取出的過程。檢人是檢出的逆過程。同步控制可用來確保由不同的人併發執行的修改不會產生混亂。
  • 分支與合併:版本分支(以一個已有分支的特定版本為起點,但是獨立發展的版本序列)的人工方法就是從主版本——稱為主幹上拷貝一份,並做上標記。在實行了版本控制後,版本的分支也是一份拷貝,這時的拷貝過程和標記動作由版本控制系統完成。版本合併(來自不同分支的兩個版本合併為其中一個分支的新版本)有兩種途徑,一是將版本A的內容附加到版本B中;另一種是合併版本A和版本B的內容,形成新的版本C。
  • 歷史記錄:版本的歷史記錄有助於對軟體配置項進行稽核,有助於追蹤問題的來源。歷史記錄包括版本號、版本修改時間、版本修改者、版本修改描述等最基本的內容,還可以有其他一些輔助性內容,比如版本的檔案大小和讀寫屬性。 如果我們開發中的新版本發現不適合使用者的體驗,這時候就可以找到歷史記錄的響應版本號,回退到歷史記錄版本!

1.4 版本控制系統的分類(瞭解)

常見流行的分散式版本控制管理系統有Git

常見流行的集中式版本控制管理系統有CVS、SVN

網路 操作 併發性 示例
第一代 僅一個檔案 鎖定的 RCS、SCCS
第二代 集中式 多檔案 提交之前合併 CVS、SourceSafe、Subversion、Team Foundation Server
第三代 分散式 變更的集合 合併之前提交 Bazaar、Git、Mercurial

1.5 分散式與集中式

1.5.1 集中式

集中式系統是指由一臺或多臺主計算機組成的中心節點,資料集中儲存於這個中心節點中,並且整個系統的所有業務單元都集中部署在這個中心節點上,系統的所有功能均由其集中處理。

簡單提了集中式的概念,那集中式版本控制也是如此。如圖,我們需要合併版本、更新版本時,是將各個版本上傳伺服器實現集中式合併!

舉例來說,集中式版本控制系統在公司中的使用,需要安裝一個Server(伺服器),然後各個使用版本控制系統的成員安裝客戶端,然後就是客戶端連線伺服器了,只有臉上這個伺服器才能做版本控制,如果連不上那就不行了。

工作流程: 比較熟悉的SVN是集中式的版本控制系統,每次在進行版本控制之前,需要先從中央伺服器(服務端)取出最新的版本,然後開始工作,工作完後推送給中央伺服器。此時的中央伺服器就好比是一個圖書館,如果你要修改一本書,需要先從圖書館借出來,然後回到自己家修改,改完之後,需要在送回到圖書館。

image-20200623145014939
1.5.2 分散式

分散式系統是一個硬體或軟體元件分佈在不同的網路計算機上(本地化儲存),彼此之間僅僅通過訊息傳遞進行通訊和協調的系統。

又一次簡單提了分散式的概念,那分散式版本控制更是如此。如圖,我們需要合併版本、更新版本時,各臺計算機都可以去實現彼此之間合併、更新,不再只依賴於一箇中心節點,為我們開發提供了靈活與便捷!

舉例來說,分散式版本控制系統在公司中的使用與集中式不同,各個成員需要安裝一個Git客戶端,而各個成員之間可以隨時隨地的實現版本控制(比如:兩個人合併後,再與第三個人合併或者小組與小組之間合併進行版本控制),不再依賴於必須連線伺服器才能實現,那麼我們實現了各個小組之間的靈活控制後,最終還是得落到了伺服器的手中。我們需要把各個成員、小組之間的版本控制結果,上傳到伺服器(GitHub)中進行最終合併!

工作流程: 分散式版本控制系統是沒有“中央伺服器”,每個人的電腦上都是一個完整的版本庫,工作的時候,不再需要聯網。開始工作前,在客戶端克隆出完整的程式碼倉庫,然後就可以在家、在公交車等等隨心所欲地修改程式碼並提交了,提交到本地電腦,等到有網的時候就可以一次性地將本地倉庫推送到遠端倉庫(臨時中心伺服器)中,這樣一來,每個人都可以獨立進行改動資料,並且所有的改動都是在完整資料資訊的環境下進行的。

image-20200623145500696
1.5.3 分散式與集中式的區別

集中式

  • 有一個單一的集中管理的伺服器,儲存所有檔案的修訂版本,所有程式碼庫。
  • 對網路的依賴性強,必須聯網才能工作,上傳速度受網路狀況、頻寬影響。
  • 客戶端記錄檔案內容的具體差異,每次記錄有哪些檔案做了更新,以及更新了哪些行的什麼內容。

缺點: 中央伺服器的單點故障。 如果中央伺服器發生宕機,所有客戶端將無法提交更新、還原、對比等,也就無法協同工作。如果磁碟發生故障,資訊尚無備份,還會有資料丟失的風險。

分散式

  • 本地客戶機進行操作,離線工作,快速。
  • 安全性高,每個人電腦裡都有完整的版本庫,如果電腦發生了更換複製一份就可以。
  • 原子性提交,提交不會被打斷(git)。
  • 工作模式非常靈活(傳統的集中式工作流 + 特殊工作流 + 特殊工作流和集中式工作流的組合)。

缺點: 缺少許可權管理、命令複雜混亂

1.6 Git的下載安裝

Git官網下載:https://git-scm.com/

TortoiseGit官網下載:https://tortoisegit.org/

Git文件下載:https://git-scm.com/book/zh/v2

Git詳細安裝教程參考:https://blog.csdn.net/weixin_44170221/article/details/104490352

注意: 關於Git的視覺化工具下載與否取決於自己,筆者不建議下載視覺化工具,因為我們要大量使用並熟練使用命令來操作Git!

Git客戶端下載 Git視覺化工具下載
image-20200705155736341
image-20200705160142347

1.7 安裝後測試

1.7.1 開啟命令的兩種方式
  1. Wins+R輸入cmd開啟Dos命令視窗
  2. 右鍵單擊開啟Git Bash Here視窗
1.7.3 命令檢視Git版本號

@檢視Git版本號: git version

1588391682513
1.7.2 提交版本控制人資訊

安裝後開啟命令視窗,第一次需要提交我們的資訊,這樣可以讓我們在版本控制的時候知道是誰做的這一次的版本控制。畢竟合併、更新程式碼等是一件很重要的事,萬一缺失損壞了怎麼辦呢?是吧!

@提交資訊版本操作者資訊:

git config --global user.name "Ziph" 【使用者名稱】

git config --global user.email "[email protected]" 【郵箱】

@檢視資訊:

git config -l

1588392070384

二、倉庫

2.1 倉庫是什麼?

版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

2.2 基本結構

工作區: 由我們使用命令git init初始化的一個本地資料夾,而初始化後的這個資料夾就被稱為工作區

暫存區: 由我們使用命令git add .把檔案新增到暫存區,而被新增的位置則是工作區中.git目錄中的index檔案,所以這也叫做索引

版本庫: 工作區中會有一個隱藏的.git資料夾,這個不算是工作區,而是Git的版本庫,版本庫中記錄了我們提交過的所有版本,也就是說版本庫管理著我們的所有內容

分支: 版本庫中包含若干分支,提交後的檔案就會儲存在分支中,而開始的時候版本庫中只會有一個主分支master

基本結構
image-20200705123251618
工作區-版本庫-暫存區-分支
image-20200705143640909

2.3 倉庫基本命令操作

我們在使用git來管理本地倉庫時,每次對工作區中的內容做的任何變化都需要add(新增)和commit(提交)操作來同步git版本庫,只有做了新增和提交操作git才能管理我們的工作區。

@建立版本庫: 建立或找到一個資料夾,開啟命令視窗,執行git init初始化本地工作區,在該工作區內會初始化生成一個.get目錄,而該目錄就是版本庫,它儲存著倉庫的所有資訊

@新增一個檔案: 在工作區中放入一個檔案,然後在命令列視窗中執行git add 檔名即可向工作區中新增一個檔案

@新增多個檔案: 在工作區中放入多個檔案,然後在命令列視窗中執行git add 檔名1 檔名2 ...即可向工作區中新增多個檔案

@新增資料夾內容: 在工作區中放入一個資料夾,然而資料夾中有很多檔案,開啟命令列視窗執行git add 資料夾名即可向工作區中新增該資料夾以及資料夾內的所有內容

@新增工作區內所有內容: 如果工作區中有很多資料夾和檔案,我們一個或多個新增很麻煩,我們可以使用git add .命令來新增工作區中的所有內容

@提交某些檔案: 使用git commit 檔名1 檔名2 -m "本次提交的描述資訊",注意提交的描述資訊是為了記錄本次提交而方便查詢,所以儘量能明確反映本次提交

@提交所有檔案: 使用git commit -m "本次提交的描述資訊"命令來提交檔案,提交後的檔案就由git來管理了。-m 後面雙引號中的內容,這描述這次提交的資訊,以便以後我們後續找到這次提交再做操作

@修補提交: 提交後發現有問題,比如釋忘記修改,⽐如提交描述不夠詳細等等。我們可以執行git commit --amend -m"描述資訊"來再次提交替換上次提交

@新增並提交檔案: 使用git commit -a -m "本次新增並提交的描述資訊"命令來自動新增和提交所有檔案

@刪除檔案: 使用命令git rm 檔名來刪除檔案,並使用git commit 檔名 -m "描述資訊"來提交這次刪除的檔案(瞭解即可)

@檔案刪除和修改: 關於向git提交後的檔案,刪除和修改我們只需要重新提交即可。也就是說,我們挪動或刪除了工作區中的檔案或更改了工作區中的目錄結構,都需要重新向git新增和提交你所變動的檔案。

@檔案狀態: 關於如何檢視我們新增或提交了哪些檔案、還是隻添加了檔案沒有把它提交。檢視檔案狀態需要使用git status命令檢視檔案的狀態

@檢視該檔案的改動情況: 使用git diff 檔名命令來檢視該⽂件的改動情況

@幫助: 使用git help commit或者git commit --help來獲取命令的提示幫助

2.4 日誌命令操作

我們的每次提交,git都會隨著提交的變動來記錄版本變化,所以你在工作區中的所有操作都會留下日誌。

@檢視所有提交日誌: 使用git log命令來顯示從最早的提交點到當前提交點的所有日誌

@檢視執行條數的提交日誌: 使用git log -數量命令來顯示最近指定數量條的提交日誌

@簡潔日誌顯示: 使用git log --oneline命令來顯示比較簡潔的提交日誌

@檢視最近的2次提交日誌: 使用git log --oneline -數量命令來簡潔的顯示最近的數量條的提交日誌

@圖形化顯示分支走向: 使用git log --oneline --graph命令來圖形化顯示分支走向

提交ID: git中的commitID是通過SHA1計算出來的⼀個⾮常⼤的數字,⽤⼗六進製表示,在分散式中保證唯一性。

而關於日誌中顯示的commitID,使用git log命令顯示的提交ID是很長的字串,而使用git log --oneline命令來簡潔顯示的提交ID是一個7位的字串。如果我們後續在使用commitID來操作的時候可以指定提交ID的前幾位字元即可,只要在你所操作的幾條commitID前幾位字元不發生重複就可以使用,所以在我們使用ID的時候並不需要使用很長的ID來操作,而一般使用前7位

檢視日誌
image-20200705134002824

2.5 版本回退命令操作

每次修改檔案並新增和提交。git都會記錄一個版本,如果有需要可以回退到之前的資料版本狀態

@回退上一個版本: 使用git reset --hard HEAD~命令來回退到上一個版本

@回退上上個版本: 使用git reset --hard HEAD~~命令來回退到上上個版本

@回退到上某數量個版本: 使用git reset --hard HEAD~數量命令來回退到上某數量個版本

@回退到某次提交時的版本: 使用git reset --hard commitID命令來回退到某次提交時的版本

注意: 回退的版本指定的commitID假如是22c4302cc866fbf5a3184b1fea6bd90b8c85255f,此時我們可以使用命令git reset --hard 22c4302來回退到該提交ID時的版本,雖然commitID這麼長,我們只需要保證唯一性來輸入前幾位commitID即可。要記住回退版本並不會刪除任何版本,所以版本之間可以來回切換

@細節: 發⽣版本回退後,通過git log命令只能看到最原始提交點⾄當前提交點的⽇志。而git reflog可以看全部⽇志(包括版本回退的日誌)

2.6 檔案狀態

切換至某個分支,在工作區操作該檔案,檔案狀態會有以下幾種:

檔案狀態 描述
未跟蹤 ⼯作區中新建立的⽂件,git中並未儲存它的任何記錄。使用git add .命令新增至暫存時即可建立跟蹤狀態
修改 已跟蹤狀態的檔案,在工作區被修改了,則會變為修改狀態
暫存 使用git add .命令新增到暫存區的檔案處於暫存狀態。每次暫存的是檔案的當前狀態,如果檔案被修改過,則需要再次將該檔案新增到暫存區。而每次提交,是將所有暫存區的檔案提交
提交 使用git commit -m "描述"命令來提交檔案,則該檔案就將從暫存狀態變為了已提交狀態。每次提交,會增加一個版本,分支指標後移指向新版本

2.7 檢視檔案狀態

我們可以使用git status命令來時刻檢視檔案所在狀態

@細節: 可以使用git diff命令來比對工作區內檔案的變動狀態

@比對: 使用git diff 檔名命令來比對工作區和暫存區(若暫存區沒有則比對分支)

@比對工作區與分支的最新結果: 使用git diff HEAD -- 檔名命令來比對工作區和分支的最新結果

@比對暫存區與分支的最新結果: 使用git diff --staged 檔名命令來比對暫存區與分支的最新結果

注意: git diff HEAD -- 檔名命令--檔名之間必須要有一個空格,不要寫錯!

相關推薦

手把手Git

文章已託管到GitHub,大家可以去GitHub檢視下載!並搜尋關注微信公眾號 碼出Offer 領取各種學習資料! 在這裡插入圖片描述 Git應用 一、初識Git 1.1 Git的簡史 同生活中的許多偉大事物一樣,Git 誕生於一個極富紛爭大舉創新的年代。 Linus在1991年建立了開源的L

手把手 CSS3 3D 技術(轉載)

是不是 col 默認 占滿 概念 ebe 說明 adb relative css3的3d起步 要玩轉css3的3d,就必須了解幾個詞匯,便是透視(perspective)、旋轉(rotate)和移動(translate)。透視即是以現實的視角來看屏幕上的2D事物,從而展現3

手把手12306驗證碼的秘密!

這樣的 隨機數 結構 實現 把手 session 劃分 技術交流 簡單的 12306相信對很多小夥伴都不陌生,假如問你對這個網站的印象的時候,你不是會立即想起那個坑爹的驗證碼,而正是這個驗證碼,也一時間成為小夥伴們討論的話題,今天思夢PHP就給大家帶來他的實現辦法,純屬技術

手把手阿裏雲雙11拼團活動

tar 數據庫 再次 發放 nbsp 新用戶 span mysql 圖片 各位新老用戶們,如果您已經開了團,但是還不知道怎麽玩?小編告訴來告訴你! 首先,進入活動主頁面,點擊【我要開團】,選擇您想要購買的雲產品進行開團!如果您只想開團不想購買,也可以~ 您開團後將

手把手npm包

【npm是什麼】 官網是這個:https://www.npmjs.com/, 官網介紹:npm is the package manager for javascript, npm是js的包管理器,更多的用於nodejs端。 基本上每種語言都有自己的包管理器,nodejs是

手把手 Git

目前國內開發人員普遍都開始使用 Git 進行專案的版本管理,如果說你還在使用 SVN 並且對 Git 一無所知的話,那我的這個 Chat 將會幫助到你。 我將手把手教你入門,並且巡迴漸進的帶入到工作的實際應用中。 在本場 Chat 中我將分享: Git 由來和 Git 的作用以及 Git

手把手SOCKET模型之重疊I/O篇(上)

手把手教你玩轉SOCKET模型之重疊I/O篇 “身為一個初學者,時常能體味到初學者入門的艱辛,所以總是想抽空作點什麼來盡我所能的幫助那些需要幫助的人。我也希望大家能把自己的所學和他人一起分享,不要去鄙視別人索取時的貪婪,因為最應該被鄙視的是不肯付出時的吝嗇。” -----

Apache Beam實戰指南 | 手把手大數據存儲HdfsIO

https 教你 存儲 http aec apache windows 手把手教你 數據存儲 https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247494843&idx=2&sn=0dd2

手把手小程式websocket

第一步:建立一個 WebSocket 連線 wx.connectSocket({ url: "wss://websocket.allhjs.com", }) 第二步:監聽WebSocket連線開啟 wx

Git-合併衝突

導讀 Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的專案。Git 是 L

科普貼 | 以太坊代幣錢包MyEtherWallet使用教程,一步步MEW

按鈕 wid isp 查詢 到你 pan fail VC oam MyEtherWallet 是一個以太坊的網頁錢包,使用非常簡單,打開網頁就可以使用,源代碼開源,不會在服務器上存儲用戶的錢包信息如私鑰和密碼。支持 Ledger Wallet、TREZOR 等硬件錢包

8分鐘丨 API

解決 規範 嚴格 自定義 二次 後臺服務 from 性能優化 失敗 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由織雲平臺團隊發表於雲+社區專欄 背景 當下,業界越來越多公司在項目架構設計時,會采用微服務架構。微服務架構,可以讓我們的產品有更好的擴

偽標籤:無標籤資料的半監督學習方法

對於每個機器學習專案而言,資料是基礎,是不可或缺的一部分。在本文中,作者將會展示一個名為偽標籤的簡單的半監督學習方法,它可以通過使用無標籤資料來提高機器學習模型的效能。 偽標籤 為了訓練機器學習模型,在監督學習中,資料必須是有標籤的。那這是否意味著無標籤的資料對於諸如分類和迴歸之類的監督任務

八招微博營銷推廣

截至2018年第二季度,微博月活躍使用者已經達到4.31億,其中,移動端使用者佔比93%。同時,微博使用者總體趨向年輕化,且不斷向三線及以下城市下沉。除此之外,微博還擁有由明星、KOL、頭部自媒體、MCN機構、企業等優質內容生產者組成的龐大內容生態,通過豐富的多媒體內容形態,持續性地生產優質

iphone超實用的3D touch功能!

在平時使用iPhone過程中是否發現很多功能都不知道怎麼用,還吐槽蘋果系統不夠人性化,現在先給大家推薦一波三維觸控的使用技巧! 三維觸控(3D Touch) 僅iPhone6s或以上機型支援三維觸控(3D Touch),開啟功能:設定→通用→輔助功能→三維觸控,然後設定好合適自己的靈敏度(按壓力度)

小邵Typescript、ts版React全家桶腳手架

前言:大家好,我叫邵威儒,大家都喜歡喊我小邵,學的金融專業卻憑藉興趣愛好入了程式猿的坑,從大學買的第一本vb和自學vb,我就與程式設計結下不解之緣,隨後自學易語言寫遊戲輔助、交易軟體,至今進入了前端領域,看到不少朋友都寫文章分享,自己也弄一個玩玩,以下文章純屬個人理解,便於記錄學習,肯定有理解錯誤或理解不到位

大資料智慧營銷系統網際網路

馬雲在網際網路大會上講: 這是一個摧毀你,卻與你無關的時代;這是一個跨界打劫你,你卻無力反擊的時代;這是一個你醒來太慢,乾脆就不用醒來的時代;這是一個不是對手比你強,而是你根本連對手是誰都不知道的時代。在這個大跨界的時代,告誡你唯有不斷學習,才能立於不敗之地!

7天雲伺服器

雲伺服器是一種簡單高效、安全可靠、處理能力可彈性伸縮的計算服務。其管理方式比物理伺服器更簡單高效。使用者無需提前購買硬體,即可迅速建立或釋放任意多臺雲伺服器。 雲伺服器幫助您快速構建更穩定、安全的應用,降低開發運維的難度和整體IT成本,使您能夠更專注於核心業務的創新。

中國護照含金量再上升,Qbao Network 全球54個國家!(二)

在昨天的文章中,小Q 介紹了近期中國護照含金量又升級的訊息!持中國護照及申根簽證的Q 寶寶們,除了可以前往26個申根國家,還可以免籤去另外28個國家及地區遊玩!加起來,可以玩轉全球54個國家哦! 小Q 認為若是在旅行中使用數字貨幣進行各項支付,減少現鈔使用的頻率

大神 SSD 系列一:關注哪些指標

很多公司已經使用SSD裝置來緩解了IO壓力,提高生產力和降低運維成本。關係資料庫、KV儲存都對磁碟的隨機讀寫效能有需求,而SSD的出現,正好滿足了這些需求。如何評估固態儲存裝置的效能,並根據業務需求挑選出合適的SSD產品,避免效能不足和過剩,成為儲存選型所面臨的一個問題。 前言 本系列將分為以下