Git是一個免費且開放源碼的版本控制系統(VCS),它用於跟踪文件的舊版本,可以回退並同時維護不同的版本。
Git是SVN和CVS的後繼者,這兩個是過去非常流行的版本控制系統。Git最初由Linux的創建者Linus Torvalds開發,如今已成為使用開源軟件的必備系統,你無法避免它的存在。
分佈式版本控制系統
Git是一個分佈式系統。許多開發人員可以從中央位置clone一個存儲庫,獨立地在某個代碼部分上工作,然後將更改提交回中央位置,所有人都可以更新。
Git使開發人員非常容易在一個代碼庫上同時協作,並提供了可以用來合併所有獨立更改的工具。
託管Git存儲庫的一個非常流行的服務是GitHub,特別是用於開源軟件,但我們還可以提到BitBucket、GitLab以及許多其他廣泛用於全球團隊的服務,用於公開和私有地託管他們的代碼。
如何安裝Git
在所有平台上安裝Git非常簡單:
OSX
使用Homebrew運行:
brew install git
Windows
下載並安裝Git for Windows。
Linux
使用發行版的包管理器安裝Git,例如:
sudo apt-get install git
或
sudo yum install git
如何初始化存儲庫
一旦Git安裝在系統上,可以通過鍵入git
來訪問命令行。
假設你有一個干凈的文件夾。你可以通過鍵入以下命令來初始化一個Git存儲庫:
git init
這個命令是做什麼的呢?它在你運行它的文件夾中創建了一個.git
文件夾。如果你沒有看到它,那是因為它是一個隱藏的文件夾,在某些地方可能不會顯示,除非你設置了顯示隱藏文件夾的工具。
將文件添加到存儲庫
讓我們看看如何將文件添加到Git中。輸入以下命令:
echo "Test" > README.txt
這樣就創建了一個文件。該文件現在位於目錄中,但是Git並未告訴它將其添加到其索引中,正如git status
所示:
將文件添加到暫存區
我們需要用以下命令將文件添加到暫存區:
git add README.txt
這樣就可以使文件對Git可見,並放入暫存區。
一旦文件在暫存區中,你可以通過鍵入以下命令將其從暫存區中刪除:
git reset README.txt
但是通常情況下,一旦添加了文件,你會提交它。
如何提交更改
一旦你有一個或多個更改添加到暫存區,你可以使用以下命令提交它們:
git commit -am "Description of the change"
這將清除暫存區的狀態,并將你所做的編輯永久存儲到記錄存儲中,你可以通過輸入git log
來檢查它:
分支
當你向Git提交文件時,你將其提交到當前分支。
Git允許你同時在多個獨立分支上工作,這些分支代表了主分支的分支。
Git非常靈活:你可以同時擁有無數個活動分支,它們可以獨立開發,直到你想將其中一個合併到其他分支。
Git默認創建一個名為 master
的分支。它在任何方面都不特別,只是最初創建的分支。
你可以通過輸入以下命令創建一個名為 develop
的新分支:
git checkout -b develop
git branch
命令列出了存儲庫中的分支。
在創建新分支時,該分支指向當前分支上最新的提交。如果你切換到它(使用git checkout develop
)然後運行git log
,你將看到與之前分支相同的日志。
推送和拉取
在Git中,你總是在本地提交。這是與SVN或CSV相比的一個非常好的優勢,因為在這兩種情況下,所有更改都必須立即推送到服務器。
你可以離線工作,做任意多的提交,一旦準備就可以將它們推送到服務器,這樣你的團隊成員或者如果你推送到GitHub,社區就可以訪問你最新和最好的代碼。
在你使用推送和拉取之前,你需要添加一個遠程!
添加遠程
遠程是你存儲庫的一個克隆,位於另一台計算機上。
我將用GitHub舉個例子。如果你有一個現有的存儲庫,你可以在GitHub上發布它。該過程涉及在該平台上透過網頁界面創建一個存儲庫,然後將該存儲庫添加為遠程,並將你的代碼推送到那裡。
要添加遠程,輸入以下命令:
git remote add origin https://github.com/YOU/REPONAME.git
要指定“origin”作為遠程,因為技術上你可以有多個遠程。那是我們之前添加的名稱,這是一種慣例。
推送
完成後,你可以將代碼推送到遠程,使用語法git push <remote> <branch>
,例如:
git push origin master
你將“origin”指定為遠程,因為技術上你可以有多個遠程。這是我們之前添加的遠程名稱,這是一種慣例。
拉取
拉取的語法與推送相同:
git pull origin master
告訴Git從“origin”拉取“master”分支,並將其合併到當前的本地分支中。
衝突
在推送和拉取中都存在一個問題要考慮:如果遠程包含與你的提交違反的更改,操作將失敗。
這是當遠程包含相對於你最新的拉取的更改時發生的,這些更改也會影響到你所工作的代碼行。
對於推送,通常可以通過拉取更改、解決衝突,然後創建一個解決了衝突的新提交來解決這個問題。
對於拉取,你的工作副本將自動被帶有衝突更改的編輯,你需要解決它們,然後創建一個新的提交,以便代碼庫現在包含在遠程上進行的引起問題的更改。
命令行和圖形界面
到目前為止,我講解了命令行Git應用程序。
這對於介紹Git的工作原理非常重要,但在日常操作中,你很可能會使用將這些命令通過漂亮的UI暴露出來的應用程序,儘管我認識的很多開發人員都喜歡使用CLI。
如果你需要在遠程服務器上使用SSH設置Git,則CLI(命令行)命令仍然是有用的。這並不是無用的知識!
也就是說,有許多非常好的應用程序可以簡化開發人員的生活,特別是當你更深入地研究Git存儲庫的複雜性時,它們會非常有用。簡單的操作在任何地方都是簡單的,但是事情可能很快擴大到一個你可能會發現很難使用CLI的地步。
最受歡迎的應用程序之一有:
GitHub Desktop
Free, 目前只適用於Mac和Win
Tower
Paid, 目前只適用於Mac和Win
GitKraken
免費和付費版本,支持Mac、Win和Linux
一個好的Git工作流程
不同的開發人員和團隊喜歡使用不同的策略來有效管理Git。這是我在許多團隊和廣泛使用的開源項目上使用的策略,我也看到許多大型和小型項目使用它。
這個策略受到著名的A successful Git branching model文章的啟發。
我只有兩個永久分支:master和develop。
以下是我在日常工作中遵循的規則:
當我開始處理一個新的問題或者決定加入一個功能時,有兩條主要路徑:
該功能很快完成
我所做的提交不會破壞代碼(至少我希望如此):我可以在develop上進行提交,或者創建一個快速功能分支,然後合併到develop。
該功能需要多次提交才能完成
也許在完成該功能並再次變得穩定之前,需要數天的提交:我會創建一個功能分支,然後在準備好後將其合併到develop(這可能需要幾週的時間)。
緊急修復
如果我們的生產服務器需要立即處理,例如我需要盡快解決的錯誤修復,我會創建一個簡短的緊急修復分支,修復問題,並在本地和測試機上測試該分支,然後將其合併到master和develop。
Develop是不穩定的,Master是最新的穩定版本
Develop分支將一直處於變動狀態,這就是為什麼在準備發布時應該進行“凍結”。代碼經過測試,並檢查每個工作流以驗證代碼質量,並準備將其合併到master。
每次將develop或另一個緊急修復分支合併到master時,我都會使用版本號進行標記,如果在GitHub上還創建一個發布,這樣如果出現問題,回到以前的狀態就容易了。