?? 作者簡介:阿里巴巴嵌入式技術專家,深耕嵌入式+人工智能領域,具備多年的嵌入式硬件產品研發(fā)管理經驗。
?? 博客介紹:分享嵌入式開發(fā)領域的相關知識、經驗、思考和感悟,歡迎關注。提供嵌入式方向的學習指導、簡歷面試輔導、技術架構設計優(yōu)化、開發(fā)外包等服務,有需要可私信聯系。
??? 專欄介紹:本文歸屬于專欄《Git/Repo
》,專注git、repo,持續(xù)更新中,歡迎大家訂閱關注。
1. 什么是Git?
Git是一個開源的分布式版本控制系統(tǒng),用于跟蹤代碼的改變和協同開發(fā)。它最初由Linus Torvalds為了管理Linux內核開發(fā)而創(chuàng)建,現已成為開源軟件開發(fā)中最流行的版本控制系統(tǒng),沒有之一。Git允許多人同時在不同的分支上工作,并能夠合并不同的分支和代碼版本。它具有高效的性能、靈活的分支管理和強大的合并工具,為多人協作開發(fā)團隊提供了一種可靠的方式來協同開發(fā)和管理代碼。Git還提供了本地版本控制,使開發(fā)人員可以在沒有網絡連接的情況下進行工作,并能夠輕松地回溯和撤銷代碼更改。
2. 版本控制系統(tǒng)(VCS)的歷史和發(fā)展
回顧VCS的發(fā)展歷程,總體上可以劃分為三個階段。
第一代VCS,包括SCSS和RCS。立足于對單個文件變化的跟蹤,檢出的文件一次只能由一個用戶在本地進行編輯,用戶通過自己的帳戶登錄到同一共享Unix主機方式實現。
第二代VCS,包括CVS和SVN。通過引入網絡,從而形成了包含正式意義上的項目版本的集中式版本存儲庫。相比第一代VSC,有了實質性的發(fā)展,可以供多個用戶同時檢出并使用代碼,但是他們都需要重新提交到同一中央存儲庫。存在的問題是嚴重依賴于中央存儲庫,對網絡和實時性同步要求很大。
第三代VSC,包括Git和Mercurial。到現在發(fā)展成為了分布式VCS。在分布式VCS中,創(chuàng)建存儲庫的所有副本都是相同的,無需一個集中的中央存儲庫。無需通過網絡實時同步內容,只需本地創(chuàng)建提交,分支和合并打開了路徑,在合適時候再推送到遠端庫。
縱觀歷史,SVN和Git是VCS發(fā)展史上最具代表性的兩大杰作。從功能上來講,它們基本上是一致的。最大的區(qū)別在于:
- SVN是集中式版本管理系統(tǒng),很多操作都需要依賴網絡,使的它的發(fā)展受到了極大的約束。
- Git屬于分布式版本管理系統(tǒng),代碼倉庫拉取到本地之后,本地即保存了遠程倉庫的所有信息,包括所有分支、所有tag、所有commit,簡單說本地倉庫就是遠程倉庫的一個鏡像,這就使的它的很多操作可以脫離網絡在本地實現。
隨著VCS的持續(xù)發(fā)展,Git已經一家獨大,現已成為開源軟件開發(fā)中最流行的版本控制系統(tǒng),沒有之一。所以學習版本控制,只需要學習Git就可以了。掌握了git的精髓,即使因為一些歷史原因還需要去訪問一些svn倉庫,那也可以基于git的思想和經驗,快速掌握svn的常見命令,甚至可以直接使用Git官方提供的git-svn工具(Git - git-svn Documentation)來操作svn。
3. Git的優(yōu)勢和用途
3.1 Git的優(yōu)勢
- 分布式版本控制:Git是一種分布式版本控制系統(tǒng),每個開發(fā)者都擁有完整的代碼倉庫的副本。這意味著即使沒有網絡連接,開發(fā)人員仍然可以進行工作,并且可以輕松地與其他開發(fā)者進行代碼合并和共享。
- 高效性能:Git的設計目標之一是提供高效的性能。Git使用了一些優(yōu)化策略,如快速的提交和檢出操作,以及**僅存儲差異的方式(增量而非全量)**來減少存儲空間。這使得Git能夠處理大型項目和大量的代碼變更,而不會造成性能問題。
- 強大的分支管理:Git的分支管理功能非常強大,允許開發(fā)人員創(chuàng)建和切換分支,獨立開發(fā)新功能或修復bug,而不會影響主線代碼。分支合并也非常容易,可以輕松地將不同分支的代碼合并到一起。
- 版本控制和回溯能力:Git能夠跟蹤代碼的每一次改動,并保留完整的歷史記錄。這使得開發(fā)人員可以輕松地回溯到任何一個特定版本的代碼,并查看相關變更和提交信息。這對于排查問題、修復bug和進行代碼審查非常有幫助。
- 豐富的生態(tài)系統(tǒng):Git擁有龐大的開源社區(qū)和豐富的生態(tài)系統(tǒng),有許多第三方工具和服務可供選擇,如GitHub、GitLab和Bitbucket等。這些工具和服務提供了代碼托管、協作開發(fā)、問題追蹤和持續(xù)集成等功能,可以幫助開發(fā)人員更好地利用Git進行項目管理和協同開發(fā)。
3.2 Git的主要用途
- 代碼版本控制:Git最初是為了管理Linux內核開發(fā)而創(chuàng)建的,因此它被廣泛用于軟件開發(fā)中的代碼版本控制。開發(fā)人員可以使用Git跟蹤代碼的變化、管理不同的代碼分支,并輕松地進行合并、回溯和撤銷代碼的更改。
- 協同開發(fā):Git的分布式特性使得多個開發(fā)人員可以同時在不同的分支上工作,并能夠方便地合并彼此的代碼變更。開發(fā)人員可以通過Git來協同開發(fā)新功能、修復bug,并通過代碼審查來提高代碼質量。
- 開源項目管理:Git被廣泛應用于開源軟件項目的管理。開源項目通常有許多貢獻者,需要一個可靠的和高效的版本控制系統(tǒng)來管理代碼的變化和合作開發(fā)。Git提供了強大的分支管理和合并功能,使得開源項目能夠更好地組織和管理代碼。
- 文檔管理:Git不僅可以用于代碼管理,還可以用于文檔管理。開發(fā)人員可以使用Git來跟蹤文檔的變化、協同編輯和合并文檔的改動。這對于團隊合作編寫文檔、制定規(guī)范和撰寫技術文檔非常有幫助。
總之,Git是一個功能強大的版本控制系統(tǒng),可以幫助開發(fā)人員更好地管理代碼,提高協同開發(fā)效率,并保證代碼的可追溯性和質量。
4. Git涉及的基本概念
4.1 倉庫(repository)
Git三大本地工作區(qū)域之一,倉庫就是Git的數據庫,所有數據文件都存儲在.git/目錄下,Git使用倉庫來存儲代碼和版本歷史記錄。倉庫可以是本地的,也可以是遠程的。本地倉庫是存儲在開發(fā)人員的計算機上,而遠程倉庫是存儲在網絡服務器上,用于協同開發(fā)和代碼共享。
4.2 工作目錄(Working Directory)
Git三大本地工作區(qū)域之一,指的是平時我們用來存放項目文件,看得見文件,打得開文件、改得了文件的地方。不管是本地創(chuàng)建的倉庫還是從遠程地址拉取下來的倉庫,只要后面涉及文件的增刪改,首先都是在工作區(qū)完成的。
4.3 暫存區(qū)(Stage/Index)
Git三大本地工作區(qū)域之一,它是介于工作區(qū)和倉庫之間的一個臨時區(qū)域,用來臨時存放改動。本質上它只是一個特定格式的二進制文件(.git/index),主要保存即將提交到倉庫里的文件列表等信息。git add命令的作用就是將工作目錄中改動的文件添加到暫存區(qū)。
4.4 遠程倉庫(remote)
也是Git的一個重要工作區(qū)域,只是它是存儲于網絡服務器上的Git倉庫,用于協同開發(fā)和遠程代碼共享。開發(fā)人員可以將本地倉庫推送到遠程倉庫,也可以從遠程倉庫中拉取代碼更新。常見的遠程倉庫服務有GitHub、GitLab、Gerrit等。
4.5 提交(commit)
提交是Git中記錄代碼變更的基本單位。每次對代碼的修改都可以通過提交來保存和描述,包括修改的內容、作者、時間戳等信息。提交將代碼的狀態(tài)從未提交狀態(tài)轉換為已提交狀態(tài),從而使得代碼變更可追溯和回溯。
4.6 HEAD指針
HEAD是Git中的一個特殊指針,它通常指向當前分支的最新提交。每當執(zhí)行git commit或git checkout之類的操作時,HEAD引用的位置都會發(fā)生變化,這些變化過程會被記錄在**.git/logs/HEAD**文件中。這樣,Git就能夠追蹤HEAD引用的歷史變化,從而能夠回滾到之前的狀態(tài)或執(zhí)行其他與版本控制相關的操作。
4.7 文件狀態(tài)
在Git中,文件主要有四種狀態(tài):
- Untracked:文件未被跟蹤,這意味著文件存在于工作目錄中,還沒有跟git產生任何關聯,因此不參與版本控制。如果要將文件添加到Git庫,可以使用git add+git commit命令。
- Unmodified:文件已經被提交進git倉庫,并且從最后一次提交以來未進行修改。這意味著git倉庫中的文件與工作目錄中的文件完全一致。如果文件被修改,它將變?yōu)镸odified狀態(tài)。如果文件被從版本庫中移除,它將回到Untracked狀態(tài)。
- Modified:文件已修改,但尚未進行其他操作。這意味著文件已經被修改,但改動尚未被提交到git庫??梢酝ㄟ^git add命令進入暫存(staged)狀態(tài),然后再使用git commit命令將其提交到git倉庫?;蛘咄ㄟ^git checkout命令將修改丟棄掉,使文件回到Unmodified狀態(tài)。
- Staged:文件已經被添加到暫存區(qū),準備被git commit命令提交到git倉庫中。提交到git倉庫之后,git倉庫中的文件和本地文件將再次保持一致。
4.8 分支(branch)
分支是Git中獨立存在的代碼副本。開發(fā)人員可以創(chuàng)建和切換分支,以獨立開發(fā)新功能或修復bug,而不會影響主線代碼。分支可以并行地進行開發(fā),并能夠輕松地合并到其他分支或主線代碼中。
4.9 合并(merge)
合并是將不同分支或代碼版本的變更合并到一起的操作。當開發(fā)人員完成某個分支上的工作后,可以將該分支的代碼合并到其他分支或主線代碼中,以集成新的功能或修復到整體代碼中。
4.10 標簽(tag)
標簽用于給特定的提交打上有意義的標記,如版本號或發(fā)布版本等。標簽可以幫助開發(fā)人員快速定位和回溯到特定的版本的代碼,方便版本發(fā)布和維護。
4.11 引用(ref)
引用(reference)本質上是一個指向某個提交對象(commit)的指針或別名。Git 使用引用來快速定位和訪問存儲庫中的特定提交。引用通常存儲在.git/refs
目錄下,該目錄下又包含了不同類型的子目錄,如heads/
、tags/
和remotes/
,分別對應不同類型的引用:分支引用(Branch References)
、標簽引用(Tag References)
、遠程引用(Remote References)
。
以上是Git的基本概念,它們共同構成了Git的核心功能和特性,幫助開發(fā)人員進行代碼版本控制、分支管理和協同開發(fā)。
5. git適合管理哪些文件
5.1 最適合哪些?
純文本文件:txt
源代碼文件:c、cpp、java、py、js等一切純文本格式的源代碼文件
項目文檔:md等格式
5.2 不適合哪些?
1、doc、exe、elf、db、二進制數據等帶有一定格式的非純文本可讀文件。
問題:無法diff,任何改動都只能更新整個文件,無法做到增量式更新
解法:將文檔轉化為markdown格式使用git來維護、文檔使用語雀等知識庫進行維護、其他二進制文件如果必須放在git,考慮git-lfs替代
2、大文件。
問題:不能把git倉庫當網盤使用,容量有限&拖慢性能
解法:網盤、云存儲(比如阿里云oss、騰訊云cos等)、考慮git-lfs替代
課后習題
- (單項選擇題)目前開源軟件開發(fā)中最流行的版本控制系統(tǒng)是哪個?_____
A. RCS
B. SVN
C. GIT
D. Mercurial
- (單項選擇題)以下哪項不是Git的基本概念?____
A. 倉庫
B. 分支
C. 引用
D. 元數據
- Git中的HEAD指針指向哪里?____
A. 指向所有分支中最新的一次提交
B. 指向當前分支的最新一次提交
C. 指向當前分支的第一次提交
D. 指向最近一次被git add的文件
- (不定項選擇題)Git中文件狀態(tài)有哪些?____
A. Untracked
B. Unmodified
C. Modified
D. Staged
- (不定項選擇題)Git的本地工作區(qū)域有哪些?____
A. 倉庫
B. 工作目錄
C. 遠程倉庫
D. 暫存區(qū)文章來源:http://www.zghlxwxcb.cn/news/detail-852817.html
- (不定項選擇題)以下哪個是Git的優(yōu)點?_____
A. 集中式版本管理系統(tǒng),需要依賴網絡運行。
B. 分布式版本管理系統(tǒng),代碼倉庫拉取到本地之后,本地即保存了遠程倉庫的所有信息,可以脫離網絡查看本地的改動和其他分支的提交。
C. Git的分布式特性使得多個開發(fā)人員可以同時在不同的分支上工作,并能夠方便地合并彼此的代碼變更。
D. Git可以當做網盤使用,用來備份手機拍的照片。文章來源地址http://www.zghlxwxcb.cn/news/detail-852817.html
到了這里,關于【Git】第一課:Git的介紹的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!