概述
Git 是目前世界上被最廣泛使用的現代軟件版本管理系統。Git 本身亦是一個成熟并處于活躍開發狀態的開源項目,它最初是由 Linux 操作系統內核的創造者 Linus Torvalds 在 2005 年創造。
Git 使用分散式架構,是分散式版本管理 DVCS(Distributed Version Control System)的代表。相較于例如 CVS 或者 Subversion 等集中式版本管理軟件,Git 并不是將代碼的所有修改歷史保存在中心服務器中。在 Git 中取而代之的是,所有參與項目的開發者都擁有各自的代碼完全拷貝,并在自己的拷貝上進行軟件開發。
分散式的架構也給 Git 帶來了極大的性能優勢。
比如說,現有一名開發成員 Alice 對代碼進行了一些改動,添加了一些在2.0版本中準備公開的功能,然后將這些修改以及一份簡單的說明進行了提交。隨后她又增加了一些另外的新功能,并又作了一次新提交。顯然這兩次修改在版本歷史中被分開各自進行了保存。在這之后 Alice 把代碼切換到了 1.3 版本,修復了一些舊版本中的 Bug(這和她新添加的功能沒有關系)。這次修復的目的是為了讓團隊可以在公開 2.0 版本之前,釋放一個 1.3.1 版本來解決 1.3 版本中的 Bug 問題。Alice 馬上又可以回到她之前進行的 2.0 版本功能開發之中(通過切換代碼分支),這些操作由于 Git 的分散屬性,都不需要通過網絡來連接到中央服務器進行,她甚至可以在飛機中完成這一切。當她完成所有工作,只需要向遠程的代碼庫推送(Push)自己的修改即可。
安裝Git
- Mac 用戶:Xcode Command Line Tools 自帶 Git (
xcode-select --install
) - Linux 用戶:
sudo apt-get install git
- Windows 用戶:下載 Git SCM
- 對于 Windows 用戶,安裝后如果希望在全局的 cmd 中使用 git,需要把 git.exe 加入 PATH 環境變量中,或在 Git Bash 中使用 Git。
加入倉庫
你的本地倉庫由Git維護的三棵樹組成,第一個是你的 工作目錄,它持有實際文件;第二個是 緩存區(Index),它像個緩存區域,臨時保存你的改動;最后是 HEAD,指向你最近一次提交后的結果。
對于一個全新的項目,想要提交到Git倉庫,需執行以下命令:
#將當前項目轉換為一個git倉庫,會在該目錄下新建一個.git目錄,內含git所需元數據
git init
git add --all
git commit -m "Initial Commit"
git remote add origin GIT遠程地址
git push origin master
如果想要檢出遠程項目,使用:
git clone GIT遠程地址
更改當前項目的遠程地址使用:
git remote set-url origin GIT遠程地址
git push origin master
注:origin 是 GIT遠程地址的別名,你也可以在 push 時將GIT遠程地址替換為 origin
基本使用
- 提交代碼:
git add .
,git commit -m "Initial Commit"
- 列出已緩存,未緩存,未追蹤的文件:
git status
- 在當前目錄下新建
.gitignore
文件,在文件里寫入要忽略提交的文件/目錄 - 顯示當前已提交的快照:
git log
,加入如-n 3
只會顯示 3 個提交,命令:git log --author="John Smith" -p hello.py
顯示 John Smith 作者對 hello.py 文件所做的所有更改的差異比較(diff) - 檢出分支:
git checkout <master>
,可以利用git log --oneline
查看每次提交的版本ID,然后通過git checkout <版本ID>
檢出那次提交的代碼 - 撤銷剛剛的提交:
git revert HEAD
分支
分支代表了一條獨立的開發流水線,使用git branch
命令,分支只是指向提交的 指針 ,理解這一點很重要。允許你創建、列出、重命名和刪除分支,git branch
和 git checkout
、git merge
這兩個命令通常緊密地結合在一起使用。
在 Git 中,分支是你日常開發流程中的一部分。當你想要添加一個新的功能或是修復一個 bug 時——不管 bug 是大是小——你都應該新建一個分支來封裝你的修改,這確保了不穩定的代碼永遠不會被提交到主代碼庫中,它同時給了你機會,在并入主分支前清理你 feature 分支的歷史。
- 創建一個分支,但不會自己切換到該分支下:
git branch <branch>
,使用git checkout <branch>
切換分支到該分支下 - 刪除一個分支,這是一個安全的操作,Git 會阻止你刪除包含未合并更改的分支:
git branch -d <branch>
- 強制刪除一個分支,即使包含未合并更改,如果你希望永遠刪除某條開發線的所有提交,你應該用這個命令。:
git branch -D <branch>
- 將當前分支重新命名:git branch -m <branch>
分支創建和切換后,在分支上的開發工作最終還需要合并到主干master,使用git merge
命令,合并分支非常簡單,首先我們應該切換到git checkout master
,然后將指定的分支合并到當前master中即可:git merge <branch>
,合并算法包含快速向前合并或者三路合并。
解決沖突
如果你嘗試合并的兩個分支同一個文件的同一個部分,Git 將無法決定使用哪個版本。當這種情況發生時,它會停在合并提交,讓你手動解決這些沖突。
合并需要自己手工修復,當你準備結束合并時,你只需對沖突的文件運行 git add 告訴 Git 沖突已解決。然后,運行 git commit
生成一個合并提交。
創建Pull Request
Pull Request 是開發者使用 GitHub 進行協作的利器。這個功能為用戶提供了友好的頁面,讓提議的更改在并入官方項目之前,可以得到充分的討論。
最簡單地來說,Pull Request 是一種機制,讓開發者告訴項目成員一個功能已經完成。一旦 feature 分支開發完畢,開發者使用 GitHub 賬號提交一個 Pull Request。它告訴所有參與者,他們需要審查代碼,并將代碼并入 master 分支。
當你提交一個 Pull Request 的時候,你做的事情是 請求(request) 另一個開發者(比如項目維護者)來 拉取(pull) 你倉庫中的一個分支到他們的倉庫。
舉個例子,A創建一個官方的開源項目,B fork了這個項目并做了功能的補充,如果B想把這個功能補充并入A的公開master,B可以創建一個分支用來編寫新功能,并切換到這個分支進行開發,開發完成后提交代碼,利用git push提交到自己的倉庫中,B可以創建一個Pull Request(提供標題和簡介)通知A,A會審查B的代碼,如果代碼有Bug,A可以評論指導B修改,這中間可以互動,當A認為B的代碼可以合并到master時,A點擊Merge Pull Request并入master,隨即關閉這個Pull Request,功能已被整合,其他使用A項目的人可以git pull最新代碼到本地倉庫中。
你現在應該已經掌握了如何將你的 Pull Request 整合到你的工作流。記住,Pull Request 不是替代任何 Git 工作流的萬金油,而是一種讓隊員間協作錦上添花的工具。