從Git向Git-Flow出發

Jouzeyu發表於2021-08-02

想寫點詳細的東西,最好是能讓新人簡單上手的,能日常使用的,懂個大概的;可能不是很官方術語,畢竟目標只是便於新手上路「陽間的」。

基礎概念

什麼是 Git

Git 是目前世界上最先進的分散式版本控制系統(沒有之一)。

先說什麼是版本控制。舉個例子來說,比如你拿到一個word檔案,修改儲存,修改再儲存,再修改再儲存,直到最後滿意為止。版本控制就是可以隨時檢視並還原之前任意一次儲存後的檔案。

版本控制系統常見的有兩種,一種是 SVN 一種是 Git。那麼他們兩個有什麼區別呢?區別在於git是分散式的版本控制系統。再舉個例子,賬房周先生那裡有一本賬,每位太太出去逛街後都需要去賬房周先生那裡登記,平時還好,幾位太太基本都不會在賬房碰面,畢竟誰也不想讓別人說自己花銷大。可是每當節日來臨,比如中秋節啊,端午節啊之類的,幾位太太就難免會碰面,然後發生衝突。這就是 SVN,集中式的,賬房那本賬一丟,就沒有辦法統計了。

那什麼是git呢?同樣是賬房周先生的這個例子,區別在與每位太太那裡都有一本小帳,每次出去遊玩後都可以先記在自己的小帳上,等有需要了再去賬房周先生那裡登記,這樣就算賬房那本賬丟了,也無需太過與擔心。

示例圖:

SVN 工作流程圖
image.png

Git 工作流程圖

image.png

什麼是 Git-Flow

Git-Flow是 Git 提交的規範,畢竟多個工程師開發同一個專案,如果不約定一個提交規範,那麼基本不知道提交的是什麼,還需要一點一點看提交變動的原始碼,這樣做是很不方便的,所以Git 的提交規範應運而生,用的最多的就是Git-Flow。

基本操作

Git的基本操作

生成 ssh 秘鑰

cd ~/.ssh   //查詢資料夾是否存在,如果存在說明已經生成了ssh秘鑰,跳過此步

ssh-keygen -t rsa -C "你公司內部/或者你自己的郵箱地址" //用來生成ssh 秘鑰

複製公鑰並新增到程式碼託管平臺

cat id_rsa.pub   //透過 `cat` 命令檢視檔案 `id_rsa.pub` 的內容,然後複製

以 Github 為例,如下圖所示,進入 settings -> SSH and GPG keys 將複製的內容貼上過來,點選 add ssh key,這一步等於說把你的公鑰放到了 Github 上進行託管。

image.png

全域性配置使用者名稱和郵箱

git config --global user.name "你的名字"
git config --global user.email "你公司內部/或者你自己的郵箱地址"

git init

初始化一個空倉庫

git init

git add

新增檔案到暫存區

# 新增某個檔案到暫存區,後面可以跟多個檔案,以空格區分
git add xxx
# 新增當前更改的所有檔案到暫存區。
git add .

git commit

提交更改

# 提交暫存的更改,會新開編輯器進行編輯
git commit 
# 提交暫存的更改,並記錄下備註
git commit -m "you message"
# 等同於 git add . && git commit -m
git commit -am
# 對最近一次的提交的資訊進行修改,此操作會修改commit的hash值
git commit --amend

git pull

推送程式碼到遠端倉庫

# 從遠端倉庫拉取程式碼併合併到本地,可簡寫為 git pull 等同於 git fetch && git merge 
git pull <遠端主機名> <遠端分支名>:<本地分支名>
# 使用rebase的模式進行合併
git pull --rebase <遠端主機名> <遠端分支名>:<本地分支名>

git fetch

git pull 不同的是 git fetch 操作僅僅只會拉取遠端的更改,不會自動進行 merge 操作。對你當前的程式碼沒有影響

# 獲取遠端倉庫特定分支的更新
git fetch <遠端主機名> <分支名>
# 獲取遠端倉庫所有分支的更新
git fetch --all

git branch

分支相關操作

# 新建本地分支,但不切換
git branch <branch-name> 
# 檢視本地分支
git branch
# 檢視遠端分支
git branch -r
# 檢視本地和遠端分支
git branch -a
# 刪除本地分支
git branch -D <branch-nane>
# 重新命名分支
git branch -m <old-branch-name> <new-branch-name>

git-flow基本操作

git flow init

初始化

已初始化空的 Git 倉庫於 /Users/jouzeyu/test/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master] main    //主分支名稱,之前是master,現在用main多一些
Branch name for "next release" development: [develop]  //開發分支名稱,預設就好,下面無特殊要求都預設

How to name your supporting branch prefixes?
Feature branches? [feature/]   
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []

image.png

一些高的git版本中已經預設整合了git-flow,如果你的版本不支援,可以到github->gitflow檢視安裝說明

git flow feature

開發一個新功能

git flow feature start your-branch-name

start後面一般跟你的新功能名稱,它會基於develop 分支為基礎建立的這個新的分支,當功能開發完成後,你可以執行:

 git flow feature finish your-branch-name

這條命令會將你新開發的功能合併到develop分支並刪除該 feature 分支,然後切換回 develop 分支,當然,你可以透過命令git log檢視操作歷史。

git flow release

釋出一個新版本

git flow release start v0.0.1

新版本完成測試後就可以釋出該分支了,你可以執行:

git flow release finish v0.0.1

注意這個 release 版本的命名 我們一般習慣是 v+3 位數 因為這是一個新的專案還沒有 tag 標籤就從 0 開始了 那就是 v0.0.1 了 當然具體還是看公司規定

git flow hotfix

當我們出現 bug 需要修復又不想影響釋出分支 可以新建一個 hotfix 分支來修復 bug,這個是基於master 分支幫我們建立的這個 hotfix 新分支:

git flow hotfix start v0.0.1.1

當我們修復完畢後:

git flow hotfix finish v0.0.1.1

他會在後面幫我們把分支合併到 master 然後打上標籤 並刪除該分支,同樣,你也可以透過命令git log檢視操作歷史。

注意這個命名版本號:我們一般習慣使用 v+4 位數來命名版本號 需要先查詢最新的一個 release 分支因為 release 是 3 位的 在他的基礎上加一位 因為我們上面剛剛完成的 release 版本號是 v0.0.1 所以我們新建的 hotfix 分支的名字就是 v0.0.1.1
eg: 如果我們 git tag 出的最新 releasev1.2.3 那我們的 hotfix 分支可以命名為 v1.2.3.1 以此類推

工作中git解決問題場景

切換遠端倉庫地址

比如說,原先是github託管的程式碼,為了公司的程式碼安全,切換到了gitlab,那麼遠端倉庫地址肯定是有變動的,你可以這樣做:

git remote -v  //檢視遠端倉庫地址

git remote rm origin  //刪除現有的倉庫地址

git remote add origin url  //url是新的倉庫地址

使用 git stash 來暫存檔案

很常見的情況就是你在開發新功能的時候,生產環境有個bug需要修改,這時你可以用 git stash 命令先把工作區已經修改的檔案暫存起來,然後切換到 hotfix 分支上進行 bug 的修復,修復完成後,切換回 feature 分支,從堆疊中恢復剛剛儲存的內容。

git stash //把本地的改動暫存起來
git stash save "message" 執行儲存時,新增備註,方便查詢。
git stash pop // 應用最近一次暫存的修改,並刪除暫存的記錄
git stash apply  // 應用某個儲存,但不會把儲存從儲存列表中刪除,預設使用第一個儲存,即 stash@{0},如果要使用其他個,git stash apply stash@{$num} 。
git stash list // 檢視 stash 有哪些儲存
git stash clear // 刪除所有快取的 stash

使用 git alias 減少操作

你可以用git alias給一些命令配置別名,比如git commit=>git cm,你可以透過下面的命令進行配置:
git config --global alias.<簡化的字元> 原始命令

其他待補充

參考文獻

我在工作中是如何使用 git 的

GitFlow日常使用總結

本作品採用《CC 協議》,轉載必須註明作者和本文連結
空舟湖上~      ——Jouzeyu

相關文章