Git版本控制工具(intro)
關於版本控制
當有多人在同時開發專案時,會有很多版本的問題,我們要怎麼去控制大家的進度呢 ?
或是當你更新一個程式時,在新的版本裡多加了一些功能,但有可能你覺得修改之前的版本是比較好的,或是新的版本導致了某些問題,我們要怎麼解決這些問題呢 ?
如果我們能快速地知道在新的版本裡我們修改了哪一些部分,或是找到我們之前版本的檔案,我們就可以很容易地找出問題並快速地解決他。
版本控制可以記錄文件的變化內容,以便將來若有情況時可以立即查閱,使用版本控制系統可以預防若是你做了一些傻事或是不小心遺失了檔案,你可以將文件較方便地恢復到先前的模樣。
簡單介紹三種不同版本控制:
本地版本控制
此為常見的做法,將不同版本的文件複製到不同的資料夾,這個方法很簡單,但是也很容易產生很大的錯誤,也很容易搞混資料夾而意外修改到錯的檔案。
集中化版本控制
後來因為大多程式都是藉由好幾人一起開發而成,要與其他開發者合作,因此集中化版本就這樣誕生了。
集中化版本控制是由一個伺服器來管理所有版本的檔案,而用戶端會連到伺服器將部分檔案取出來使用。
這個做法相對於本地版本控制的好處是每個人都可以知道專案中的其他人在做什麼,也可以輕鬆掌握每個人的開發進度與權限,但缺點是當伺服器當機時,就沒有人可以提交更新,若是再嚴重一點很有可能會遺失所有檔案。
集中化版本控制有: CVS, Subversion, Perforce
分散式版本控制(DVCSs)
因為上述集中化版本控制的問題,分散式版本控制就這樣又誕生了。
在分散式系統中,和集中化版本控制中差別最大的是用戶端不只取出部分要修改的檔案,他還會把整個倉庫做個鏡像,也就是說,每個地方都有完整的備份。
因此若是往後伺服器壞了,就可以透過其中一個用戶端的鏡像做資料還原的動作。
於是接下來主要介紹git這個版本控制工具~
分散式版本控制有: Git, Mercurial, Bazaar, Darcs
三種版本控制概念圖
圖片來源自git官方手冊
git基本介紹
git是一個分散式版本控制軟體,最初由林納斯·托瓦茲創作,於2005年以GPL釋出。最初目的是為更好地管理Linux核心開發而設計。應注意的是,這與GNU Interactive Tools(一個類似Norton Commander介面的檔案管理器)不同。
git最初的開發動力來自於BitKeeper和Monotone。git最初只是作為一個可以被其他前端(比如Cogito或Stgit)包裝的後端而開發的,但後來git核心已經成熟到可以獨立地用作版本控制。很多著名的軟體都使用git進行版本控制,其中包括Linux核心、X.Org伺服器和OLPC核心等專案的開發流程。 — from WIKI
git不等於github,git是一個版本控制的工具,github是一個可以提供讓你免費放source code服務的地方。
服務除了github以外,還有bitbucket, gitlab…等 more
git學習基礎要點
git官方手冊內說到: 在學習之前,試著忘記以前所知道的其它版本控制系統 ,因為git和其他版本控制系統有較大差異,這樣能幫助你在使用git時發生不必要的誤會。
git儲存資料及對待資料的方式遠異於其它系統,即使它們的使用者介面是很相似的。
記錄檔案快照,而不是差異
git和其它版本控制系統最主要的差別是處理資料的方式, 一般來說其他大部分的系統是紀錄檔案內的更動。
而git是將他視為一個檔案的快照,每當你commit時,git會紀錄下你所有目前檔案的樣子,並且參照到這次快照中。 若是檔案沒有變更,git不會再次儲存該檔案,而是直接將上一次相同的檔案參照到這次快照中。
git把它的資料視為一連串的快照。
操作大部份皆可在本地端完成
大部份git操作皆只需要本地端的檔案及資源即可完成,通常並不需要網路上其它電腦的資訊。
例如:想要瀏覽專案的歷史時,git不需要到伺服器下載歷史再顯示,就只需要從本機的資料庫讀取。
能檢查完整性
在git中所有的物件在儲存前都會被計算checksum並以校驗碼參照物件。 這意味著你不可能瞞著git對任何檔案或目錄進行修改,git更能夠馬上察覺傳輸時的遺失或是檔案的毀損。
通常只增加資料
使用git時幾乎所有的動作都只是增加資料。在任何版本控制系統中,你尚未提交的修改都有可能會遺失或者搞亂,但是只要你提交快照到git後,很難會發生遺失的情況,特別是你將資料庫push到其它儲存庫時,就更不可能會弄丟資料。
git資料的三種狀態
- committed : 這檔案己安全地存在你的本地端資料庫
- modified : 檔案已被修改但尚未提交到本地端資料庫
- staged : 這檔案將會被存到下次你提交的快照中
- .git directory是用來儲存你專案的後設資料及物件資料庫的地方,也是git最重要的部分。
- working directory是專案被檢出的某一個版本
- staging area是用來儲存關於下次提交的資訊
若檔案已被存於git資料夾內,則稱為已提交。
若檔案先被修改,接著被增加到預存區域,則稱為已預存。
若檔案被檢出後有被修改,但未被預存,則稱為已修改。
git安裝與初次設定
請參閱git官方手冊