如何優(yōu)雅地使用 Git?
DevWeekly收集整理每周優(yōu)質(zhì)開發(fā)者內(nèi)容,包括開源項目、工具資源、技術(shù)文章等方面,每周五首發(fā)于Github:DevWeekly,歡迎大家Star并收藏!
提起Git就繞不開一個概念:版本控制系統(tǒng)。
因此,在學習Git之前有必要先了解一下版本系統(tǒng)的概念,這樣才會有一個更加全局清晰的認識。
1 版本控制系統(tǒng)
版本控制系統(tǒng)是用來跟蹤、制作和管理軟件代碼變化的工具。它能夠幫助開發(fā)者存儲不同階段對文件所做的每一個改動,這樣我們、或者與我們協(xié)作開發(fā)的同事就可以在檢索到這些改動。
目前主要包含3種類型的版本控制系統(tǒng):
本地版本控制系統(tǒng)
集中式版本控制系統(tǒng)
分布式版本控制系統(tǒng)
下面,就分別介紹一下這3種版本控制系統(tǒng)。
1.1 本地版本控制系統(tǒng)

本地版本控制系統(tǒng)是位于你本地計算機上的一個本地數(shù)據(jù)庫,其中每個文件的變化都以補丁的形式存儲。
每一個補丁集只包含自上一版本以來對該文件所做的修改。
為了看到文件在任何給定時刻的樣子,有必要將文件的所有相關(guān)補丁按順序羅列在一起,直到逐個查看找到對應(yīng)的版本為止。
本地版本控制系統(tǒng)有一個很大的問題,所有東西都儲存在本地。如果本地數(shù)據(jù)庫出了什么問題,所有的補丁都會丟失。如果一個版本發(fā)生了什么事情,那么這個版本之后的所有修改都會丟失。
另外,與其他開發(fā)者或團隊合作是非常困難的。
1.2 集中式版本控制系統(tǒng)

集中的版本控制系統(tǒng)有一個包含所有文件版本的服務(wù)器,多個用戶可以同時訪問服務(wù)器上的文件,把它們拉到他們的本地計算機上,或者從他們的本地計算機上把它們推到服務(wù)器上。
相對本地版本控制系統(tǒng),這與其他開發(fā)者或團隊的合作變得容易。
這種結(jié)構(gòu)的最大問題是,所有東西都存儲在集中式服務(wù)器上。如果該服務(wù)器出了問題,沒有人可以保存他們的版本變化,拉動文件或進行協(xié)作。
與本地版本控制類似,如果數(shù)據(jù)庫被破壞,而備份沒有被保留,你就會失去整個項目的歷史,除了人們碰巧在他們的本地機器上有的單一快照。
比較知名的集中式版本控制系統(tǒng)有Microsoft Team Foundation Server (TFS)和SVN。
1.3 分布式版本控制系統(tǒng)

有了分布式版本控制系統(tǒng),用戶不僅是從服務(wù)器上拉取最新的文件快照,而是一種完全鏡像存儲庫,包括全部歷史。
因此,在一個項目上合作的每個人都擁有整個項目的本地拷貝,換句話說,擁有自己的本地數(shù)據(jù)庫和自己的完整歷史。
在這種模式下,如果服務(wù)器變得不可用或出了問題,任何一個用戶資源庫都可以將項目的版本拷貝發(fā)送給其他用戶,或者在服務(wù)器可用時再推回到服務(wù)器上。只要一個用戶包含一個正確的副本就足夠了。
而Git就是一個免費的開源分布式版本控制系統(tǒng),你可以用它來跟蹤文件的變化。
它可以實現(xiàn)對版本庫的新增、修改、刪除等操作。如果做了修改,那么由誰做的?在什么時間和日期做的?做這個修改的原因是什么?
Git都會記下這些行為,所以,總結(jié)而言,Git具有如下功能:
可以跟蹤倉庫變化
可以提交、撤銷、修改工程
可以創(chuàng)建一個項目的多個副本,每個副本都可以單獨處理
不同副本中的變化可以被比較,也可以被合并
2 為什么用Git?
在做一個有許多組件的大項目時,往往會有多個開發(fā)者參與,每個開發(fā)者都可以通過Git來對項目代碼進行管理。
例如,新增了功能之后可以用來提交代碼,如果操作失誤可以撤銷動作,也可以看到項目經(jīng)歷了哪些變化。
換句話說,通過Git,我們可以更加輕松便捷的管理代碼倉庫,實現(xiàn)協(xié)同開發(fā)。
了解了Git的價值和作用,下面就來安裝Git并開始用起來吧!
2.1 安裝Git
如果想要在我們的電腦上安裝Git,可以訪問Git的官方網(wǎng)站上下載適合你的操作系統(tǒng)的最新版本Git,它支持Windows、macOS、Linux/Unix。

下載后,按照不同操作系統(tǒng)的軟件安裝方式安裝該軟件,這與安裝其他軟件一樣,以Windows為例,下載后雙擊安裝即可,每個選項都可以選擇默認,然后點擊下一步。
安裝完成后,打開cmd(命令提示符)或終端,輸入下面命令來檢查git是否已經(jīng)安裝完畢:
git --version

如果返回了上圖中的信息,說明已經(jīng)安裝成功。
3 使用Git
通過前面的步驟已經(jīng)完成了Git的安裝,接下來就是學習如何使用Git。
但是,在正式使用之前,還有一件事需要做,我們需要對Git進行一下配置。
我們需要設(shè)置用戶名和電子郵件地址,Git 會用它來識別誰做的修改。
3.1 Git配置
如前面所述,我們需要在Git中配置一下用戶名和電子郵箱,可以通過如下命令完成配置:
git config --global user.name "YOUR_USERNAME"
git config --global user.email "YOUR_EMAIL_ADDRESS"
這里一定要確保在相應(yīng)的字段輸入正確的用戶名和電子郵箱地址。
3.2 Git初始化
Git已經(jīng)安裝了,但是,當你創(chuàng)建一個名為“Git tutorial”目錄時,你會發(fā)現(xiàn)它和正常的目錄沒什么區(qū)別,我們執(zhí)行g(shù)it命令也不起作用。

這是因為還沒有進行Git初始化。
要是倉庫真正起作用,我們需要進入到相應(yīng)的目錄,執(zhí)行下面初始化命令:
git init

現(xiàn)在 Git 可以正式工作了。
4 Git命令
前面反復(fù)提到,我們使用過程中經(jīng)常用于代碼的提交、修改、撤掉等操作,這時候就需要用到一些Git命令。
下面,就來介紹一些Git中常用的命令。
4.1 git status
這將告訴你使用該命令時項目的狀態(tài),你做了哪些修改、哪些尚未提交等。
例如,如果我在前面已經(jīng)創(chuàng)建的Git tutorial文件夾中添加了兩個新文件,Git and Github blog cover.png和Superhero Git.png,然后執(zhí)行命令,就可以看到下面輸出信息:
git status

上圖中的提示信息表示,我們新增了兩個文件,但是還沒有提交(commit)。
4.2 git add
如前面提示的那樣,我們新增了兩個文件,但是Git并沒有追蹤到,這時候就需要我們來高速Git新增了內(nèi)容,然后它才可以追東文件夾的變化。
有兩種方法可以做到這一點,一是把所有新增文件全都添加上去,另一個就是添加指定文件:
添加所有文件
git add .
添加指定文件
git add "file_name"
接下來再使用git status命令來看看在我把 "Git and Github blog cover.png "添加到 Git 之后發(fā)生了什么:

這里你可以看到,現(xiàn)在 Git 識別出我添加了一個新文件。但是,仍然沒有提交。
順便,來講一下Git的不同狀態(tài)。
Git將文章狀態(tài)分為如下幾類:
Unstaged
Staged
Committed
Modified
當文件沒有被添加到 Git 時,它處于unstaged狀態(tài)。
當文件用git add "file_name "添加到Git中時,它處于staged狀態(tài)。在這種狀態(tài)下,所有必要的修改都已經(jīng)完成,可以提交了。
當我們用git commit -m "commit message "命令保存項目的狀態(tài),點擊項目的快照,這個狀態(tài)就被稱為Committed狀態(tài)。通過創(chuàng)建一個提交,你的工作被保存在本地,如果將來你的項目出現(xiàn)一些問題,你可以很容易的回滾到之前的版本。
當我們對提交的文件進行修改時,它就進入了Modified狀態(tài)。
4.3 git commit
在解釋這個命令之前,首先在 "Git tutorial "文件夾中添加一個 "sample.txt "文件,并將該文件夾中的所有文件使用git add .命令添加Git。
添加完所有文件后,我們將用命令創(chuàng)建我們的第一個提交:
git commit -m "commit message"

現(xiàn)在當你看到git狀態(tài)時,它會說 "nothing to commit, working tree is clean",這意味著所有的文件和所做的修改都被保存了。
一個提交就像賬本上的一個條目,包含以下信息:
用戶名和電子郵箱
提交的日期和時間
提交信息
此次提交的唯一哈希碼
我們可以通過如下命令查看這些提交信息:
git log
這將給你返回項目中所有提交的信息。

這樣,我們就完成了一次代碼提交。
4.4 git branch
Git 分支是一個非常強大的功能,也是一個需要了解的重要功能。
Git有一些使用非常頻繁的場景,用它為項目創(chuàng)建多個副本,并允許你分別對它們進行操作,Git就是通過分支實現(xiàn)了這一點。

檢查項目中的分支
git branch

創(chuàng)建一個新的分支
git branch "branch_name"
這將創(chuàng)建一個新的 Git 分支,我們的整個項目將被復(fù)制到該分支。
現(xiàn)在,當我們檢查項目中的分支時。我們會看到一個新的分支 "my_branch"。

然而,你可以看到星號(*)仍在main分支上,這意味著你仍然在項目的主分支(主副本)上工作,而不是在新的分支上。
要切換到新的分支,需要用到checkout命令:
git checkout "branch_name"

可以看到,它已經(jīng)切換到了新分支my_branch。
在這個分支中,你可以做任何修改,它不會影響項目的主分支內(nèi)容。
Git的命令有很多,這里只是簡單的介紹了4個比較常用的命令,用來高速大家Git是如何工作的。
如果對Git其他命令感興趣,推薦看一下一篇文章Git Cheat Sheet,這篇文章里詳細的介紹了50個會用到的Git命令。
5. 輔助工具
沒有完美無暇的工具,git也是,當然,有些功能僅僅依賴git是無法完成的。
一些強大的輔助工具能夠讓開發(fā)過程中事半功倍,效率得到極大的提高,下面就來介紹2款git輔助/增強工具。
5.1 tig
Tig是一個基于ncurses的git文本模式接口。它的功能主要是作為一個Git存儲庫瀏覽器,但也可以幫助在塊級別上分段提交更改,并充當各種Git命令輸出的分頁器。
5.2 oh-my-zsh
“Your terminal never feltthisgood before.”
提到命令行工具,首推的自然是這款大殺器,bash的替代工具。bash算得上一款中規(guī)中矩的shell工具,沒有什么缺陷,但是也談不上優(yōu)秀,在很多方面考慮的還不夠周到,例如,自動補全、語法、高亮顯示、提示符等。
提到oh-my-zsh,那就厲害了,102kStar、250+插件、125+主題、1450+貢獻者......從這一系列的數(shù)字中就可以體現(xiàn)出這款shell工具的生態(tài)有多么完善,也足以體現(xiàn)它有多么強大。
zsh是一款bash替代工具,為什么卻在這里提及呢?
因為,它的確在git的使用過程中提升了很大的效率。
當我們在Linux下開發(fā)時,默認的命令提示符是不指示分支信息和修改狀態(tài)的,當然,通過修改Linux配置文件寫一個函數(shù)也可以實現(xiàn)這項功能。
但是,我還是更推薦使用oh-my-zsh,像下面這樣,
