/

完整的Git指南

完整的Git指南

Git是一個免費且開放源碼的版本控制系統(VCS),它用於跟踪文件的舊版本,可以回退並同時維護不同的版本。

Git是SVN和CVS的後繼者,這兩個是過去非常流行的版本控制系統。Git最初由Linux的創建者Linus Torvalds開發,如今已成為使用開源軟件的必備系統,你無法避免它的存在。

分佈式版本控制系統

Git是一個分佈式系統。許多開發人員可以從中央位置clone一個存儲庫,獨立地在某個代碼部分上工作,然後將更改提交回中央位置,所有人都可以更新。

Git使開發人員非常容易在一個代碼庫上同時協作,並提供了可以用來合併所有獨立更改的工具。

託管Git存儲庫的一個非常流行的服務是GitHub,特別是用於開源軟件,但我們還可以提到BitBucket、GitLab以及許多其他廣泛用於全球團隊的服務,用於公開和私有地託管他們的代碼。

如何安裝Git

在所有平台上安裝Git非常簡單:

OSX

使用Homebrew運行:

1
brew install git

Windows

下載並安裝Git for Windows。

Linux

使用發行版的包管理器安裝Git,例如:

1
sudo apt-get install git

1
sudo yum install git

如何初始化存儲庫

一旦Git安裝在系統上,可以通過鍵入git來訪問命令行。

假設你有一個干凈的文件夾。你可以通過鍵入以下命令來初始化一個Git存儲庫:

1
git init

這個命令是做什麼的呢?它在你運行它的文件夾中創建了一個.git文件夾。如果你沒有看到它,那是因為它是一個隱藏的文件夾,在某些地方可能不會顯示,除非你設置了顯示隱藏文件夾的工具。

將文件添加到存儲庫

讓我們看看如何將文件添加到Git中。輸入以下命令:

1
echo "Test" > README.txt

這樣就創建了一個文件。該文件現在位於目錄中,但是Git並未告訴它將其添加到其索引中,正如git status所示:

將文件添加到暫存區

我們需要用以下命令將文件添加到暫存區:

1
git add README.txt

這樣就可以使文件對Git可見,並放入暫存區。

一旦文件在暫存區中,你可以通過鍵入以下命令將其從暫存區中刪除:

1
git reset README.txt

但是通常情況下,一旦添加了文件,你會提交它。

如何提交更改

一旦你有一個或多個更改添加到暫存區,你可以使用以下命令提交它們:

1
git commit -am "Description of the change"

這將清除暫存區的狀態,并將你所做的編輯永久存儲到記錄存儲中,你可以通過輸入git log來檢查它:

分支

當你向Git提交文件時,你將其提交到當前分支。

Git允許你同時在多個獨立分支上工作,這些分支代表了主分支的分支。

Git非常靈活:你可以同時擁有無數個活動分支,它們可以獨立開發,直到你想將其中一個合併到其他分支。

Git默認創建一個名為 master的分支。它在任何方面都不特別,只是最初創建的分支。

你可以通過輸入以下命令創建一個名為 develop的新分支:

1
git checkout -b develop

git branch命令列出了存儲庫中的分支。

在創建新分支時,該分支指向當前分支上最新的提交。如果你切換到它(使用git checkout develop)然後運行git log,你將看到與之前分支相同的日志。

推送和拉取

在Git中,你總是在本地提交。這是與SVN或CSV相比的一個非常好的優勢,因為在這兩種情況下,所有更改都必須立即推送到服務器。

你可以離線工作,做任意多的提交,一旦準備就可以將它們推送到服務器,這樣你的團隊成員或者如果你推送到GitHub,社區就可以訪問你最新和最好的代碼。

在你使用推送和拉取之前,你需要添加一個遠程!

添加遠程

遠程是你存儲庫的一個克隆,位於另一台計算機上。

我將用GitHub舉個例子。如果你有一個現有的存儲庫,你可以在GitHub上發布它。該過程涉及在該平台上透過網頁界面創建一個存儲庫,然後將該存儲庫添加為遠程,並將你的代碼推送到那裡。

要添加遠程,輸入以下命令:

1
git remote add origin https://github.com/YOU/REPONAME.git

要指定“origin”作為遠程,因為技術上你可以有多個遠程。那是我們之前添加的名稱,這是一種慣例。

推送

完成後,你可以將代碼推送到遠程,使用語法git push <remote> <branch>,例如:

1
git push origin master

你將“origin”指定為遠程,因為技術上你可以有多個遠程。這是我們之前添加的遠程名稱,這是一種慣例。

拉取

拉取的語法與推送相同:

1
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上還創建一個發布,這樣如果出現問題,回到以前的狀態就容易了。