前言
本來不打算寫相關Git
系列教程,因為網上已有廖雪峰老師的《Git教程》,及扔物線老師的《Git原理及使用指南》,怕自己寫不好,寫不全,講不清。但自己學習 Git 後,又按捺不住想寫的衝動,所以最終我還是動筆了。為了讓初次接觸 Git 的小夥伴快速上手,整個系列不打算深入的講解Git,而會將重心放在Git的常用概念及頻率較高的Git命令。同時又因為筆者是一名愛崗敬業的Android程式設計師,所以在文章中,我也會介紹Git相關指令在 IntelliJ IDEA
與 Android Studio
圖形化介面上的對應實現。
總之,簡單一句話來說,整個系列文章能幫助大家,不僅學到 Git 相關概念及 Git 相關命令的使用,還能熟悉圖形化介面上的操作。裝逼(論一個習慣命令列的程式設計師的自我修養),偷懶兩不誤~,還在等什麼呢?少年!!!come on ~
整個系列的文章,結合了相關視訊與部落格,在文章末尾或文章中都給出了相應學習連結。只有站在巨人的肩膀上,才能看的更遠~
什麼是版本控制
在我們進行深度學習 Git
之前,我想給大家講個故事,時間回到我們青春歲月的大學時代,在大四的小夥伴們,我相信大家都經歷過畢業論文??的折磨。在無數遍咒罵導師的時候,我們將畢業論文改了一遍又一遍。《絕不修改版本1》,《修改剁手版本1》,《打死不改版本》,《改了,導師掛全家版本》....等等,隨著論文修改的版本次數增加與時間長短等其他原因。我們或許已經忘記在相應版本中,我們新增了什麼內容,刪除了哪些語句。想要從不同版本中找到我們的歷史記錄,這是一項非常困難的事。
而版本控制系統
就能幫助我們解決上述我們遇到的問題。版本控制系統的主要目的是幫助你保留專案的詳細歷史記錄,並且能夠在不同的版本上進行工作。保留詳細的專案歷史記錄很重要,因為這樣可以看出一段時間內專案的進度。如果需要,你還可以回到專案的某個階段,並恢復資料或檔案。
版本控制其實就是
控制版本
,版本控制系統就是幫助我們控制或管理某個事物的不同版本
集中式or分散式
現在市面上的控制系統有幾十上百種,但是最為流行的版本控制系統為下面三者:
儘管有著不同的版本控制系統,但其主要類別分為兩種:
- 集中式模型:所有使用者都連線到一箇中央的倉庫(master repository)
- 分散式模型:每個使用者都在自己的計算機上擁有完成的倉庫。
在集中式模型中,有一臺功能強大的中央伺服器託管專案。每個每戶都必須通過這臺中央伺服器。
在分散式模型中,沒有中央資訊庫,每個開發者的計算機都有一份完整的專案拷貝。因為每臺計算機都有完成的專案拷貝,這就意味著我們可以離線工作,不受網路的限制了。
在該系列文章中,我們將使用Git,它是分散式版本控制系統。你可能聽說過 GitHub
, Git
和 GitHub
是完全不同的 Git 是版本控制工具。而 Github 是託管 Git 專案的服務,要使用 Git 專案,你未必要使用 GitHub 。但是 GitHub ,在後續文章中我們也會講到。現在就把它當做可以上傳你的專案副本的另一臺計算機。如果現在沒有理解集中式,分散式。也完全沒有關係。這裡只是介紹一下他們執行的大概框架。
Git和版本控制術語
在學習Git之前,我們有必要了解Git和版本控制術語,瞭解相關術語,有助於我們更好的學習並使用Git。
版本控制系統或原始碼管理器
版本控制系統(version control system 簡稱VCS
)是一個管理原始碼不同版本的工具。原始碼管理器(source code management 簡稱 SCM
)是版本控制系統的另一個名稱。
Git 是一個 SCM(因此也是 VCS!)。Git 官方網站的 URL 是 Git-scm.com/(注意它的域名中直接包含“SCM”!)。
提交(cmomit)
Git 將資料看做微型檔案系統的一組快照。每次 commit(在 Git 中保持專案狀態),它都對檔案當時的狀況拍照,並儲存對該快照的引用。你可以將其看做遊戲中的儲存點,它會儲存專案的檔案和關於檔案的所有資訊。
你在 Git 中的所有操作都是幫助你進行 commit,因此 commit 是 Git 中的基本單位。
倉庫(Repository/repo)
倉庫是一個包含專案內容以及幾個檔案(在 Mac OS X 上預設地處於隱藏狀態)的目錄,用來與 Git 進行通訊。倉庫可以儲存在本地,或作為遠端副本儲存在其他計算機上。倉庫是由 commit 構成的。
工作目錄 / 工作區(Working Directory)
工作目錄是你在計算機的檔案系統中看到的檔案。當你在程式碼編輯器中開啟專案檔案時,你是在工作目錄中處理檔案。
與這些檔案形成對比的是保持在倉庫中(在 commit 中!)的檔案。
在使用 Git 時,工作目錄與命令列工具的 current working directory (當前工作目錄)不一樣,後者是 shell 當前正在檢視的目錄。
檢出(Checkout)
檢出是指將倉庫中的內容複製到工作目錄下。
暫存區 / 暫存索引 / 索引(Staging Area / Staging Index / Index)
Git 目錄下的一個檔案,儲存的是即將進入下個 commit 內容的資訊。可以將暫存區看做準備工作臺,Git 將在此區域獲取下個 commit。暫存索引中的檔案是準備新增到倉庫中的檔案。
SHA
SHA
是每個 commit 的 ID 編號。以下是 commit 的 SHA 示例:
e2adf8ae3e2e4ed40add75cc44cf9d0a869afeb6。
複製程式碼
它是一個長 40 個字元的字串(由 0–9 和 a–f 組成),並根據 Git 中的檔案或目錄結構的內容計算得出。SHA 的全稱是"Secure Hash Algorithm"(安全雜湊演算法)。如果你想了解雜湊演算法,可以參考SHA家族。
分支(Branch)
分支是從主開發流程中分支出來的新的開發流程。這種分支開發流程可以在不更改主流程的情況下繼續延伸下去。
回到之前關於遊戲儲存點的示例,你可以將分支看做在遊戲中設立儲存點後,嘗試一個有風險的招式。如果有風險的招式不奏效,則回到儲存的位置。令分支非常強大的關鍵之處是你可以在一個分支上設定儲存點,然後切換到另一個分支並繼續設定儲存點。
Git的工作流程
在Git的工作流程主要圍繞三個部分,工作區,暫存區與倉庫區。當你第一次在使用Git時,可能不太容易意識到有這三個不同的區域。因為你並不會在計算機的檔案中看到任何可見的修改。但Git的確管理者這三個區域。
向倉庫中新增檔案
在Git中如果你建立了一個空倉庫,Git能夠分辨從未見過的檔案,如上圖中的紅色的A
檔案,如果我們需要通過Git來跟蹤我們的檔案,我們需要將檔案新增到倉庫中,但是我們不能直接將這些檔案直接移動到倉庫區中。上述A檔案必須先移動到暫存區,我們可以使用 git add
指令將A
檔案更改移動到暫存區(暫存區可以存放所有即將
提交的檔案)。當檔案提交到暫存區中後,我們可以使用git cmomit
指令將A
檔案移動到倉庫區去。
關於
git add
與git commit
這兩個指令,在接下來的文章中會進行講解。需要注意的是隻有暫存區的內容才會被提交到倉庫中去。
修改倉庫中的檔案
同樣的修改倉庫中的檔案,也需要先將修改的檔案先新增到暫存區中,然後從暫存區提交到倉庫。
瀏覽提交記錄
如果說我們想檢視我們的提交資訊怎麼辦呢?針對每個提交,Git都會為其建立一個 ID(SHA)
,每個提交的ID,也就是SHA的前七個字元如下圖所示:
最後
站在巨人的肩膀上,才能看的更遠~