想寫點詳細的東西,最好是能讓新人簡單上手的,能日常使用的,懂個大概的;可能不是很官方術語,畢竟目標只是便於新手上路「陽間的」。
基礎概念
什麼是 Git
Git 是目前世界上最先進的分散式版本控制系統(沒有之一)。
先說什麼是版本控制。舉個例子來說,比如你拿到一個word檔案,修改儲存,修改再儲存,再修改再儲存,直到最後滿意為止。版本控制就是可以隨時檢視並還原之前任意一次儲存後的檔案。
版本控制系統常見的有兩種,一種是 SVN 一種是 Git。那麼他們兩個有什麼區別呢?區別在於git是分散式的版本控制系統。再舉個例子,賬房周先生那裡有一本賬,每位太太出去逛街後都需要去賬房周先生那裡登記,平時還好,幾位太太基本都不會在賬房碰面,畢竟誰也不想讓別人說自己花銷大。可是每當節日來臨,比如中秋節啊,端午節啊之類的,幾位太太就難免會碰面,然後發生衝突。這就是 SVN,集中式的,賬房那本賬一丟,就沒有辦法統計了。
那什麼是git呢?同樣是賬房周先生的這個例子,區別在與每位太太那裡都有一本小帳,每次出去遊玩後都可以先記在自己的小帳上,等有需要了再去賬房周先生那裡登記,這樣就算賬房那本賬丟了,也無需太過與擔心。
示例圖:
SVN 工作流程圖
Git 工作流程圖
什麼是 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 上進行託管。
全域性配置使用者名稱和郵箱
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? []
一些高的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
出的最新 release 為v1.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.<簡化的字元> 原始命令
其他待補充
參考文獻
本作品採用《CC 協議》,轉載必須註明作者和本文連結