標籤:

Working with Git | 集中式工作流

各位好,這裡是 Chinas Prices Project 項目的知乎專欄。我是廈門大學信息科學與技術學院計算機科學系大二學生,在項目組裡具體負責資料庫有關事項。關於 CPP 項目,您可以在 這篇文章里了解到更多的信息。若您對這個項目感興趣,我們非常歡迎您與我們交流您的想法與見解。

—————————————————————————————————————————

在 上一篇文章里,我們介紹了 Git 與 GitHub 中的基本概念,利用這些基本概念,我們可以為我們的團隊協作建立起「工作流」的概念,並應用到實際的開發過程中。

工作流其實不是一個初級的主題,其背後的本質問題其實是有效的項目流程管理高效的開發協同約定

——"Getting Git Right"

一個合理的工作流保證了你的項目在隨著開發進程愈發複雜的時候仍然能夠井然有序地推進,這正是工作流的用武之地。

我們將簡單介紹幾種目前開發工作中最常使用的基於 Git 的工作流,並與以往存在「中心伺服器」的集中式工作流進行比對。

集中式工作流 (Centralized Workflow)

集中式工作流保留了在 SVN 下的工作風格,對於每一個 Repo,集中式工作流只使用 master 分支進行開發。開發者的開發流程為:

從 master 克隆分支到本地 -> 本地開發 -> 嘗試提交到 master ->

如果本地提交記錄和中央倉庫有分歧,則進行 rebase 將最新的提交合併到本地 ->

如果 rebase 時若發現衝突則解決 -> 提交到 master

通過這樣的流程,項目的 master 分支修改歷史一定是穩定、線性的。

下面我們以圖例展示一個使用集中式工作流的開發團隊中 John 與 Mary 兩人的開發歷程,圖片來自於 "Getting Git Right" 的中文翻譯版本,見文末鏈接。

1. 中央倉庫初始化

ssh user@host #使用ssh連接GitHub帳號ngit init --bare /path/to/repo.git #在/path/to/初始化一個裸(bare)倉庫repo.gitn

2. 開發者克隆中央倉庫

git clone ssh://user@host/path/to/repo.git #這裡使用clone操作n

3. John 開發功能 (Feature)

John 在本地進行功能開發。他對代碼倉庫所做的所有修改都會被保存到本地倉庫的緩存區。開發時 John 可能會用到這些命令。

git status #查看本地倉庫的修改狀態ngit add #暫存修改ngit commit #提交修改n

4. Mary 開發功能

Mary 對自己克隆的本地庫進行修改,這個過程和 John 的開發過程是完全獨立的。

5. John 發布功能

John 將自己的版本 push 到 master 分支。此時 John 的原有版本(初始倉庫)和中央倉庫一致,中央倉庫會接受此次 push 操作。

git push origin master #這裡使用了push操作n#origin是遠程倉庫別名,master是push操作的目標分支,一般可以省略這兩個參數n

6. Mary 嘗試發布功能

在 John 提交自己的版本後,如果 Mary 也直接使用 push 提交自己的代碼,她會得到這樣一段錯誤提示:

error: failed to push some refs to /path/to/repo.gitnhint: Updates were rejected because the tip of your current branch is behindnhint: its remote counterpart. Merge the remote changes (e.g. git pull)nhint: before pushing again.nhint: See the Note about fast-forwards in git push --help for details.n

因為此時 Mary 在嘗試著將自己的代碼提交到 master 分支,但是她的代碼版本並沒有包含 John 的修改,Git 發現 Mary 的原有版本(初始倉庫)和中央倉庫狀態(John 的版本)不同後,會拒絕這次提交,否則 John 的修改會被這次 push 覆蓋掉。

7. Mary 進行 rebase

Mary 可以使用 pull 操作將 master 分支上游的修改合併到本地:

git pull --rebasen

這個操作將首先更新本地中央倉庫到最新版本,再將 Mary 所做的修改遷移上去。如果在遷移過程中出現了衝突,則解決衝突後可以繼續進行 rebase 過程:

git rebase --continuen

如果發現了不可避免的衝突,可以回滾到 pull 操作之前的狀態:

git rebase --abortn

8. Mary 發布功能

至此,Mary 可以提交自己的更改到中央倉庫 master 分支:

git pushn

以上就是集中式工作流在 Git 上的實現,下一篇文章里我們將看到更為強大的、充分利用了 Git 的分散式特性和分支概念的 GitFlow 工作流。

若有錯漏敬請斧正 XD

===================================================================

更多項目介紹,請關注我們的項目專欄:Chinas Prices Project - 知乎專欄

項目聯繫方式:

  • 項目郵箱:zhangguocpp@163.com

  • 知乎:@iGuo@Suri(項目負責人) @林行健@Dementia (技術負責人)@張土不 (財務負責人) @好大一棵樹(運維負責人)

文章中圖片及部分原文來源於:

Getting Git Right - Atlassian Git Tutorial 及其中文翻譯版本。

在 Creative Commons Attribution 2.5 Australia License 下使用。

本作品採用知識共享署名 - 非商業性使用 - 相同方式共享 3.0 中國大陸許可協議進行許可,

商業轉載請聯繫作者。


推薦閱讀:

IDE 有必要集成 Git 嗎?
我的git筆記
【Git操作系列】Git由淺入深之基本原理

TAG:Git | GitHub |