Git | 如何優♂雅地管理版本

寒食君發表於2018-04-28

Git

什麼是Git?

Git直接翻譯是「蠢貨,飯桶」,然而卻是由天才開發出來的,被全世界最活躍的開發者使用的版本管理系統。可能是一些黑色幽默吧,就像Geek這個詞一樣。

這裡簡單介紹一下,詳情請查閱資料,本文主要是要講解一下使用中的一些問題。

Git是一款免費、開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的專案。  Git的讀音為/gɪt/。

Git是一個開源的分散式版本控制系統,可以有效、高速的處理從很小到非常大的專案版本管理。 Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。

常用基本命令

git init:初始化 git clone:克隆 git status:檢視狀態 git add:新增 git commit:提交 git pull:拉 git push:推

以上幾個命令比較簡單,略微查下資料即可順利使用。

稍複雜基本命令

git log: 檢視所有commit記錄。

git tag: 在進行客戶端開發時,常會考慮到版本。使用git tag v1.0,那麼就在當前程式碼狀態下新建了一個v1.0的標籤,使用git tag可以檢視當前所有標籤。使用git checkout v1.1的話,那麼就切換到v1.1的程式碼狀態下。

git diff: 比較當前檔案和暫存區的差異,兩次commit之間的差異,兩條分支之間的差異,兩個版本庫之間的差異。

git checkout: 切換,checkout可以切換標籤,分支。checkout還能撤銷還沒有add進暫存區的程式碼,比如git checkout readme.md即可撤銷對於md文件的改動。

git rm --cached: 移除暫存區中等待提交的程式碼

git remote add origin test: 本地倉庫與遠端名為tes的t倉庫進行關聯

別名alias

當經常使用Git時,會在輸入命令上消耗一些時間,尤其是一些比較長的命令,這時候使用者可以自定義別名,用來簡化命令。比如: git config --global alias.co checkout git config --global alias.ci commit git config --global alias.psm 'push origin master' git config --global alias.plm 'pull origin master'

###下面是這篇文章所要講的重點:團隊協作。

####分支

  • 什麼是分支?為什麼需要分支?

可以設想這麼一個情況,假如一款產品只有一份程式碼,而需要多人開發,那麼每個人都在這一份程式碼上隨意修改,那豈不是亂了套?

這時候我們就需要用到分支,使一個專案組中的不同開發者相互獨立,互不干擾。 在雲端,首先需要一份程式碼之源,我們稱之為:主分支(master),猶如青藏高原巴顏喀拉山脈之於黃河。另外一條重要分支是開發分支(develop)。

可以概括為: master:隨時處於準備釋出狀態 develop:最新的開發狀態

  • 初步協調團隊

線上一般保留master,develop兩條分支,開發者首先從master分支pull下程式碼,然後在本地基於master再新建本地develop分支,然後在develop分支上進行開發。

  1. 若在本地完成開發內容,可以將本地develop合併到本地master,將本地master推到線上master,切換回本地develop,將本地develop推到線上develop。(有點拗口,其實就兩個步驟)
  2. 若在本地只開發到一半,可以將本地develop推到線上develop。
  • 命令列
  1. git branch test :新建test分支。需要提一下的是,所建分支是基於當前分支的。
  2. git checkout test:切換到分支test
  3. git checkout -b test:將上述兩步合為一步。
  4. git push origin test:將本地test分支推送到遠端倉庫。
  5. git branch:檢視本地分支列表。
  6. git branch -r:檢視遠端分支列表。
  7. git branch -d test:刪除本地分支test
  8. git branch -D test: 強制刪除本地分支,為什麼要強制刪除?因為在一些情況下是無法常規刪除的,比如:你的test分支本身還存在未合併的程式碼,此時想要使用 git branch -d a是無法刪除這個分支的,會出現智慧提示。
  9. git push origin :test:刪除遠端分支。
  10. git checkout develop origin/develop:將遠端分支遷移到本地。

####合併 合併有兩種方式:merge rebase

  • merge

假如在test分支上進行開發,開發完成後想要把分支合併到master分支。

  1. 首先需要切換到master分支 git checkout master
  2. git merge test 不出意外就能將test分支合併進來,但是需要考慮意外情況:發生版本衝突。
  • rebase rebase和merge有異曲同工之處,使用rebase也能達到合併分支的效果。 git checkout master git rebase test

但是這兩點的差異在哪?這是stormzhang的一個比喻:

rebasemerge 的區別你們可以理解成有兩個書架,你需要把兩個書架的書整理到一起去,第一種做法是 merge ,比較粗魯暴力,就直接騰出一塊地方把另一個書架的書全部放進 去,雖然暴力,但是這種做法你可以知道哪些書是來自另一個書架的;第二種做法就是 rebase ,他會把兩個書架的書先進行比較,按照購書的時間來給他重新排序,然後重新放置 好,這樣做的好處就是合併之後的書架看起來很有邏輯,但是你很難清晰的知道哪些書來自哪個書架的。

衝突

兩個人在兩條分支上開發不同的功能,然後依次合併到主分支,一般來說兩人各司其職是不會出現問題的。但是有些情況,兩個人對同一塊公共程式碼進行了更改,比如工具類。 此時第一個人可以順利合併master,但是第二個人提交時會出現衝突,需要手動解決衝突才能順利合併。

在解決衝突問題時,我們可以根據提示的程式碼差異進行更改後重新提交。

Stash

假如我們已經在一個分支開發到了一半,現在需要切換到別的分支去完成一些任務,那麼現在當前的程式碼如何保留呢?

此時需要用到stash,當然前提是沒有commit。 首先執行 git stash 此時會將還沒有commit的程式碼儲存到一個暫存區,此時執行git status檢視,會發現當前分支沒有等待提交的程式碼。 git stash list可以 檢視暫存區有多少條記錄(一條分支暫存的所有程式碼只會生成一條記錄)

此時可以切換到其他分支,將任務完成,再切回到原來的分支,此時,如何將未提交的程式碼還原? 執行git stash apply,然後使用git stash drop將暫存區的記錄刪除。 而git stash pop相當於將上述兩步變為一步。

進階協調

理想化的狀態是這樣:比如有三個人開發一款產品,那三個人分別建立三個分支,在各自的分支上完成後合依次合併到master。而現實情況的干擾因素卻多得多。這時候需要用到分支管理流程GitFlow

  • 一般狀態下有兩個主要分支: master:隨時處於準備釋出狀態 develop:最新的開發狀態

如果出現了線上版本出現嚴重bug需要緊急修復,或者某些功能完成後出現了需求變更,這時,需要再引入三個輔助分支。

  • feature: 開發新功能的分支, 基於 develop, 完成後 mergedevelop
  • release: 準備要釋出版本的分支, 用來修復 bug,基於 develop,完成後 mergedevelopmaster
  • hotfix: 修復 master 上的問題,緊急情況, 等不及 release 版本就必須馬上上線. 基於 master, 完成後 mergemasterdevelop
情景:

假如我們現在的專案有masterdevelop分支

  • 現在我準備開發一個登入功能,B同學準備開發一個註冊功能,那麼我需要基於develop分支新建 git branch feature/login,B同學需要基於develop新建git branch feature/register

  • 比如突然說線上版本的圖片顯示出了bug,需要緊急修復,儘快上線,那麼需要在master分支下執行 git branch hotfix/imgDisplay,修復完成後合併到masterdevelop

  • 如果某一階段開發的差不多了,功能都已經合併到了develop,現在需要對develop上的程式碼進行一個整體的測試,假如測試通過,可以釋出到正式環境,此時可以基於develop新建一個分支git branch release/v1.0

這是一個規範化的分支管理流程,可能在小團隊的開發中,有些步驟可以忽略,但是我建議還是按照這一套邏輯管理程式碼會更為高效。

當然,如果你覺得輸入這些命令很麻煩,尤其是可以將命令列合併為命令塊的情況,你可以使用gitflow 推出的一套工具,簡化命令。開源地址:https://github.com/nvie/gitflow

Git | 如何優♂雅地管理版本

Git | 如何優♂雅地管理版本

相關文章