團隊開發之Git管理及使用

什麼是Git

以下摘自官網:

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency。

Git is easy to learn and has a tiny footprint with lightning fast performance。 It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows。

Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的專案。

Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。

Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的方式,不必伺服器端軟體支援。

Git和Svn的對比

說到版本控制,除了Git外,SVN也是比較常用的。寫本文的目的之一就是讓用過SVN的小夥伴可以快速的上手Git,如果不用分支的話,其實他們兩真沒有多大差別。

SVN工作原理

團隊開發之Git管理及使用

每一個SVN使用者都可以從伺服器checkout程式碼,同樣也可以像伺服器(commit)程式碼,可以更新(update)到別人提交的程式碼。

優勢:所有的操作都需要基於svn中心伺服器,所以操作起來必然很簡單。

正是因為所有的操作都要基於svn中心伺服器,所以只要svn中心伺服器出現衝突(conflict),錯誤(error)都會給整個團隊之中的成員帶來災難。

Git工作原理

正是因為SVN的劣勢所在,Git就應運而生,去掉了所有的操作都依賴於版本控制中心伺服器的設計。使用的高大上的分散式管理。

團隊開發之Git管理及使用

每個結點都可以充當控制中心的作用,所以從GIT伺服器複製(clone)一份到本地,同樣也可以單獨對自己本地git版本進行單獨管理。在針對單個git版本庫的操作(commit)、(pull)就如同Svn的commit與update操作。當然版本庫之間的操作就是拉取(pull),推送(push)

Git 與 SVN 區別點:

1、Git 是分散式的,SVN 不是:這是 Git 和其它非分散式的版本控制系統,例如 SVN,CVS 等,最核心的區別。

2、Git 把內容按元資料方式儲存,而 SVN 是按檔案:所有的資源控制系統都是把檔案的元資訊隱藏在一個類似 。svn、。cvs 等的資料夾裡。

3、Git 分支和 SVN 的分支不同:分支在 SVN 中一點都不特別,其實它就是版本庫中的另外一個目錄。

4、Git 沒有一個全域性的版本號,而 SVN 有:目前為止這是跟 SVN 相比 Git 缺少的最大的一個特徵。

5、Git 的內容完整性要優於 SVN:Git 的內容儲存使用的是 SHA-1 雜湊演算法。這能確保程式碼內容的完整性,確保在遇到磁碟故障和網路問題時降低對版本庫的破壞。

Git 使用

命令列操作

本部落格整理了一份比較完整的Git操作命令,以及一個Git專欄,專門記錄Git遇到的問題。地址如下:

Git命令操作文件

Git專欄

命令列看起來會很難記,操作沒有那麼直觀。其實,使用git,懂一些基本的命令就足夠了,常用的克隆 git clone、拉取 git pull、新增 git add、提交 git commit、推送 git push等,熟悉以上幾個命令,日常工作上一般都夠用了。

Git加入到環境變數中,除了Git自帶的命令列工具外,還可以在編輯器控制檯中直接操作:

團隊開發之Git管理及使用

團隊開發之Git管理及使用

客戶端 TortoiseGit

SVN常用的Win客戶端是TortoiseSVN,TortoiseSVN讓SVN的各種操作簡單化,當然了,Git也有類似的客戶端。TortoiseSVN這貨其實還有個兄弟叫 TortoiseGit,操作基本也 TortoiseSVN一致,所以,對於用過SVN的小夥伴,上手Git毫無壓力。TortoiseGit下載和操作都比較簡單,這裡就不贅述了。

百度一下,你就知道。

團隊開發之Git管理及使用

編輯器整合

當然,除了客戶端,還可以編輯器上整合Git,強烈推薦這種方式,用慣了能給你的開發速度提升一個檔。拿phpstrom為例:

開啟phpstrom,在setting->Version Control中找到Git,然後在Path to Git executable:選擇你所安裝的git。exe路徑,然後點選OK完成配置。

團隊開發之Git管理及使用

專案根目錄點選右鍵,下拉框有個Git,所有的操作都整合在這裡了,這樣就不用再開啟客戶端進行操作了。

團隊開發之Git管理及使用

當然了,也有些快捷方式,開啟一個有git配置的專案,你會發現右上角及右下角都有對應的git選項。

右上角是一些快捷操作,可以拉取、提交、檢視歷史記錄、還原等等。

而右下角的操作主要是與分支有關。

團隊開發之Git管理及使用

團隊開發之Git管理及使用

檔案變動

現在還用什麼對比軟體對比檔案的差異化,真的是太OUT了吧?Git整合到編輯器有個好處就是,當前專案存在檔案改動、檔案增加、檔案未在版本管理中,編輯器會以藍色、綠色、紅色顯示檔案(未發生變化的檔案預設是白色),這就很方便追蹤檔案改動了。

舉個栗子:

團隊開發之Git管理及使用

版本記錄

版本控制一個很重要的功能就是能記錄操作的版本及修改內容。整合之後編輯器能夠很方便的檢視Git操作記錄,

團隊開發之Git管理及使用

分支、提交人、修改檔案一目瞭然

團隊開發之Git管理及使用

衝突解決

編輯器整合Git之後,都可以在編輯器裡面解決掉。

團隊開發中怎麼使用

隨著開發團隊的擴大,程式碼覆蓋以及程式碼管理是一個讓人很頭疼的事,

Ftp毫無版本概念,覆蓋了,很難找回之前的程式碼塊,簡直就是災難啊。

SVN在多人開發的時候也不是很方便,因為他的分支是以目錄形式的,比如建立trunk、branches、tags這三個資料夾。切換分支相當於切換目錄,如果要開發多個分支,那一套程式碼就得存多個目錄,一點都不方便。

版本控制方面,Git和Svn都很優秀,但是在多人開發方面,Git的分支管理會比Svn的好用很多,下面介紹一下,在一個專案中如何使用Git,讓開發更高效。

首先,我們要做到的是:開發人員本地、測試站、線上都有版本控制,只要有問題,我們就可以進行程式碼回滾。多人開發使用Git管理並不難,可以根據分支和許可權很好的管理。

master分支:master分支是生產環境對應的分支,上面的程式碼是最新、最穩定的版本,master分支只有專案經理或者部門主管有push、merge等許可權,這樣保證線上程式碼的安全和穩健性。所有的分支都是從master分支克隆而來。

test分支:該分支作為測試分支,可以是測試站對應的分支,當有一個任務完成後,測試人員可以把對應的task分支合併到test分支,測試人員在test分支進行測試,

團隊開發之Git管理及使用

常見問題及解決方案

Git的學習成本高嗎?

如果你是小白,沒有接觸過任何版本控制的工具,那可能需要多搜搜相關的資料,瞭解一下基本概念,不過也不是什麼大問題,就是一個提升開發效率的工具,而且有 TortoiseGit這樣的視覺化客戶端,操作起來沒什麼難度;而對於有用過Svn的小夥伴,Git那就是信手捏來,TortoiseSVN和TortoiseGit的操作幾乎一致。

所以,不要有心裡壓力,無論是小白還是有過相關經驗,花個一兩天研究一下,上手完全沒有問題的。

Git不安全?

Svn大多數搭建在自己伺服器上,而剛接觸Git或者是未接觸Git的人,總以為Git就只能放在Github、碼雲等平臺,覺得不安全,對於這個問題,別人給的服務就是提供程式碼託管,保護隱私肯定是其中重要的一項,託管平臺就像銀行,而我們的程式碼就像資產,大家信任銀行才會把資產存進去,國內的碼雲以及全球最大的同性交流平臺—Github,哦,不不不,最大的程式碼託管平臺,都有對應的安全機制保護我們的程式碼安全的。那麼多大公司都在用,對於程式碼安全這塊,Git完全可以勝任。對於信任這個問題,我們可以自己Git平臺,把程式碼放自己伺服器上,還有就是使用 。gitignore 檔案遮蔽重要資訊。

。gitignore 檔案遮蔽重要資訊

這個檔案的作用就是告訴Git哪些檔案不需要新增到版本管理中。拿php專案為例,像快取、日誌、vendor等一般都是需要遮蔽的,而對於一些重要的資料,如 。env檔案,也是要加到 。gitignore檔案中的,這樣,介面地址、token、資料庫等重要資訊不會出現在程式碼版本里面,可以避免重要資訊的洩露,防止危害我們的資料安全。

搭建自助 Git 服務

如果覺得程式碼放別人家伺服器不安全,那完全可以自建Git服務,像使用 Go 語言開發的 Gogs,以最簡單、最快速和最輕鬆的方式搭建自助 Git 服務。支援的平臺包括 Linux、Mac OS X、Windows 以及 ARM 平臺。

有了這些,你還擔心安全問題嗎?