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