afrag |
|
|||
記錄學習和成長的歷程 |
日歷
統計
導航常用鏈接留言簿隨筆分類隨筆檔案文章檔案搜索積分與排名
最新評論
閱讀排行榜評論排行榜 |
轉發自 道法術器的博客文章——Git教程Git是一個分布式的版本控制系統。 注意上面的”分布式的“這個限定詞,這一點是Git和CVS,VSN等其他版本控制系統最大的分別。 集中式版本控制系統最大的毛病就是必須聯網才能夠工作,也就是各個客戶端必須連接到中央倉庫才能夠工作。 分布式的版本控制系統中,不必有中央倉庫,每個人的電腦上都有一個完整的版本庫。我們可以在自己的電腦上修改、提交。如果兩個人需要交換修改的代碼,則需要將自己的修改推送給對方。 這個教程的主要目的是讓大家了解使用Git進行版本管理的一些基本操作和邏輯,讓大家對Git的使用有一個基本的了解。如果想要詳細了解每個命令的用法,或者要了解一些“高級”的命令,建議大家還是去看看Git的手冊。 2. 創建本地倉庫關于Git的安裝,這里就不講了,網上有很多文章,大家根據自己的系統,找一篇文章照著做就可以了。這里主要講解Git的一些概念和操作。 前面已經說過,Git是一個分布式的版本控制系統,每個人的電腦上都有一個完整的版本庫,我們把這個版本庫稱為本地倉庫。所有其他的倉庫,無論是同事電腦上的,還是中央服務器的,我們都稱為遠程倉庫。 創建本地倉庫有兩種方式,第一種是我們從零開始創建,第二種是從遠程倉庫克隆一份。 我們可以把版本倉庫理解為一個目錄,其中保存了我們所有讓git管理的文件。Git能夠跟蹤這些文件的修改、刪除,能夠追蹤這些文件的歷史,并且可以還原。 2.1 從頭開始創建本地倉庫從頭開始創建本地倉庫非常簡單。
2.2 從遠程倉庫克隆相比從頭開始創建本地倉庫,我們做得更多的是從遠程倉庫克隆一份。理論上來說遠程倉庫可以是任何一臺電腦上的倉庫,但是通常來說,我們會在github,或自己搭建的git服務器上創建中央倉庫,團隊中的所有成員都從該倉庫上克隆,并在后續將自己的修改上傳上去,或者從中央倉庫讀取其他同事的修改。因此我們這樣只講怎樣中央倉庫克隆到本地倉庫。
上面的命令中,版本庫的網址中是可以帶上協議、用戶名等信息的。Git支持http(s),ssh,git,ftp(s),本地文件協議等不同的協議。 3 使用本地倉庫進行版本管理3.1 工作區和暫存區為了能夠更好的使用本地倉庫進行版本管理,我們先了解一下工作區和暫存區的概念。 無論我們是從遠程倉庫克隆,還是使用 本地倉庫目錄是我們的工作區,我們要管理的文件都在這個目錄中。但是 在這個版本庫中,保存了很多的東西,其中最重要的是暫存區,以及分支。關于分支的概念,我們以后再解釋。目前來說,我們也只有一個分支,也就是Git自動為我們創建的master分區。還有一個指向master分區的指針,叫做HEAD。 前面我們已經提到過,在添加一個文件到Git本地倉庫中的時候,需要先執行 所以,我們其實可以執行多次 可以使用git status來查看有哪些修改沒有add到暫存區,有哪些修改在暫存區中,沒有提交到版本庫。 3.2 提交版本和查看歷史我們修改了一個或多個文件之后,可以使用
這個命令返回的信息中,包含了提交的分支,本次提交自動生成的版本號(commit id),輸入的備注,以及修改內容的統計信息。 注意這里的版本號可能不是完整的版本號,而只是版本號的前幾位。 我們可以看到,Git的版本號是一個用十六進制表示的隨機數字,這是為了避免各自在本地數據庫中提交時版本號的沖突。 Git會記錄下我們所有的版本歷史,可以使用 3.3 版本回退版本回退是版本管理系統最基本的功能。如果不能回退,要這系統何用。 要回退,首先需要知道回退到哪個版本。可以使用 使用 這下就體現了提交的時候使用備注的好處了,我們可以通過備注知道每一次修改的原因和內容,這樣才知道需要回退到哪個版本。 如果我們從今天的版本回退到了昨天的版本,還能不能回到今天的版本呢?可以的,但是前提要是你還記得今天的版本的版本號。如果我們前面的窗口沒有關閉,可以從 3.4 管理修改前面講過了工作區和暫存區。因此Git相比其他的版本管理系統多了一層。這一層有什么作用呢? 我們在提交的時候,提交的是暫存區中的內容,而不是工作區中的內容。因此,我們在修改的時候,可以多次將中間代碼添加到暫存區。我們既不需要產生大量的中間版本號和提交記錄,也可以保證不會因為后續的修改弄丟了前面的代碼。我們可以大膽的試錯,發現不合適了,很容易回滾到前一個版本。 我們可以使用 當然,刪除文件也是一種修改。一般我們把文件從Git的目錄中刪除之后,Git會檢測到,并且使用 如果是誤刪除的,可以使用 4 分支管理前面我們提到了,從 分支允許我們創建另外一條”路徑“,同時管理兩個版本的代碼。例如,我們完成了1.0版本,進入2.0版本的開發。但是我們同時需要進行1.0版本的維護,修復bug。這個時候,我們就可以同時維護1.0分支和2.0分支。 4.1 創建與合并分支分支就是提交記錄組成的一個時間線,因此一個分支可以表示如下: 分支master指向該分支中的最后一次提交。然后Git還會用HEAD指向master,表明當前的分支是master分支。每次提交,master都會向前移動一步,一直指向最新的提交,master分支的時間線也越來越長。 如果我們需要創建一個新的分支,例如從當前最新提交創建一個dev分支,那么其實只是創建了一個名為dev的指針,指向最新的提交,同時將HEAD修改為指向dev。使用的命令是 因此,在Git中創建分支非常的快,因為只是創建一個指針,然后修改做一個指針。 從現在開始,所有的提交操作都是針對dev分支了,因此,如果做了一次新的提交,dev會向前移動一步,但是master指針不變,如下圖: 這個時候,要合并分支也很容易,只需要先使用 當一個分支完成了歷史使命的時候,我們可以將其刪除。例如,如果我們要刪除dev分支,只需要執行 4.2 解決分支之間的沖突前面介紹的合并分支是最簡單的一種情況,當然現實世界通常不會這么簡單。現實中常見的情況時在兩個分支上我們都有提交,如下圖所示: 這個時候,如果我們執行 如果我們打開沖突的文件,會看到類似下面的內容:
對于每一個沖突,Git中會用 5 通過遠程倉庫合作一個團隊中有多個開發人員,他們一起協助來完成軟件開發的工作。因此,不可能大家都只在自己的本地倉庫中修修改改。通常來說,我們會配置一個”中央倉庫“,大家都把自己的本地倉庫中的代碼要提交到中央倉庫。 5.1 日常的工作流程在軟件開發過程中,我們首先是從中央倉庫下載代碼到本地倉庫,這個操作在前面的第2.2節中已經描述過了。 有了本地倉庫之后,日常的工作流程通常上:
5.2 從中央倉庫拉取代碼從中央倉庫拉取代碼,使用的是 還有一種情況,是從中央倉庫抓取一個新的分支。我們使用 如果要從中央倉庫獲取一個新的分支,比如dev分支,則需要先執行 5.3 推送分支到中央倉庫我們在本地做的修改,需要上傳到中央倉庫,使用的是 如果從上次下載代碼到本次推送之間,遠程倉庫上的代碼沒有變化,那么本次推送就沒有問題。但是通常來說,在團隊合作的時候,在這段時間內會有其他人推送了新的代碼到中央倉庫。這個時候使用 6 其他6.1 標簽管理在Git中,每一次提交都有一個版本號,但是這個版本號對人類很不友好。沒有任何含義,并且又長又難記。我們在日常的交流中無法使用這個版本號。 這種情況下,引入了tag的功能。Tag就是一個標簽,我們可以在重要的提交版本上添加一個tag,這個tag其實就是指向這一次提交的版本。我們可以給tag賦予有意義的名稱,例如V1.0這樣的,這樣方便我們日常的交流,和將來的查找。 在Git中打標簽非常簡單,執行 執行上面的命令的時候,默認是將標簽打在分支的最后一次提交上。如果要將標簽打在其他的提交上,可以使用 可以使用 我們創建的標簽都是在本地,如果需要將標簽推送到遠程倉庫,則可以使用 標簽是不能移動和修改的,但是可以刪除。因此,如果標簽打錯了,修改的方式就是刪除錯誤的標簽,重新創建正確的標簽。 如果標簽已經被推送到了遠程倉庫,則需要先刪除本地標簽,然后使用如下形式的push命令來刪除遠程倉庫中的標簽。
6.2 git stash操作有些時候,我們在工作的中途,會接到一些緊急的任務,比如生產環境的bug修復。這個時候我們手頭的工作才做了一半,既不能提交,也不能丟棄。但是我們又需要切換到另外的分支中來處理緊急任務,該怎么辦? git stash命令會將工作區的修改“隱藏”起來。如下例所示:
這個命令會將工作區中的修改創建一個存根,并保存到堆棧中。我們可以使用 當緊急任務完成之后,我們在切換回原來的分支,這個時候可以使用 6.3 git配置
|
![]() |
|
Copyright © afrag | Powered by: 博客園 模板提供:滬江博客 |