Git教學:初學者使用心得分享(Windows)


作者: | 2011/05/06 | 6 則迴響


前陣子剛接觸git時,網路上很多git文章都很零散,針對windows平台的教學也不多 (也有發現一些文章像是寫給鬼看的XD),讓身為初學者的我痛苦指數一直上升,在使用一陣子後就想試試看整理一篇目前理解的使用心得。

先說明我的環境是 windows 7,目前專案寫的是php。之前使用版本控制軟體的經驗是有用過SVN,且是在windows下用TortoiseSVN,做一些簡單的操作,並且沒架過SVN server。先假設您不太了解什麼是版本控制,然後最近聽說Git很火紅,也想玩看看。

*什麼是版本控制?

開發專案時,開發者會一直寫入新的程式碼,或放進新檔案。如果有天出事了,某個功能以前明明可以跑,但突然掛點了,通常我們會回頭去看相關的程式碼,試著找出問題並修復。但如果專案規模不小或者是由很多人一起開發的專案,就會大大增加debug的難度。

版本控制軟體讓我們可以儲存專案不同時期的版本,如果每次有修改就存下一個版本(有些叫check-in,有些叫commit),出事時就可以回溯到之前還能正常執行的版本,並且比較兩個版本間有何不同,找出引起問題的程式碼。

另外有一些情況是:如果你想開發新功能,我們可以利用版本控制軟體,在專案中開一個分支(branch)來發展看看,或實驗看看,如果成功了,又能合併(merge)回原來的開發主線。

而目前版本控制做得最棒的聽說是Git,所以我們就要來試玩看看。

*Git是什麼?

Git就是一套版本控制軟體,相對於subversion(SVN)的中心式版本控制,git是分散式版本控制,幾乎什麼事都在本機進行,設計上「只會增加資料」,因此不要太怕出事,東西都可輕鬆復原。每個開發者的本機端都會有完整的程式庫,都能獨立作業,不受開發主線的拘束,不需網路連線也能工作。(這些描述都是參考本文最後附的參考資料,有個超棒的Git教學投影片,請一定要連過去看看)

*安裝Git

要在windows上安裝Git,目前並沒有太多選擇。我是安裝msysgit,網路上找都有安裝說明,你在安裝上應該不會有太多困難。記得勾bash(命令列)和gui,bash就是命令列操作模式,gui是圖形操作介面,但個人感覺git gui不太好用,如果真的不想用命令列,不如安裝TortoiseGit(著名的烏龜系列…),它的ui相比之下好用很多。

安裝完後,你可以試著在本機任一目錄上按右鍵,然後應該能在選單上看到 Git GUI hereGit Bash here 這兩個選項。後面文章若提到要執行Git命令,就是在目錄上按右鍵,選擇 Git Bash here,它就會跳出Dos視窗,你就可以針對這個目錄執行Git命令。

*每個開發者都擁有自己的倉庫(Repo)

接下來介紹安裝完後,我們如何利用Git「自己跟自己玩」。白話來說,就是在自己的電腦上,自己寫code後把變更提交(commit)到自己本機的倉庫(Repo)裡。

Repo是repository的簡稱,指的是倉庫、程式庫、版本庫…,簡單來說,Repo就是一個受Git版本控制的目錄。你可以先找一個空資料夾執行git init來建立新的Repo,若你有裝TortoiseGit,就可在空資料夾按右鍵,選擇Git create repository here,意思一樣。

當然若你有現成的程式專案目錄,也可以直接把它建成Repo,操作跟上述相同。

執行git init後這個資料夾就變成一個Repo了,裡頭會多一個名叫.git的目錄,而Repo在日後進行版本控制時所需的相關資訊都會存放在這個.git資料夾中。(.git目錄若砍掉了,這個目錄就不再是一個Repo了)

現在Repo目錄裡啥都沒有,所以可以先隨便新增一個README來試玩看看,執行:
touch README

執行後就會多一個空白的檔案叫README,如果要你放進其他的檔案試試看也行,就直接copy放進來吧。

這時我們的repo已經有新檔案了,但都還沒受到版本控制(untracked),不在版本控制清單中的檔案,就不會受到git控制,也就是你要把程式碼提交變更(commit)至repo時,這些untracked的檔案都不會被放進去。所以要執行add,讓檔案們進入所謂的staged狀態,才能接著把它們commit進Repo中。

要把所有檔案都加入staged狀態,執行:
git add -A

git add .

要把個別的檔案加入staged,執行:
git add 主檔名.副檔名

如果有些檔案你不想要再讓它受到版本控制了,也就是要把它unstage,那可以執行:
git reset 主檔名.副檔名

好的,現在確定好要commit第一版程式碼了,所以可以執行:
git commit -m ‘Initial commit’

也就是把所有檔案commit進repo,並且附上’Initial commit’的說明註解。而日後,如果commit過的檔案有再修改過,也需要再add一次成為staged狀態,然後再commit它們。

使用TortoiseGit就很方便了,按右鍵選擇選單中的Git Commit -> “master”… (請參考上面的選單圖),就會出現下圖:

按下ok就可以幫你commit了。

在操作過程中,如果想知道目前Repo中的檔案們到底是什麼狀況,到底誰要add,誰要commit,可以執行:
git status

了解了目前檔案的狀況,如果想要檢視一下這個Repo之前commit的歷史記錄,可以執行
git log

(記錄顯示會一頁一頁停住,按個q就會跳出來)

在我們每次commit後,都會產生一個新的程式碼版本,而這個版本都會有個落落長的唯一編號,日後要進行版本控制的操作時就是認這個編號。

* 出事了,我要回復上一動!(or 上上上..一動)

現在我們可以自己寫code,自己commit了,天天記錄新進度,感覺很踏實。但有一天發現某功能挫屎了。也許你確定上禮拜這邊還沒問題的,或某一版一定沒問題,這時我們可以利用Checkout來回溯之前的版本:

git checkout xxxx .
xxxx指的是版本編號的前四碼。

若您使用TortoiseGit,可以點選「Switch/Checkout」這個選項,如果您想切換Branch,可以在此選Branch並切換過去;如果您想回溯程式版本,就選Version,然後點一下後面的…按鈕,就會出現如下的畫面:

在此你可以看到此Repo所有Commit過的版本,有分支示意圖,也有日期、commit註解等,選擇你要的版本把它Checkout,就能回溯了。

本篇介紹了如何自己跟自己玩,如果要多人一起玩,要怎麼作呢?一定要架Git Server嗎?下一篇教您如何利用Dropbox作為Git Server,簡單又好用!

參考資料:
寫給大家的git教學 http://www.slideshare.net/littlebtc/git-5528339


標籤:,

分類:,

本文作者是Audi Lu

6 則留言

  • [Linux-Windows-git-android]Git Resource | Terry的異想天開部落格 says:
  • shanwu says:
  • […] Git教學:Git的遠端操作及利用Dropbox建立Server進行協同開發(Windows) @ mr.mu.broken_link,a.broken_link{}var analyticsFileTypes=[''];var analyticsEventTracking='enabled';var _gaq=_gaq||[];_gaq.push(['_setAccount','UA-4997647-3']);_gaq.push(['_trackPageview']);_gaq.push(['_trackPageLoadTime']);(function(){var ga=document.createElement('script');ga.type='text/javascript';ga.async=true;ga.src=('https:'==document.location.protocol?'https://ssl&#039;:'http://www&#039;)+'.google-analytics.com/ga.js';var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(ga,s);})(); #ani_back{margin: -10px 0 0 -18px;position:absolute;z-index:-999}#toTop{width:100px;border:1px solid #ccc;background:#f7f7f7;text-align:center;padding:5px;cursor:pointer;color:#333;font-family:verdana;font-size:11px} /**//**/ mr.mu Main Menu F服務與作品 Service U關於mrmu About mrmu C網站設計 Web Design K金工珠寶 Jewelry p教學資訊 Education Info Git教學:Git的遠端操作及利用Dropbox建立Server進行協同開發(Windows) 發佈時間: 2011-05-06 週五 1 則回應 Tweet /**/ 上一篇Git教學介紹了基本的Git操作,如果是一人開發還好,要是多人開發,那要怎麼一起play呢?如果要跟其他人一起開發專案,就需要架Git server,讓多位開發者可以透過存取遠端Server的Repo來進行協同開發,共同維護同一個專案。順帶一提,每位老手大大都建議先去Github.com開一個免費帳號練習一下。Github提供Git server,也就是遠端的Repo,但是免費的限制是你的Repo都是開放的,如果不想讓他人看到你的程式碼,就必須付費。你也許會因為工作的關係,所以不能公開專案的程式碼,若是一個人開發那還好,多人開發的情況下也許又覺得要自架Git server有點麻煩,有沒有經濟簡單的解決方案呢?在此提供一個簡單的方式,就是使用Dropbox作為Git server。*什麼是Dropbox?先在此大致簡介一下Dropbox:Dropbox是一個非常棒的雲端檔案儲存服務,把它安裝好後,你就可以指定本機端的任一目錄 (預設名叫My Dropbox)成為有雲端儲存功能的目錄,從此就可以在任何有安裝Dropbox的電腦存取該目錄內的檔案 (當然你要先登入自己的帳密),所以如果你有一台以上的電腦,或有iphone、android手機等(皆有dropbox app可下載),共享檔案就變得非常方便。除此之外,你還可以在dropbox的目錄裡開設公開分享的目錄,邀請其他朋友共同使用該目錄,如此該目錄也就成為了一個公槽。(還沒有dropbox帳號?按此申請dropbox帳號)*到底Git+Dropbox要怎麼玩?因為dropbox可以開公用目錄,因此我們可以開一個共用的目錄並邀請開發團隊所有成員一起共用此目錄,然後把git server放在這個目錄。在此假設這個共用的目錄叫OurProject。說是git server,其實就只是一個共用的Repo存在這裡。為OurPeoject目錄建立一個repo,請注意,記得使用加上bare參數: git init –bare如此這個目錄就會變成Repo了,而因為加了bare,這個目錄不會有.git目錄,而是把原先.git目錄中的東西都放進來,而且你日後在這個目錄中不會看到你的程式檔案。對,不會看到你專案的程式檔案哦,就是大家把最新進度從遠端Repo拿下來、更新、放回去,這個目錄裡都看不到專案的程式檔案。但是其實它已經記錄了最新進度,只是需要你「拿回家」才看得到。好,所以現在你的狀況應該是:專案的程式碼已經先放在一個Repo了(內有程式檔案),而dropbox也有一個Repo,但是用bare的方式建立的(只有git相關檔案,沒有你的程式檔案),dropbox的Repo我們就先稱之為「遠端Repo」。在dropbox目錄建好遠端Repo後(說是遠端,但其實位在我們本機的dropbox目錄,但也能說是遠端,因為跟其他人同步共用中),進入你專案所在的Repo目錄,並執行: git remote add origin Dropbox的目錄/OurProject如此就會在你專案Repo中建立一個遠端Repo的位址,然後把這個位址取名為origin,日後就可以把你的進度放進遠端Repo了。(通常本地端的Repo預設名是master,而遠端的Repo預設名就是origin)接著要把你專案Repo的進度放進遠端Repo中,供其他人取用,所以要在專案Repo目錄執行Push的指令: git push origin master如果push有成功,你在遠端Repo (dropbox目錄裡的OurProject目錄) 看不到你的程式檔案(剛剛有提過),要確定是不是真的有push進最新進度,我們需要再Pull回來看看,看現在遠端Repo裡是不是最新進度: git pull origin master *一下本機一下遠端,操作很複雜?簡單來說,add、commit、branch、checkout等這些都是你自己在本機跟自己玩,都是操作本機的Repo,當你要跟其他人一起玩時,你就要用push、pull,把別人的成果從遠端Repo拿下來(pull),自己玩一玩(先commit進自己的Repo,再修改、再commit…),再丟上遠端Repo(push),讓其他人也能抓最新進度去玩。通常我們從遠端Repo拿東西下來,可以用Clone、Pull、Fetch等方法,其差異 (就我的理解) 說明如下:Clone: 會把遠端的repo整個專案抓下來,放在目前路徑下的新目錄中。(所以不需要先把新目錄建立成Repo,就可以整包抓下來,隨包附上.git目錄)Pull: 會把遠端的repo整個專案抓下來,跟你目前所在的Repo及所用的Branch作合併(Merge),此指令等同Fetch+Merge。Fetch: 會把遠端的repo整個專案抓下來,但不跟你目前所用的branch合併,而是放在本地中的另一個Brance(remoteBranch)。*別人的code跟我寫的衝突了!!!!!!!!!在teamwork中一「推」一「拉」很有趣,尤其第一次在Pull別人的成果回來跟自己的成果merge時,有點怕怕的,但當你發現它自動merge作得很棒時,心情也跟著很興奮。但衝突就這麼發生了! 故事是這樣的…假設程式檔案Sample.php本來的code是:AA小明加上BB後,Pull server的code下來,跟自己的code完美的合併了(AA+BB沒衝突)小明commit到自己本地端Repo後,再Push回Server,目前Server最新版是:AABB你現在的code是之前Pull的,也就是:AA,現在你刪一個A,加一個C,成為了:AC接著你先commit到本地端,然後執行Pull,要合併別人的進度,但挫屎了,產生衝突!!衝突的原因是,Git不曉得第二個A是否要刪除 (有人要刪,有人要留),所以它會把這個衝突反應在Sample.php這個檔案中。開啟Sample.php,你會看到類似這樣的標記:第一個A的內容 <<<<<<< 你加的C內容 ======= 第二個A的內容 後面BB的內容 >>>>>>><<<<<<<  跟 >>>>>>> 標記描述了產生衝突的程式碼,其間以=======作為區隔,第一個部份就是你新加的內容,第二個是遠端的內容,你一看就會知道這邊有衝突,於是你要決定怎麼合併它們,手動更改檔案,處理好衝突,先Commit接著Pull再看看有沒有衝突發生,若還有衝突發生,就要再手動去檢查產生衝突的檔案,再Commit,然後再Pull看看。直到Pull成功後,就可以Push回Server,享受整併最新進度的快感。相關文章:Git教學:初學者使用心得分享(Windows) 分類: 網站設計 好用工具 網站設計標籤: dropbox git 網站設計 1 則回應給 Git教學:Git的遠端操作及利用Dropbox建立Server進行協同開發(Windows)Pingback: Git教學:初學者使用心得分享(Windows) @ mr.mu發表迴響 取消回覆您的電子郵件位址並不會被公開。名稱 […]

  • 匿名訪客 says:

    相對其他網路教學,您寫的相當清楚喔!

  • 訪客 says:

    您寫得真的非常清楚,本人感覺受益良多,謝謝。

發佈回覆給「Git教學:Git的遠端操作及利用Dropbox建立Server進行協同開發(Windows) @ mr.mu」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。

*

*

*

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料