目錄
前言
如何使用github建立自己的代碼庫
第一步:建立本地git與遠程github的聯系
生成密鑰
將密鑰加入github
第二步:創建github倉庫并clone到本地
第三步:上傳文件
常見的git命令
git commit
git branch
git merge/git rebase
git clone
git fetch
git pull
git push
?編輯
Git Flow工作流
什么是Git Flow
GitFlow分支介紹
主要分支(Master)
開發分支(Develop)
功能分支(Feature)
預發分支(Release)
熱修復分支(Hotfix)
GitFlow代碼實現
創建develop分支
開始新的Feature
編輯Feature分支
完成Feature分支
開始Release
完成Release
開始Hotfix
完成Hotfix
模擬GitFlow開發流程
創建develop分支
甲和乙開始開發新功能
甲把功能開發好了
甲開始準備一次發布
甲完成了發布
用戶發現了一個bug
前言
由于筆者最近在準備合作完成第二個項目,在寫項目的過程中,要用到git來更好地合作,而筆者之前學習有關git的知識比較淺顯而且長時間不使用,已經忘得差不多了,現在重新學習一下git,這次學習git主要有三個方面:
-
學會如何使用github建立自己的代碼庫
-
學會一些常見的git命令,用來遠程合作。
-
學習git的工作流
(聲明:本篇文章所有的工作都通過github和macOS操作系統進行,所有內容都以github為例)
如何使用github建立自己的代碼庫
第一步:建立本地git與遠程github的聯系
github有四種通信方式:SSH、HTTPS、GitHub CLI、GitHub API,四種方式各有其特點:
這里筆者主要嘗試了前兩種方式,使用SSH可以成功進行上傳,而使用HTTPS時常常在輸入個人訪問令牌時出問題,筆者暫時不知道是什么問題。這里就以SSH為例來說明如何建立本地git與github的聯系。
生成密鑰
在終端中輸入以下命令配置用戶名和郵箱:
git config --global user.name "your_name"
git config --global user.email "your_email@xx.com"
接著輸入以下命令生成密鑰:
ssh-keygen -t rsa -C "your_email@xx.com"
然后會彈出以下提示:
這是在詢問你密鑰的存儲路徑
如果直接按Enter,密鑰將被保存在 ~/.ssh/id_rsa
(私鑰)和 ~/.ssh/id_rsa.pub
(公鑰),也就是默認路徑。
也可以使用自定義路徑,輸入一個自定義路徑,例如:
/Users/huyongtai/.ssh/github_rsa
推薦使用默認路徑,避免額外配置
如果使用默認路徑,下一步會提示輸入passphrase,可以留空(直接按Enter)
當出現以上提示時,就已經成功生成密鑰了
輸入以下命令瀏覽文件目錄:
ls -lf
這里有一個.ssh文件,這個文件里存放著我們的密鑰
接著我們打開這個文件:
cd .ssh
ls
會出現以下界面,這里第二個文件就是我們要找的密鑰
我們來打開這個文件查看密鑰:
cat id_rsa.pub
打開之后,我們把密鑰復制下來(從ssh一直到你的郵箱全部都要復制)
將密鑰加入github
點擊頭像后展開以上界面,選擇Settings,
進入設置頁面后,選擇SSH and GPG keys
點擊New SSH key,進入以下界面:
將剛剛復制的密鑰輸入就成功將本地git與github綁定了
第二步:創建github倉庫并clone到本地
上圖是創建github庫的界面,可以輸入名稱描述信息,選擇私有或公有,以及是否生成README文件。
創建好后,我們可以在該位置找到這個庫的SSH地址
接下來使用剛剛找到的SSH地址進行clone:
這樣就將庫clone到本地了,接下來就可以在本地找到clone下來的這個庫:
第三步:上傳文件
接下來就可以上傳文件了:首先將要上傳的文件添加到這個文件夾中。添加完成后,使用命令將其添加至暫存區并查看分支狀態:
git add .
git status
如果顯示分支中的文件都為綠色,則沒有問題,接下來就進行提交:
git commit -m "commit information"
然后提交:
git push
上傳成功后,終端會進行提示,此時打開github的倉庫,就可以看到自己本地的代碼和文件了。
常見的git命令
筆者通過可視化git命令學習網站學習了一些git命令的用法和含義,在這里整理一下:
git commit
Git 倉庫中的提交記錄保存的是你的目錄下所有文件的快照,就像是把整個目錄復制,然后再粘貼一樣,但比復制粘貼優雅許多!
Git 希望提交記錄盡可能地輕量,因此在你每次進行提交時,它并不會盲目地復制整個目錄。條件允許的情況下,它會將當前版本與倉庫中的上一個版本進行對比,并把所有的差異打包到一起作為一個提交記錄。
Git 還保存了提交的歷史記錄。這也是為什么大多數提交記錄的上面都有 parent 節點的原因 —— 我們會在圖示中用箭頭來表示這種關系。對于項目組的成員來說,維護提交歷史對大家都有好處。
使用git commit命令便可以提交記錄:
git branch
git的分支也非常輕量,之后的git工作流會再詳細介紹git分支的知識。現在可以暫時理解為按邏輯將工作分解到不同分支。
使用git branch可以創建一個新的分支:
git branch bugFix
?
在創建好分支后,可以使用git switch和git checkout來切換到當前分支再進行提交。
使用git checkout -b <your-branch-name> 可以在創建一個新分支的同時切換到該分支。
git merge/git rebase
這兩條命令都是將分支合并的命令,先看git merge。
這條命令相當于將兩個分支合并并產生一個新的記錄:
git merge bugFix
?
接下來看看git rebase:
rebase其實是取出一系列的提交記錄,復制它們后在另一個地方一個一個的放下去。
Rebase 的優勢就是可以創造更線性的提交歷史,這聽上去有些難以理解。如果只允許使用 Rebase 的話,代碼庫的提交歷史將會變得異常清晰。
git rebase main
?
git clone
使用該命令會在本地創建一個遠程倉庫的拷貝。
在這個網站中模擬的有所不同,網站中模擬成創建一個遠程的拷貝本地的副本。
之前在github上傳代碼時已經用到過該命令了
這時本地多了一個o/main分支,我們稱為遠程分支,遠程分支反映了遠程倉庫的狀態。
遠程分支有一個特別的屬性,在你切換到遠程分支時,自動進入分離 HEAD 狀態。Git 這么做是出于不能直接在這些分支上進行操作的原因, 你必須在別的地方完成你的工作, (更新了遠程分支之后)再用遠程分享你的工作成果。
大多數的開發人員會將它們主要的遠程倉庫命名為 origin
,并不是 o
。這是因為當你用 git clone
某個倉庫時,Git 已經幫你把遠程倉庫的名稱設置為 origin
了。
git fetch
git fetch這條命令可以從遠程倉庫獲取數據。當從遠程倉庫獲取數據時,遠程分支也會更新以反映最新的遠程倉庫。
git fetch完成了兩步:
-
從遠程倉庫中下載本地倉庫缺失的提交記錄
-
更新遠程分支指針
Git fetch并不會改變你本地倉庫的狀態,不會更新main分支,也不會修改你磁盤上的文件。
git pull
之前說到git fetch只是獲取遠程的數據,那么要將這些變化更新到我們的工作當中,我們可以使用之前學到的命令來合并遠程分支,例如:
git merge o/main git rebase o/main
而git pull命令就是這兩步合成了一條命令,也就是說,git pull就是git fetch和git merge的縮寫
git push
git push是一條與git pull相反的命令,它可以將你的變更上傳到指定的遠程倉庫,并在遠程倉庫上合并你的新提交記錄。
Git Flow工作流
什么是Git Flow
GitFlow 是一種 Git 工作流,這個工作流程圍繞著project的發布(release)定義了一個嚴格的如何建立分支的模型。它是團隊成員遵守的一種代碼管理方案 。
簡單來說,Git Flow就是一種規范,這種規范指導你如何用git來更好地合作完成一個項目的開發。在工作場合實施git時,有很多種工作流程可供選擇(Centralized Workflow、Feature Branch Workflow、Gitflow Workflow、Forking Workflow),這些工作流程作為指導方針,只是起到參考的作用,不必視作“鐵律”。
這里主要介紹GitGlow Workflow
GitFlow常用分支:
分支名稱 | 分支說明 |
---|---|
Production | 生產分支,即Master分支,只能從其他分支合并,不能直接修改 |
Release | 發布分支,基于Develop分支創建,待發布完成后合并到Develop和Production分支去 |
Develop | 主開發分支,包含所有要發布到下一個Release的代碼,該分支主要合并其他分支內容 |
Feature | 新功能分支,基于Develop分支創建,開發新功能,待開發完畢合并至Develop分支 |
Hotfix | 修復分支,基于Production分支創建,待修復完成后合并到Develop和Production分支去,同時在Master上打一個tag |
GitFlow分支介紹
GitFlow模型中定義了主分支和輔助分支兩類分支,其中主分支包含主要分支和開發分支,用于與軟件開發、部署相關的活動;輔助分支包含功能分支、預發分支、熱修復分支和其他自定義分支,主要用于解決一些特定問題。
主要分支:master分支、develop分支
輔助分支:feature分支、release分支、hotfix分支
主要分支(Master)
這個分支存放整個項目最穩定的正式版本,并且這里的代碼必須隨時可以在生產環境中使用。當一個版本開發完,產生了一份新的可供發布的代碼,主要分支上的代碼就會被更新。
主要分支上不允許直接提交代碼,只接受其他分支的合入。原則上主要分支上的代碼必須是合并自預發分支
開發分支(Develop)
開發分支是主開發分支,上面集成了下一個版本的要交付的新功能,當開發分支準備好發布時,應該拉取一個預發分支并附上發布版本號。
開發分支接受其他輔助分支的合入,比如功能分支。開發一個新功能時拉取新的功能分支,開發完后再并入開發分支。
develop分支用來整合各個feature分支,開發中的版本的源代碼存放在這里
功能分支(Feature)
功能分支用于開發未來版本的新功能,該分支通常存在開發人員的本地代碼庫而不要求提交到遠程代碼庫上。有一種觀點是功能分支要求足夠細粒度以避免稱為長期存在的功能分支,應當小步合并而不是一次合并大量代碼。
功能分支只能拉取自開發分支,開發完成后要么合并回開發分支,要么因為新功能的不符要求而廢棄。
預發分支(Release)
該分支的作用是測試新開發好的版本,通過創建預發分支,可以讓開發分支空閑出來接受下一個版本的新的功能分支的合入。
預發分支只能拉取自開發分支,合并回開發分支和主要分支。
release分支不是一個放正式發布產品的分支,你可以將它理解為“待發布”分支。
我們用這個分支干所有和發布有關的事情,比如:
把這個分支打包給測試人員測試
在這個分支里修復bug
編寫發布文檔
所以,在這個分支里面絕對不會添加新的特性。
當和發布相關的工作都完成后,release分支合并回develop和master分支。
單獨搞一個release分支的好處是,當一個團隊在做發布相關的工作時,另一個團隊則可以接著開發下一版本的東西。
熱修復分支(Hotfix)
當生產環境的代碼(主要分支上代碼)遇到嚴重問題,必須立即修復時,就需要拉取熱修復分支進行代碼的緊急修復。這樣做不會打斷開發分支的開發工作,可以讓負責功能開發的人與負責代碼修復的人并行、獨立地開展工作。
GitFlow工作流程如下:
GitFlow代碼實現
創建develop分支
git branch develop//創建develop分支
push -u origin develop//將develop分支推送到遠端倉庫
開始新的Feature
checkout -b Feature分支名 develop//從develop上創建feature分支并切換到feature分支
push -u origin Feature分支名//將分支推送到遠端倉庫
編輯Feature分支
git status//查看狀態
git add XXXfile//添加提交內容
git commit//提交
完成Feature分支
git pull origin develop//拉取遠端倉庫 develop 分支合并到本地 develop 分支
git checkout develop//切換到 develop 分支
git merge --no-ff Feature分支名//將 Feature 分支合并到 develop 分支//--no-ff:不使用 fast-forward 方式合并,保留分支的 commit 歷史//--squash:使用 squash 方式合并,把多次分支 commit 歷史壓縮為一次 ? ?
git push origin develop//將分支推送遠端倉庫
git branch -d Feature分支名//刪除 Feature分支
開始Release
checkout -b release-0.1.0 develop
完成Release
git checkout master //切換到master分支上
git merge --no-ff release-0.1.0 //合并Release分支
git push//推送到遠端倉庫
git checkout develop//切換到develop分支
git merge --no-ff release-0.1.0 //合并Release分支
git push//推送到遠端倉庫
git branch -d release-0.1.0//刪除release分支
開始Hotfix
git checkout -b hotfix-0.1.1 master//創建并切換Hotfix分支
完成Hotfix
git checkout master//切換到master分支
git merge --no-ff hotfix-0.1.1//合并hotfix分支
git push//推送到遠端倉庫
git checkout develop//切換到develop分支
git merge --no-ff hotfix-0.1.1 //合并hotfix分支
git push//推送到遠端倉庫
git branch -d hotfix-0.1.1//刪除hotfix分支
git tag -a v0.1.1 master//在主分支上打上版本標簽
git push --tags//將標簽推送到遠端倉庫
模擬GitFlow開發流程
創建develop分支
首先為默認的master分支配備一個develop分支,一種簡單做法是在本地建立一個空的develop分支,把它推送到服務器
git branch develop
git push -u origin develop
現在,其他開發者需要克隆這個倉庫,并為develop創建一個追蹤分支
git clone "倉庫地址"
git checkout -b develop origin/develop
甲和乙開始開發新功能
甲和乙要分別開發新功能,他們倆各自建立了自己的分支。
git checkout -b some-feature develop
在自己的功能開發分支上開展工作:
git status
git add <some-file>
git commit
甲把功能開發好了
甲開發完了他的功能,這時他可以將他的代碼合并入本地的develop分支,然后再推送到中央倉庫
git pull origin develop
git checkout develop
git merge some-feature
git push
git branch -d some-feature
第一條命令一定要先執行,它可以確保本地的develop分支擁有最新的代碼。合并時如果發生沖突,需要在代碼中去解決。
甲開始準備一次發布
在乙開發的同時,甲可以進行項目的第一次正式發布了,創建一個新的分支來做產品發布的準備工作
git checkout -b release-0.1 develop
這個分支用來做一些發布前的準備,一旦把這個分支推向中央倉庫(Master),那么這次發布包含的功能就固定下來了,任何還在開發中的功能只能等待下一個發布周期。
甲完成了發布
準備工作完成后,就要把發布分支合并入master和develop分支,然后再將發布分支刪除。
git checkout master
git merge release-0.1
git push
git checkout develop
git merge release-0.1
git push
git branch -d release-0.1
用戶發現了一個bug
之前發布的版本,用戶發現了一個bug,為了解決這個問題,甲基于master創建了一個用于維護的分支,在這個分支上修復了bug,然后把改動的代碼直接合并入master
git checkout -b issue-#001 master
git checkout master
git merge issue-#001
git push
一定要記得將維護分支上的改動也合并入develop分支:
git checkout develop
git merge issue-#001
git push
git branch -d issue-#001