目標讀者:了解 Git 的基本概念,能夠使用 Git 進行基本的本地和遠程操作。
######### 有關 Git 的基礎知識可以參見 知乎回答-怎樣使用 GitHub?,天豬(劉勇)給出了一些很好的學習資料。
本文介紹了小團隊中 Git 管理的基本使用流程。
小團隊的代碼管理可以采用這樣一種方式:項目存在一個中心遠程倉庫,作為團隊成員進行代碼交流的主要場所。同時可以存在一些成員遠程倉庫,用於局限在團隊中部分成員間的代碼交流。並將成員分成以下幾類不同的角色:負責人、普通組員、預發布責任人 和 版本修復責任人。下面的章節具體介紹了各類角色的 Git 使用流程。
基本須知:
需要多個人共同完成的分支可以建立遠程分支,單個人完成的分支只建立本地分支即可。
一、負責人
負責人的職責:管理遠程倉庫。
負責人的工作均可直接在遠程倉庫完成。
1.創建項目
- 創建公有項目
- 添加README.md
- 添加證書
- 添加忽略文件
- 創建 dev 分支
2.其他
- 更新 README.md 文件
二、組員
工作流程:
- 克隆項目
- 簽出並創建 dev 分支,使其跟蹤遠程的 origin/dev 分支。
- 在dev分支基礎上創建自己的分支 member* 。
- 在自己的分支上添加文件
- 在自己的分支上修改文件
- 合並到dev分支
- 推送dev分支到origin/dev分支
// 更新 .gitignore 文件
- 從 dev 新建一個分支 ignore (如果預測變更頻繁就建立一個遠程分支,現在一般都有模板,偶爾有個沒有忽略的直接在dev分支上改就可以了)
- 更新忽略文件
- 盡快合並到\推送到 origin/dev 分支 (避免兩個組員同時更改該文件造成沖突。)
1.創建本地倉庫
$ cd [項目路徑]
$ git clone https://coding.net/tangyikejun/GitTest2.git
$ git checkout -u -b dev origin/dev
$ git checkout -b [MEMBER_NAME];
2.更新本地倉庫
$ git add .
$ git commit -m”your comments”
// … // 多次提交后完成了一項新的功能,自己的分支下能正常運行
$ git checkout dev
$ git merge --no-ff [MEMBER_NAME] // [MEMBER_NAME] 是自己的分支名稱
$ git push
3.更新 .gitignore 文件
$ git checkout dev
//… // 更新忽略文件
$ git add .
$ git commit -m“更新.gitignore文件”
$ git push
4.常用查詢命令
$ git branch // 查看自己所在分支 以及自己所擁有的分支
$ git log --pretty=“%h - %cn(%ci): %s” --graph // 查看自己的提交記錄
$ git reflog // 查看自己的操作歷史
$ git status // 查看本地倉庫當前的文件狀態
$ git blame [FILE_PATH] // 查看文件的每一部分最后由誰改動
5.意外情況處理
意外:推送代碼到遠程 dev 分支時發生沖突。
解決方案:先把 遠程倉庫的 origin/dev 分支拉取下來,解決沖突文件后再推送。平時的時候盡量避免不同組員更改同一個文件。
$ git push
// … // 遇到錯誤
$ git pull
// … // 解決沖突
$ git add .
$ git commit -m”solve conflict:由於XX原因出錯,修改XX文件解決問題”
$ git push
意外:不小心把自己的工作成果push到了master分支。
解決方案:先對master進行回退,再使用git push -f將錯誤的提交刪除。
意外:錯誤地把文件添加到git倉庫並推送到了遠程。
解決方案:先將文件從git倉庫中移除,但是保留工作目錄中的對應文件。然后將該文件添加到忽略文件中,再重新進行提交。命令如下:
$ git rm --cached [FILE_PATH]
… // 將該文件添加到 .gitignore 文件
$ git add .
$ git commit -m"detach file XXX"
$ git push
三、預發布責任人 & 版本修復責任人
1.預發布責任人
當需要發布新的版本時,預發布責任人:
- 基於最新的 dev 分支創建一個 release-版本號 分支
- 進行修繕工作
- 合並到 dev 分支
- 合並到 master 分支
- 打標簽
- 刪除 release-版本號 分支
$ git checkout dev
$ git pull
$ git checkout -b release-1.2
//… // 進行修繕工作
$ git checkout dev
$ git merge --no-ff release-1.2
$ git checkout master
$ git merge --no-ff release-1.2 // 在評論中寫入相比上個版本新增的功能,修復的bug等詳細內容
$ git tag v1.2
$ git branch -d release-1.2
使用 git show [TAG_NAME]可以查看標簽對應的提交信息。
2.版本修復責任人
當新發布的版本發現 bug 時,版本修復責任人:
- 基於最新的 master 分支創建一個 hotfix-版本號 分支
- 進行debug工作
- 合並到 master 分支
- 打標簽
- 合並到 dev 分支
- 刪除 hotfix-版本號 分支
$ git checkout master
$ git pull
$ git checkout -b hotfix-1.2.1
//… // 進行修繕工作
$ git checkout master
$ git merge --no-ff hotfix-1.2.1
$ git tag v1.2.1
$ git checkout dev
$ git merge --no-ff hotfix-1.2.1 // 在評論中寫入修復的bug等詳細內容
$ git branch -d hotfix-1.2.1
3.意外情況處理
意外:某組員完成自己的任務后合並到 dev 分支,推送時發現 release 分支的修繕工作更改了自己原來的文件,產生了沖突。
解決方案:把 origin/dev 分支拉取下來,將沖突解決后再次提交。(注意這里解決沖突后 master 分支上的文件與該組員的工作成果依舊是有沖突的。除非該組員解決沖突時不更改 relese 時的修繕代碼,而僅僅更改自己的代碼來解決問題。因此,一旦有沖突產生,最好雙方進行合理交流達成一致意見。減少沖突。)
四、成員遠程倉庫
當某個團隊成員希望其他成員協助完成他的編程任務時,該成員可以為自己的本地倉庫創建一個遠程倉庫作為成員遠程倉庫,方便其他成員協助。建立成員遠程倉庫可以避免中心遠程倉庫的代碼交流繁雜混亂。
成員遠程倉庫在在操作上是中心遠程倉庫的簡化版。僅在細微處有所不同。
1.求助者
-
創建成員遠程倉庫
-
添加成員遠程倉庫
-
推送自己的分支到成員遠程倉庫的 master 分支
-
拉取成員遠程倉庫的 master 分支到自己的分支
$ git remote add [ALIAS_NAME] [GIT_ADRESS]
$ git push [ALIAS_NAME] [BRANCH_NAME]:[BRANCH_NAME_REMOTE]
$ git pull
舉例:
$ git remote add binRepo https://coding.net/chenbin/GitTest2.git
$ git push binbin binRepo:master //由於是第一次推送,該操作已經使得分支binbin 跟蹤了遠程分支 binRepo/mastr
當某個分支 a 跟蹤了遠程分支 b,即 b 成為 a 的默認拉取來源,也因此,一個本地分支同一時間只能跟蹤一個遠程分支。
讓本地某分支跟蹤遠程分支的命令
$ git branch -u [REPO_NAME]/[REMOTE_BRANCH_NAME] [BRANCH_NAME]
// git branch -u binRepo/master binbin
2.協助者
- 克隆成員遠程倉庫
- 在 master 分支基礎上創建自己的分支 member*
- 在自己的分支上修改代碼
- 合並到 master 分支后推送到成員遠程倉庫
$ git clone https://coding.net/chenbin/GitTest2.git
$ git checkout -b member1;
//… //修改代碼
$ git add .
$ git commit -m"我幫你把XX功能完成了"
$ git checkout --no-ff merge member1;
$ git push
