Git多人項目開發流程演練

1. 前言

本文利用 GitHub 平臺進行一個多人項目開發流程的演練,以加深課上所學內容。
參考文獻:五⼤場景玩轉 Git,只要這一篇就夠了!git

2. 初始化項目

2.1 新建遠程項目

一個多人項目一般是從遠程建立新倉庫開始,這裏咱們在 GitHub 新建一個倉庫 git101vim

新建倉庫時我添加了 .gitignore 文件來進行一個初始化提交,否則默認一個空項目後面很差畫圖演示。.gitignore 文件顧名思義,在裏面指定的文件或文件夾都不會被 Git 跟蹤,一般用於指定一些只有本地會用到的文件或者保密性高的私人文件。bash

值得一提的是,因爲某個國家某些自身緣由,10月1日開始,GitHub 新倉庫的默認分支名都由原來的 master 變成了 main ,須要改回來的話要手動設置,這裏我懶得設置了,main 就 main 吧。ssh

2.2 clone 項目到本地

一般一個多人項目須要在項目中把全部的成員包含進來,給他們寫權限,這樣才能推送本身的代碼到遠程,這裏簡單起見,就以網頁端直接修改文件模擬另外一位小夥伴的工做。項目路徑有 http 和 ssh 兩種,它們的區別是: http 不須要額外配置,但推送代碼的時候須要驗證身份;ssh 使用祕鑰通訊,推送時不須要驗證,但須要額外配置,由於我配置過 ssh ,就直接用 ssh 路徑了:fetch

如今能夠開始工做了,首先將項目克隆到本地而後查看一下倉庫分支和提交狀態:3d

# 克隆項目
git clone 項目地址
# 查看全部分支
git branch -a
# 查看提交記錄
git log --oneline

能夠看到添加 .gitignore 時生成的提交記錄以及分支狀態,注意,有一條 remotes/origin/main 分支,這條分支只用於同步遠程倉庫相應分支的狀態,不可直接在這些分支上進行操做,後面同步遠程代碼時會展現它的用法,因此目前倉庫的分支狀態如圖所示,一個節點表明一個提交記錄,分支和HEAD指針經過虛線指向提交記錄:指針

3. 在本地建立分支完成工做

一般團隊中的每一個人負責一個模塊的開發,不能直接在主分支上作開發,要保持它的整潔,這裏咱們新建一個 dev 分支,在上面作三次提交:code

# 新建並切換到 dev 分支
# 至關於兩條命令:git branch dev && git checkout dev
git checkout -b dev

# 將所作修改存到暫存區
git add .
# 提交到本地倉庫
git commit -m "提交說明,沒有空格可不用雙引號"

此時分支狀態如圖:blog

4. 整理提交記錄

工做完成後,就須要將所作修改合併到主分支了,但在合併以前,咱們每每須要對開發分支的提交記錄進行一些整理以保持提交記錄整潔,好比上面的所作的三次提交,或許咱們發現 d2 和 d3 所作工做其實幹了同一件事,或者 d2 只是隨手提交了一個沒什麼意義的 log,總之因爲種種緣由,我不想讓 d2 出如今最終提交記錄裏面了,這時候就能夠用 rebase 整理一下提交記錄:開發

# 整理 HEAD 向前三個提交
git rebase -i HEAD~3

以後會用 vim 打開一個修改提交記錄的文件,裏面有刪除合併等各類修改說明,這裏咱們想刪除 d2 ,因此將前面的 pick 改爲 drop:

保存退出後不出意外是有衝突的,由於 d3 是基於 d2 修改的,如今 d2 沒了,就須要解決 d3 產生的衝突,咱們能夠隨時用 git status 查看工做區狀態:

這裏提示 dev.txt 文件存在衝突,那咱們就打開 dev.txt ,修改衝突到 d3 的狀態後加入暫存區而後繼續剩下的 rebase 工做:

# 繼續未完成的 rebase 工做
# 若是想撤銷 rebase ,使用 --abort 參數
git rabase --continue

rebase 完成以後還會打開一個 d3 的提交記錄文件,由於修改過這條分支上的提交記錄,理應在最新的提交記錄上作一下說明,這裏我就不作修改了:

整理提交記錄後就變成了這個樣子:

5. 合併工做到主分支

合併到主分支很是容易,只須要切換到主分支而後 merge 便可,但在此以前,咱們還有些事要辦。

5.1 模擬遠程提交

團隊項目不僅有一我的,在咱們完成工做時,有可能其餘人已經率先提交了工做,這裏在網頁端修改 .gitignore 文件來模擬遠程提交:


這裏我清空了 .gitignore 文件的內容並添加了一行 *.log ,這表示忽略全部以 .log 結尾的文件,最後將此次提交命名爲 r1 ,這時候遠程倉庫的分支狀態發生了改變:

5.2 拉取遠程分支的更新

當遠程存在更新的提交記錄時咱們必定不能作合併工做,要始終保持主分支和遠程倉庫一致。
通常在咱們對和遠程倉庫有關聯的本地分支作任何修改時都應該先拉取分支狀態,這一般只須要 git pull 便可搞定,它至關於 git fetch && git merge origin/main 兩條命令,在這裏我想演示一下遠程分支 origin/master 的做用,因此將兩條命令分開執行:

# fetch 的做用:
# 1. 從遠程倉庫下載本地缺失的提交記錄
# 2. 更新遠程分支(origin/master)到最新狀態(注意,本地分支沒動)
git fetch

# 合併 origin/master 到 main 分支
git merge origin/master


fetch 後的狀態:

merge 後:

5.3 合併開發分支

至此,本地主分支終於和遠程同步了,能夠放心的合併開發分支了:

# 合併 dev 到 main
git merge dev

能夠看到合併時默認會多出來一個合併節點,暫且叫它 m1 吧,合併後的狀態:

查看分支狀態也可使用 gitk 命令,只是不怎麼好看:

這裏還有個問題,合併分支時,若是在分叉後主分支沒有更新的提交記錄,merge 默認行爲是快進式合併,就是直接把 dev 分支上面的提交記錄拿過來而不是新建合併節點,這樣作沒法保留分支開發的歷史,一般咱們須要加上 --no-ff 參數來取消默認行爲,它們的區別見下圖:

6. 推送到遠程倉庫

這下本地功能開發完成,也進行了合併,能夠放心的推送到遠程倉庫啦:

git push

完成後遠程倉庫分支也進行了更新:

登陸 GitHub 查看,dev.txt 也已經出現:

相關文章
相關標籤/搜索