不懂Git,別說自己是程式猿–20分鐘git快速上手
原連結: http://www.makeyuan.com/2014/01/28/886.html
在Git如日中天的今天,不懂git都不好意思跟人說自己是程式猿。你是不是早就躍躍欲試了,只是苦於沒有藉口(契機)。 好吧,機會就在今天。 給我20分鐘,是的,只要20分鐘, 讓你快速用上git。
我們廢話不多說,直接來乾貨。
我們將會介紹一下幾點:
一, 什麼是git
二,使用git的一般開發流程
三,快速安裝新建專案。holloword。
開始:
一、什麼是git。
閱讀本文的前提是你知道或者用過至少一種原始碼管理工具,比如:SVN, CVS 或者TFS等等。 你必須知道什麼是原始碼管理。如果這些都不滿足。請直接跳過本文。
瞭解陌生事物的最好辦法,是和已知事物類比。 ---孔子
我們以svn為例。 我們都知道傳統的原始碼管理都是以伺服器為中心的:
每個開發者都直接連在中間伺服器上, 本地修改,然後commit到svn伺服器上。
這種做法看似完美,但是有致命的缺陷:
1. 開發者不能本地跟蹤程式碼版本。 所有的資訊都是在伺服器上。 你把本地的程式碼改了很多,但是又不能提交。通常,本地只能快取一個版本。對於小專案無所謂, 但是專案一複雜,人員多就麻煩了。 通常你本地的程式碼都全是紅色的。自己都不知道今天修改了什麼, 有哪些修改是真正應該提交給svn的。
2. 因為第一點,一旦離開伺服器, 程式猿將無法正常工作。 因為本地不能跟蹤程式碼版本。 你的(幾乎)任何操作都必須連上伺服器。比如, show log, blame,show history等等。
3. 中央伺服器壓力過大。 因為每個人都必須把程式碼提交到伺服器,並且做daily build。
4. 對於大型專案, svn幾乎不可用。 例如linux核心專案, 開發者何止幾萬? 都直接提交給svn伺服器的話還不亂套了。
5. 對於個人的私人專案而言(或者對於小公司的專案), 不用版本控制當然不行,但是為了用版本控制而專門架設svn伺服器有有點捨不得。
有沒有能解決上述幾個問題的東東呢? 恩, 答案是肯定的。
Linux核心的作者也遇到了這些問題,於是他決定再一次改變世界, 重寫一個可以本地使用的svn。
對, 這就是git。 分散式程式碼版本管理系統。(說人話 :就是不用伺服器的svn)
我們來看git的結構:
git沒有中央伺服器。 你裝上git軟體之後,你就可以指定本地的資料夾進行版本控制了。你可拔掉網線,然後在本地修改, commit,revert(rollback), branch, restore, show log, blame, history 等等, 全部你之前在svn裡面可以用的操作。 簡單的說,你就完美了。
你可能意識到一個問題了。 就是天下大亂了。
每個人都自顧自的開發,怎麼協作呢? 恩,通常git比svn會多出兩個操作, 就是 pull 和push。
我們看一個複雜一點的圖:
開發者之間通過 pull和push操作, 把別人的修改拉過來,或者把自己的修改推給別人。
恩,你可能還是覺得有問題,我們生產 環境中, 以誰的程式碼為最終版本呢?
這個問題確實比較棘手,因為,從單純的技術上將,每個開發者的機器都是對等的。 沒有主次之分。
我們還有辦法:
技術上不能解決的問題,我們從制度上解決. ---- 孟子
從分散式環境中我們模擬出一箇中心來:
我們引入Leader這個角色。 他的機器是最終版本。 每個開發者都必須把最終的修改版push給leader。 leader會review然後提交。他就是最終版本。
恩, 我們好像還漏掉一個大問題, 說git,怎麼漏掉了github呢。 github是什麼。
我們知道,如果每個人都本地修改的話,本地可能不安全,(硬碟壞了,筆記本被偷了。。。。)
我們可能需要一個安全的伺服器來儲存/備份程式碼。對於開源的專案,可能是需要一個地方分享你的程式碼,你不可能24小時開著筆記本,讓別人從你這pull程式碼。
於是, 網上所謂的原始碼託管網站就冒出來了。 github就是這樣的。
看這個圖, 我只修改了其中一個地方, 就是把leader的機器換成了。 github.com 提供的線上賬戶。
所以, git和 github沒有必然聯絡。
這裡有幾個常用的線上託管地址, 有興趣自己看看:
1. github.com, 大名鼎鼎。 免費,只支援開源專案, 不支援私有專案。
2. bitbucket.com ,同樣大名鼎鼎。 免費, 支援開源專案和私有專案。 免費使用者最多5個。專案無限。
3. git.oschina.net, 國內頂尖託管平臺, 我本人正在用的就是這個。 支援開源專案和私有專案。 成員無限, 專案1000個。 使用的是阿里雲伺服器, 速度極快。 本人推薦5顆星。
二、 git開發的一般流程。
上面其實已經涉及了使用git的一般結構。 那麼生產環境中, git是如何應用的呢。
本人知道的模型如下:
每個開發者都向自己的專案伺服器(leader)提交程式碼, leader向公司伺服器提交。 當然這個leader是可有可無的。如果專案小的話, 開發者可以直接向公司伺服器提交。 公司的伺服器就是最終版本。 一般公司還會有持續整合CI伺服器。 我們可以在公司的原始碼伺服器上設定git的hook。 自動觸發CI伺服器工作。 這是後話,不多說了。
三、 前面的概念弄清楚之後, 上手就容易多了。 我們helloworld。
1. 這是git的官網:http://git-scm.com/ 去下載windows客戶端。
如果是linux的話, sudo apt-get install gitcore
2. 注意, 官網的客戶端都是命令列的。 命令列是高階用法。不在這裡說了。 我們下個gui。
我用的是TortoiseGit。 https://code.google.com/p/tortoisegit/ , 大家恐怕都熟悉svn時代的烏龜爬。上手快。 我們下面的操作都是gui上的。
安裝過程不說了。 一路next。 我們跳過。 直接到最後。假設你現在已經安裝完成了。
比如我已經有一個工程, helloworld:
這是工程檔案的內部結構:
現在我們想讓helloworld用上git怎麼做呢, 在工程根目錄下,點選滑鼠右鍵。
選擇 Create repository。
這個選項不要勾上。 稍後我們會解釋什麼是 Bare。
然後就完成了。
裡面多出了一個 .git目錄。 當前的目錄(及其所有子目錄)已經在git的監視之中了。 但是當前的程式碼還沒有新增到git的跟蹤資料庫中。 簡單的說,git還沒有儲存任何版本資訊。 我們需要進行第一次提交:
git預設你本地會有一個主分支master。
我們寫一些註釋, 並且勾上想要新增到git的檔案。 (如果有子目錄的話, 它都會顯示在這裡。)
提交完成, close。 這個push按鈕,稍後再說!
好了,這個時候我們在回到資料夾,看看有什麼變化:
現在這些檔案就新增進git了。
剩下的你就可以為所欲為了。 想svn一樣,自己試試幾個命令吧: 修改, difference, commit, revert,
到這你已經入門了。
最後我們來介紹兩個重要的概念。
1. “git目錄”, 就是指上圖中,專案根目錄下生成的 “.git” 資料夾。 用過svn的同學都知道, svn有‘.svn’資料夾。 他們的作用差不多。 這裡儲存了git的本地資料庫資料。就是所有的版本資訊。 跟svn不一樣的地方就是,git中,只有根目錄下有這個目錄, 所有的子目錄下都沒有, 也就是每個工程只有一個.git目錄。
2. “git工作目錄”, 其實就是你的工程目錄, 比如上圖中的工程跟目錄:H:\mycode\helloworld\ 。 問什麼有這個工作目錄呢。 就是你工作在這個目錄下, 你可以修改編輯裡面的檔案,最後把修改提交給git目錄。 這個共組目錄還有一個神奇的地方就是, 你可以建立不同的branch(你預設工作在master下), 當你切換不同的branch時, 你的工作目錄(工程目錄)裡的所有檔案都會變成當前branch對應的檔案。 這個不展開了。
最後再解釋上面留下的兩個問題:
1. “Bare” 建立Bare的意思是: 你只想要git的資料庫(即上圖中的 “.git”資料夾。), 而不想要當前的檔案。 這通常用在公司的中央伺服器上。 它不需要當前專案的實際程式碼,只需要保留git資料庫資訊就行了。
2. 在commit之後的對話方塊中的 push的意思。 正如之前介紹的。 push的意識是把你的修改push給別人(或者給公共伺服器)。 commit的意思只是提交到本地的 .git 資料庫。 並沒有更新別別人。 所有提交完之後, 烏龜很貼心的給我們一個push按鈕。 通過它你可以快速把剛剛的修改push給別人,或者給伺服器。
總結, 這不是一本完全的git手冊,但至少能讓你消除git恐懼症,快速入手。
這裡是gitbook的中文版: http://gitbook.liuhui998.com/ 他是真正的大而全。 為什麼最後才說它呢? 因為它就像是一本 牛津大辭典, 全面,權威。 但是對於幼兒園小朋友學英語,就不能一上來就背它吧。 先跟著別人說,上手要緊。 之後有什麼不會的,再去查字典。
我會在以後的時間裡在 碼客園 分享一下我對幾大原始碼託管伺服器的經驗,歡迎大家多多交流。