標籤:
這篇教程的預期,是希望沒有任何版本使用基礎的新手也可以掌握,所以細節較多,不當之處,歡迎指正。
一 、安裝 git 開發工具
如果要使用 git 進行版本管理,其實使用 git 命令列工具就完全足夠了,圖形化工具(無論是 git extentions ,還是TortoiseGit),都只不過是命令列的封裝。就功能而言,他們能做的,命令列全部可以做到;但命令列能做的,他們不一定可以做到。命令列更 加原生、本色,跨越平台,以一當十。建議熟悉 git 命令列工具。
但圖形化工具也有自己的優點,就是直觀。下面推薦的組合方案是:
Git 命令列(cygwin) + Git Extensions + Git Source Control Provider
——這個組合可以徹底解決中文檔案問題(包括中文檔案名稱、目錄名,以及在 github 中的正常顯示)。
1)安裝 cygwin 命令列工具
安裝教程見 http://gotgit.github.com/gotgithub/10-appendix/030-install-on-windows-cygwin.html
安裝過程中需要安裝的軟體:
- git-completion: 提供 Git 命令自動補齊功能。安裝該軟體包會自動安裝依賴的 bash-completion 軟體包。
- openssh:SSH 用戶端,提供 Git 訪問 ssh 協議的版本庫。
- vim:是 Git 預設的編輯器。
2)安裝 git extensions
【作用】
git extensions 必須依賴於命令列工具,所以第二個安裝。
它安裝之後不但可以使用,也自動在vs中加上外掛程式,可以在vs中非常直觀的、方便的操作。
【安裝方法】
下載網址:http://code.google.com/p/gitextensions/downloads/list 選擇GitExtensions226SetupComplete.msi那個帶Complete字樣的版本,它裡面整合了 KDiff3 工具。
下載之後,雙擊安裝,一路next,中間記得勾選 msysGit 和 KDiff3。
git extensions 安裝之後內建一個很全面的教程。
【配置】
我們知道,目前git命令列工具有兩種,一種是 cygwin 下命令列,一種是 msysGit 命令列,git extensions 可以配置使用哪一種命令列工具,如,我們選擇使用 cygwin,而不是 msysGit
第一個是:“使用者運行git的命令”
第二個是:全域設定檔,請點擊“Change HOME”按鈕,將目錄改為 cygwin 的目錄。
另外,git extensions 會把 cygwin 預設的編輯器 vi 改成它自己的,你可以在“全域設定”中改回來。
補充1:git extensions 的設定檔放在註冊表中,如果卸載,這些配置仍然保留,你可以再次安裝發生問題,可以檢查註冊表中相關配置項,是否有問題。
補充2:在安裝 git extensions 過程中,我們勾選了 msysGit,現在安裝完畢,其實你可以卸載 msysGit了,不過也可以保留,因為 msysGit 安裝目錄下內建 git 的所有命令的協助文檔。
3)安裝 Git Source Control Provider
【作用】
Git Source Control Provider 是 vs 的一個擴充外掛程式,但必須依賴於 git extensions,所以第三個安裝,它的作用是,可以顯示檔案狀態、顯示檔案曆史等,讓 vs 中檔案操作更加方便。
項目網址:http://gitscc.codeplex.com/
源碼:https://github.com/yysun/Git-Source-Control-Provider
視頻教程:www.youtube.com/watch?v=efS0kKvfi6k
【安裝方法】
在vs菜單中點擊“工具”的“擴充管理器”
然後線上搜尋git,出現第一個結果就是 Git Source Control Provider,然後點擊“下載”
然後點擊vs菜單的“工具”的“選項”,展開左側的“Source Control”,在右側的“當前原始程式碼控制外掛程式”中選擇“Git Source Control Provider”,然後點擊“確定”
啟用 Git Source Control Provider 之後,所有檔案顯示出狀態表徵圖。你可以在檔案上右鍵進入 Git 菜單進行操作。
下面通過建立一個全新的測試專案,來示範如何在 vs 中可視化操作 git 版本庫。如果完成了基本操作,你可以參與到實際的github項目,比如"我記錄開發架構"和“我記錄網站綜合系統(整合了“SNS/門戶CMS/論壇 /部落格/相簿/微博/wiki”等應用程式的互連網產品)”已經託管到github,網址是 https://github.com/wojilu/wojilu 。
二、建立版本庫
用 vs 建立一個項目,然後點擊“Git”菜單中的“Initialize new repository”
快顯視窗,讓你選擇需要納入git版本管理的目錄——
初始化之後,在項目目錄下,出現一個 .git 的隱藏檔案夾,這個檔案夾就是git版本庫。
和.git同處一個目錄的所有檔案,現在就納入了這個版本庫的範圍之內。
現在你在這個目錄下,可以執行 git 命令了。
比如下面就是在 git 命令列視窗中直接操作 git 命令,使用命令列,可以完成所有的 git 版本管理操作。
不過我們這一節主要講如何在 vs 中可視化操作 git,暫時不涉及命令列管理。
三、將檔案提交到版本庫
只有將項目中的檔案納入版本庫,我們才能享受到版本管理系統帶來的好處,比如瀏覽曆史版本,切換分支等……
1)首先,請關閉vs,然後重新開啟。如果不重新開啟,外掛程式 Git Source Control 不能監控檔案狀態。
重新開啟之後,檔案顯示狀態符號:前面顯示“+”加號,它表示這些檔案的狀態是“尚未納入版本庫”,需要你添加。
你可以點擊“Git”菜單中的“Commit”進行提交
出現如下提交視窗
我們看到,這裡需要提交的檔案很多,但其實,很多檔案是 vs 自動產生的臨時檔案,和項目內容沒有關係,不應該納入版本管理,比如 ***.suo 檔案,這時候,我們需要將這些檔案設定為“需要忽略的檔案”,讓 git 不理會他們。
2)設定忽略檔案
請關閉上面的 commit 視窗,點擊 vs 菜單 “Git”中的命令“Edit .gitignore”
出現忽略檔案的編輯視窗,這個視窗左側的內容區目前是空白,沒有內容。
不過右側列舉了一些常見的需要忽略的檔案(預設),請點擊右下側的“添加預設的忽略項”按鈕,將需要忽略的內容添加到左側內容區,然後點擊“儲存”。
然後開啟檔案夾,你會看到項目中出現了一個名叫 .gitignore 的檔案,它裡面的內容就是你剛才儲存的內容。
3)提交步驟a (加入暫存區)
再次點擊菜單“Git”中的“Commit”提交命令,現在提交視窗中顯示需要提交的檔案大大減少,比如 ***.suo 檔案就已經被 git 忽略掉了。
這時候如果直接點擊“提交”命令,則出現如下提示視窗,意思是“還沒有檔案在暫存區中。需要暫存並馬上提交所有檔案嗎?”
這句話什麼意思呢?這裡涉及到 Git 的一個暫存區( stage )的概念,在 Git 中有三個儲存檔案的地區:
1)工作目錄,就是你在硬碟上操作的這些目錄和檔案;
2)Git 版本庫,就是前面說的 .git 隱藏檔案夾。版本庫裡面又分成“暫存區”和真正的版本庫。
a)暫存區(stage),其實相當於在提交之前的一個緩衝區;
b)版本庫內容區,裡面存放了檔案的曆史內容、各個分支等……
總之,將一個檔案提交到版本庫其實就是這樣的流程——
1.工作目錄 --> ( 2.暫存區 --> 3.版本庫 )
為什麼 Git 需要一個暫存區呢?這是為了方便 commit 提交過程中的反悔撤銷等精細的操作。一旦加入暫存區(stage),即加入了 .git 中,但尚未提交到版本庫,有了這個緩衝,提交操作過程變得更加靈活。
總之,你的提交過程分成兩步:先 add 加入 暫存區(stage),然後提交(commit)。如果用命令列表示,就是
第一步:git add fileName
第二步:git commit -m "提交標題文字"
這兩個步驟對應到,就是左側的兩個視窗,左側上部是工作目錄,左側下部是暫存區,兩個視窗之間用“暫存(stage)”命令分隔,如。
你可以選定一個檔案,點擊途中左側的箭頭,將此檔案加入暫存區;也可以點擊右側雙箭頭,將所有檔案加入暫存區。
這個點擊雙箭頭的命令,其實和如下 Add Files 命令(項目中右鍵進入Git菜單)是相同的,都是將所有檔案加入暫存區。特別說明:如果檔案名稱或目錄名是中文,請使用 Add Files 命令代替此處的stage操作。
4)提交步驟b (真正提交commit)
將檔案全部加入暫存區之後,如所示,請在右下視窗中輸入提交說明資訊,請務必認真填寫,不要留空。每一次提交都要有明確的說明,這是以後版本瀏覽、管理的關鍵線索。
填寫“提交資訊(m)”之後,就可以點擊“提交”按鈕了,之後會彈出如下視窗,表示提交成功。
上面的操作非常直觀,但如果用git命令列,其實只要簡單的兩行命令即可:
git add .
git commit -m "我的第一次提交"
兩種方式各有優缺點。
這時候我們再看項目中檔案的狀態,檔案前面的“+加號”變成了“鎖”,表示檔案已經成功納入了版本庫。
四、瀏覽版本庫
1)準備工作,我們在版本中添加修改2個檔案,然後提交2次。
2)如何查看曆次提交記錄?請開啟“Git”菜單中的“Browse”命令
出現提交曆史視窗——
視窗中顯示了總共三次提交,在提交曆史中右鍵,可以看到相關的操作,比如分支、標籤(tag)等……
如果在項目中右鍵,然後點擊右鍵菜單的“Git - History”
還可以圖形化的查看提交曆史
五、同步到遠程伺服器
因為 git 是分布式版本系統,每個人在自己本機上,都有一個 git 版本庫的拷貝,為了和遠程其他版本庫同步,需要進行同步操作。
同步操作分成兩種,一種是 pull 拉取,一種是 push 推送。
下面,我們將項目推送到 github 我們註冊的項目上去。
1)我們點擊 如的“Push”命令
出現推送視窗,接下來點擊“管理遠程”,進行 github 項目的添加操作——
出現遠端管理視窗,請依次填寫
“名稱”、
“Url地址”(一般是 [email protected]:yourName/yourProject.git 格式)、
瀏覽“私密金鑰檔案”(你用 PuTTY 產生的 .ppk 檔案)、
“載入SSH密鑰”,
然後測試連接,最後“儲存”
系統開始抓取遠程資訊,成功之後,請切換到“預設拉取行為(擷取以及合并)”,在右側“遠程檔案庫”下拉框中選擇“origin”,“預設合并”中填寫“master”,最後點擊“儲存”
2)請關閉“遠程檔案庫”視窗,再關閉“推送”視窗並重新開啟(即重啟“推送”視窗),會發現剛才設定的 gihub 遠程庫 origin 已經自動填滿了——
點擊“推送”命令,開始推送,根據網速不同,可能需要幾秒或幾分鐘時間,請耐心等待,最後會提示推送成功。
六、檔案管理
【刪除檔案】
在 vs 中,因為有外掛程式的支援,所以可以直接刪除;刪除之後,需要提交一下。提交的時候 git extensions 會將刪除操作同步到版本庫中。
如,檔案“xxxFile.cs”被刪除之後,在 commit 視窗中顯示刪除標記“—”:
說明:如果是在命令列中,請不要直接使用 rm操作,而是使用 git rm 命令。
【如何查看被刪除的檔案?】
點擊 "Git" 菜單中的 "Browse" 命令,開啟提交曆史視窗,請點擊檔案尚未被刪除的某個提交,比如下面的 "add class1",然後切換下面的視窗到“檔案樹”中
在檔案數中,可以查看當前曆史中所有檔案。
另外,還可以在項目中右鍵菜單中點擊“Git - History”命令,進入相應的“Show Files”視窗中查看檔案數。
【如何恢複被刪除的檔案?】
在中,找到需要恢複的檔案,然後右鍵“另存新檔”,儲存到項目中即可。
【移動檔案】
1)在 vs 中直接移動即可。
2)如果被移動的檔案是中文名,git extensions 對話方塊會有bug,需要使用命令列工具。請開啟命令列,進入到 .git 檔案所在的目錄,輸入命令——
git add -u .
這個命令,比普通的 "git add ." 多了一個參數 -u,表示將各種變動也添加進來
【如何恢複剛做的修改?】
在提交視窗中,選中檔案,點擊“重設選中的檔案”,或者右下角的“複位更改”
或者在右鍵中 "Git" ->“Undo File Changes”
【修改最後一次提交資訊】
對剛才的提交後悔了?想更改最後一次提交?
新增一個提交,並點擊上面的“更改最後一次提交”,新的提交資訊將覆蓋上一次提交。
警告:只有當上一次提交尚未push到遠程版本庫的時候,才可以使用本方法;否則,對上一次提交的修改會引起混亂。
八、分支管理
在 git 中,分支非常簡單易用,建議經常建立分支。
比如,你有一個實驗性的想法,可以建立一個分支去測試,完全不影響正式的代碼。
再比如,要開發一個新功能,那就建立一個分支專門提交這個功能相關的代碼,如果開發完畢,將此分支合并到主分支即可。這種為特定而新開的分支,我們叫“特性分支(Feature Branch)”。它的一個重要優點是:如果新功能不能如期完工,也不會影響主分支的發布。
另外在bug修複等方面,git 的分支功能也非常方便易用。可以說,分支功能是 git 最棒的功能之一。
1)建立分支
填寫“分支名稱”,然後點擊“建立分支”
建立之後,解決方案管理器(Solution Explore 後面顯示當前所在的分支,比如顯示 branch1)
2)切換分支
注意:在切換之前,記得先提交,以保證尚未提交的檔案已經儲存到版本庫中。
點擊Git菜單中的“Checkout branch”命令,
然後選擇需要簽出的分支:
3)合并分支
點擊的“Merge”命令
然後選擇需要合并的分支:
合并之後,在你的當前分支中,就會出現目標分支的內容。
4)刪除分支
因為在git中建立分支是很容易、很頻繁的事情,所以,當某個分支沒有用處的時候,也就經常需要刪除。注意,如果分支還沒有合并,那麼刪除分支會導致此分支下的所有commit丟失,所以在刪除之前請先合并分支。
方法:點擊“Git”菜單中的“Browse”,進入git日誌列表,在有分支標記的上面右鍵點擊“刪除分支”命令:
5)分支“衍合”(rebase,又叫“變基”)
將一個分支在master上衍合,會執行如下步驟:
- 此分支中所有commit都會stash臨時緩衝;
- 然後刪除此分支;
- 在master分支之上重新建立此分支;
- 在新建立的分支上提交剛才緩衝的所有commit;
在衍合過程中,有可能發生合并衝突,這個往往需要你手工逐個解決。
衍合(變基)做法:先進入需要被衍合的分支,然後點擊"rebase"命令,在彈窗中 rebase on 後面選擇分支,比如在分支 branch1 中選擇master分支,表示將branch1衍合到master中( rebase on master)。
八、tag 管理
在 git 中,tag(標籤)經常用來標記版本,比如給某個提交打上 "v1.0" 的tag,以表示這是1.0版本。
1)建立tag
通過“Git”菜單的“Browse”命令,進入提交(commit)列表視窗,你可以在任意提交(commit)上面右鍵點擊“建立新標籤”命令,比如輸入“v1.0”
建立的時候建議一定要勾選“建立帶註解的標記”,如所示,填寫“訊息”。因為你打上的tag,別人未必能理解它的意思和目的,有註解的 tag 更加方便協同工作。另外,tag 名稱中不允許有空格。
2)刪除 tag
tag 不可以修改和移動,所以如果要修改或移動,請先刪除,然後添加一個新的 tag。
刪除方法:在 tag 上右鍵點擊“刪除標籤”即可。
3)tag 推送
在向遠程伺服器 push 推送資料的時候,預設狀態下,tag 不會被推送,你需要進入“推送標籤”(如所示),然後勾選“強制推送”,才能將 tag 推送上去。
注意:tag 一旦推送到遠程伺服器,就不要再改動,因為有可能導致一個相同的 tag 在不同使用者那裡含義不同,造成混亂。
4)在 github 中提供下載
Github 非常體貼,只要是打上 tag 的,都自動打包,提供下載。如,我給 wojilu 託管之後的第一個commit打上了 "v1.8.5" 的 tag,在 github 中,其他人就可以直接下載這個版本了。
下載之後,用vs2010開啟即可調試運行。
九、衝突合并
在分支合并的時候,往往發生內容衝突,大多數情況下 git 都會幫你自動合并,省掉很多麻煩。
但有些時候,git 無法處理,需要你手工解決。
一般有三種類型的衝突,需要你手工處理:
一個被刪除,一個被修改會提示你:選擇修改的檔案,還是刪除的檔案?
一個被刪除,一個新建立會提示你:選擇建立的檔案,還是刪除的檔案?
在兩個分支中分別作了不同的修改會提示你:使用 merge 工具手工修改衝突
下面簡單介紹一下如何使用合并工具 kdiff3。
比如在分支合并中,如果有衝突,會出現彈窗提醒
點擊“是”,出現如下合并工具視窗,請選擇右上方的“Open in kdiff3”
kdiff3在啟動的時候,也會出現一個彈窗
請點擊“OK”,然後出現kdiff3的主視窗
螢幕上有四個視窗,上面三個,依次是 base/local/remote視窗,下面是output視窗
A 視窗Base需要合并的兩個檔案的最近的共同祖先版本
B 視窗Local當前分支檔案
C 視窗Remote需要合并的另外分支的檔案
Output合并之後的檔案
合并方法:在Output檔案中的衝突地區,右鍵選擇A/B/C的相應內容。
選擇之後,如果不滿意,還可以在衝突地區直接編輯輸入
修改之後,儲存並退出即可。
補充說明:需要注意的是,有些衝突是邏輯上的衝突,是隱含的,工 具無法自動偵測出來。比如你修改一個函數的傳回值,使得他的含義變化;而別人是使用這個函數的,那麼,當你修改之後,別人的程式也許無法正常運行,但工具 並不能發現這種邏輯上的衝突。這個當然不是合并工具的問題,它需要的是程式設計者思維的謹慎周密。
詳解在Visual Studio中使用git版本系統[轉]