初識 Git∣GitHub-關於版本控制

關於版本控管

版本控制 (version control),係針對電子化的檔案,包括文件 (document)、程式碼 (source code)、與其它需被整理保存的資訊等,對其變動情形作有效的追蹤管理。

對於軟體開發過程,軟體開發者利用版本控制來追蹤、維護程式碼、設計文件、設定檔等變動情形;尤其是當面臨多人協同開發時,相關設計的文檔必然會複製多份版本分散置於每一位開發人員的電腦內,只要其中一份版本因功能或除錯 (features or bugs)問題經變更後,則位於其他電腦內的版本也必須保持其一致性。

這種頻繁且複雜的變動管理追蹤,幾乎是無法透過手動方式來管理的,自然而然,一個好的版本控制系統 (version control system, VCS),就要能擔負起下列的管理工作:

  • 對於所有團隊成員們的開發文檔 (尤其係指程式碼),要能保持一致性 (consistent)。
  • 因為錯誤的修改或遺失檔案,可以很輕易地回溯 (revert)至原來的狀態。
  • 任何再細小的變動,都可以知道是誰做了修改。
  • 可以輕易地部署 (deploy)不同版本的程式碼至開發或產品的伺服器內。
  • 團隊所有成員甚至可以利用 VCS 當成相互溝通的媒介。

儲庫 (Repository)

儲庫[1]是版本控制系統的核心組件 (core component)。它是一種資料倉儲的概念,主要儲存著下列的資訊:

  • 一組具階層性 (hirarchy)的檔案與資料夾結構。
  • 儲庫內的歷史性變更紀錄 (historical record of changes)。
  • 一組提交的資訊與指向該提交的指標,稱之為表頭 (head)。

簡而言之,版本控制系統的儲庫就是儲存著多個版本的文檔資訊。基於儲庫的位置所在,可以大致區分為兩種類型的版本控制架構。

集中式版本控制

集中式版本控制 (Centralized Version Control)是典型的「主從 (Client/Server)」 架構。記錄著多個版本檔案的儲庫是置於單一的伺服器內,並提供給具有存取權限的多個用戶端從伺服器提取檔案,所有的變更與提交等資訊均必須在連線到伺服端後才得以完成工作。

最普為人知且為免費開源的集中式版本控制系統,就屬 CVS、Subversion 為代表,並幾以成為業界所熟悉的版本控制標準模式了。

集中式版控系統模型

圖1-1:集中式版控系統模型

參考上圖1-1,集中式版控系統只有一個儲庫,是位於伺服器內。用戶端連線後發出 update 更新指令,就會從中央儲庫內複製一份工作複本 (working copy)至區域端電腦內;當開發者新增或變更檔案內容後,則需要提交 (commit)至伺服器的儲庫內;當儲庫與工作複本的檔案內容有不一致發生衝突 (conflicts)的現象時,則需要作合併 (merge)的動作。

閱讀全文 »

初識 Git∣GitHub-Git 簡史

Git[1]是由 Linux 之父-托瓦茲 (Linus Torvalds)為了維護 Linux 核心 (kernel)所開發出的版本控管工具。

早於 1991-2002 年間,當時 Linux 系統的核心維護,僅以補丁與備份性檔案 (patches and archived files)的方式實現。而後當 Linux 核心的維護規模日益龐大後,核心團隊決定與當時一家提供商業性版本控制系統-BitKeeper 合作,由其免費提供核心源碼的儲庫 (repository)。

這段蜜月期至 2005 年時,Linux 核心開源社群與 BitKeeper 結束長達三年的合作關係,而這也使得核心團隊必須著手開發屬於他們自己的版本控制工具。從 BitKeeper 的使用經驗中,他們制定了新的版本控制系統需要能達成下列幾個目標:

  • 速度。
  • 簡單設計。
  • 可以給予數以千計並行分支 (parallel branches)的非線性開發模式強力支援。
  • 完全分散式。
  • 能有效處理如 Linux 核心大型專案的規模 (速度與資料量的考量)。
  • Git 自 2005 年誕生以來,日益成熟且易於使用,而且還能維持原來的初衷-確實履行上述的目標設定;而最為人樂道的分散式架構,已證明更能有效應用在大型的協同式專案開發。有別於 CVS/Subversion 的中央集權控管方式,Git 可以不需要伺服器就可以在單機上運作版本控制,這也使得原始碼更容易發佈與分享。

    閱讀全文 »

[建站日誌] 新增「軟體設計線上教材區」

從事軟體設計教學多年來,除了不定期陸續在我的部落格發表相關的文章,也有其它包括整理在軟體課程的教材內,以及研討會的簡報等。

因為這些文章比較沒有一個結構化的編排整理,有些想學習軟體設計的讀者們可能就不容易得到系統化且循序性的研讀與瞭解。

所以我想要把關於軟體設計領域上多年來所專研的一些主題,甚至包括我現在仍持續研究學習的心得與體會,編排成線上電子書的型態,可方便供許多入門軟體設計的讀者們學習與交流討論。

每一本線上電子書的書名就是一個主題。 例如 「使用案例-需求分析教材」,或是「實戰案例演練 By Java/UML-迷你系統分析/設計與實作」、「物件導向觀念與實作 By C#.NET」、「螺旋式的軟體開發流程與實務」‧‧‧ (這些書名都僅是暫定的)。

這些電子書的主題(書名) 會列在位於部落格 Sidebar (側邊欄)的「軟件線上教材」區塊內。每一本的書名就是一個鏈結 (hyper-link),點擊後就會列出該書的大綱 (outline),其實也就是一篇部落格文章 (blog post)。

大綱的每一個標題 (我大概預計會整理到第三層的標題),同時也是一篇篇的部落格文章鏈結。可能是連結到以前就有發表的文章,也有可能是再修改編輯成符合該標題的文章,當然也會有為了該標題而新增的文章。

所以我覺得最重要「軟件線上教材」最重要的三個元素是 大綱、一篇篇被鏈結的文章 與 持續編排修改等。 喔!還有每篇文章仍舊保留可以讓讀者留言迴響,以作為交流討論與建議。

再來,待某一本主題式的線上教材整理得差不多的時候,我應該是會考慮出版實體書籍。當然等要出版時,會再將整本書的主題內容等作個 "Re-factoring (重構)" 總整理,不過,那是以後的事再說了。

軟體思維顧問

專職軟體輔導與教育訓練的獨立顧問。輔導企業資訊單位如何有效組織系統開發與維護;輔導開發人員達成有效的專業分工。傳授如何把軟體作軟 (Keeping Software Soft)的技能,得以提昇系統的彈性/延展,並進而創造系統的再利用價值。

Personal