banner
xx

forest in ruins

👋 I am a front-end developer,dream to be a vloger!

git 從語法到實戰協同

image.png

工欲善其事,必先利其器#

最重要的當然是要下載 Git 🚀
Terminal 插件:oh-my-zsh(mac)|oh-my-posh(windows)
Vscode 插件:Git Lens | Git Graph

為什麼使用 git ?#

隨著程式開發的複雜化,協同成為了專案開發中必不可少的,不知道大家在與其他人一起協同的時候是如何獲取同伴最新的程式碼呢,我相信這樣傳專案文件很多同學都幹過,當然也包括我自己
但是使用 QQ 進行協同開發會有以下幾個痛點

  • 需要手動進行程式碼的合併(人眼 diff)
  • 沒辦法多人同時進行開發
  • 如果只是簡單的覆蓋,可能會導致自己的程式碼被覆蓋掉
  • 無法記錄程式碼的修改歷史(Ps:不知道屎山是誰寫的,不知道 bug 需要誰去解決)
  • 無法回退程式碼版本(抑或是你每次都壓縮一遍,這太傻了)

當然使用 QQ 等通訊軟體進行協同開發不止會出現上邊的問題,會有各種各樣的痛點,所以使用 git 進行協同開發就十分重要了,git 也是因此而應運而生的,讓我看看 git 官方對自己的描述
image.png
git 將每次的程式碼更改,粒度化為一個一個 commit ,又透過不同的本地分支,以及上游的線上分支,使得每個人可以在本地進行開發,最後合併到遠端倉庫,從而達到高效協同的進行專案開發,無論是一個兩三個人的小專案,還是幾百個人共同開發的複雜專案,它都可以很好的解決協同開發的問題
image.png
因此學習 git 是每一位程式員必須要掌握的,無論是幫老師做的專案,還是未來在公司工作,git 都是必不可少的,廢話不多說,讓我們開始學習 git

git 基礎概念#

image.png

  • 本地倉庫是對於遠端倉庫而言的(本地倉庫有可能落後於遠端倉庫,需要在開發前拉取遠端倉庫信息,防止程式碼衝突)
  • 本地倉庫 = 工作區 + 版本區
  • 工作區即磁碟上的文件集合。
  • 版本區 (版本庫) 即.git 文件
  • 版本庫 = 暫存區 (stage) + 分支 (master) + 指針 Head
    • 以我使用最頻繁的 git 命令為例,即提交到 github 為例。
    • git init 原本本地倉庫只包含著工作區,這是最常見的工作狀態。此時,git init 一下,表示在本地區域創建了一個.git 文件,版本區建立。
    • git add . 表示把工作區的所有文件全部提交到版本區裡面的暫存區
    • 當然你也可以透過 git add ./xxx/ 一條一條分批添加到暫存區。
    • git commit -m "xxx" 把暫存區的所有文件提交到倉庫區,暫存區空空蕩蕩。
    • git remote add origin https://github.com/name/name_cangku.git 把本地倉庫與遠端倉庫連接起來。
    • git push -u origin master 把倉庫區的文件提交到遠端倉庫裡。
    • 一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是 “乾淨” 的。會有這樣的信息 nothing to commit, working tree clean

git 代碼托管平台使用(gtihub)#

由於國內網路環境問題,github 可能沒辦法正常訪問

需要使用梯子,並配置 git 代理#

// 這裡請以實際的代理端口為準

git config --global https.proxy http://127.0.0.1:1080

git config --global https.proxy https://127.0.0.1:1080 

設置你的帳戶#

// github 使用較多,可以全局設置 github 帳號
git config --global user.name "你的名字" //讓你全部的Git倉庫綁定你的名字

git config --global user.email "你的郵箱" //讓你全部的Git倉庫綁定你的郵箱

拉取遠端倉庫#

// 最簡單的當然是直接 clone

git clone https://github.com/withastro/docs.git

// 手動創建倉庫並綁定遠端倉庫

git init 
git remote add origin https://github.com/withastro/docs.git
git pull origin main

將更改提交並推送到遠端倉庫#

git add .
git commit -m "當前 commit 的標題" //commit 的描述很重要,規範詳見後文
git push -u origin main

git 規範化協同開發#

分支管理#

可能很多同學,剛開始學 git 會直接在 main 分支進行開發,這樣會導致很多問題,一般來說 main 分支就是生產分支,這個分支要保證穩定可靠,而在 main 分支開發和測試,一旦出現 bug 便是用戶可以感知到的生產事故,在協同開發時最起碼每個人要有自己的開發分支,這樣可以有效避免程式碼衝突的風險,但最好的做法,是以需求為粒度,創建需求分支,在開發並測試完畢後合併到生產分支,以下我將進行舉例,開發一個分支,功能是開發 image 組件

git checkout -b feat-image-component

//完成組件開發

git status //查看工作區中修改的文件,避免出現需求之外的更改
git add . //將程式碼提交到暫存區
git commit -m "feat: image  component"
git log --oneline //查看本地倉庫的提交記錄
git push -u origin feat-image-component

//確認組件符合需求後,合併到生產分支
//保證 main 分支與線上倉庫一致
git checkout main
git pull

git checkout feat-image-component (當前分支:feat-image-component)
git rebase main //變基,保證提交歷史的乾淨

//合併分支
git checkout main
git merge feat-image-component

這便是一次需求開發的正常流程,透過上述流程,會保證開發的效率,以及最大限度的避免程式碼衝突,和導致線上 bug ,可能有的同學會發現在 commit 時,有一個前綴 feat ,那麼這是什麼意思呢,那就要談到 git 規範了

git merge 和 git rebase 的區別#

https://joyohub.com/2020/04/06/git-rebase/

commit message 規範#

規範是十分重要的,commit message 規範化,能提升程式碼倉庫的健壯性和可維護性,其中比較常用的規範是 Google 提出的 Angular 規範,我們上邊所使用的也是 Angular 規範,feat 代表的就是新增功能,我們可以看到很多開源專案使用的都是 Angular 規範,如 Antd ...
image.png
給大家列舉一些常用的前綴

echo ""
	echo "feat        新功能(feature)"
	echo "fix         修補bug"
	echo "docs        文檔(新增or修改)"
	echo "style       格式(不影響程式碼運行的變動)"
	echo "refactor    重構(即不是新增功能,也不是修改bug的程式碼變動)"
	echo "perf        性能優化"
	echo "test        增加測試"
	echo "chore       構建過程或輔助工具的變動dad"
	echo ""

奇技淫巧#

  • git rebase -i
  • git cherry-pick
  • git worktree
  • git stash
  • git commit --amend

git 常用語法#

  • git config --global user.name "你的名字" 讓你全部的 Git 倉庫綁定你的名字
  • git config --global user.email "你的郵箱" 讓你全部的 Git 倉庫綁定你的郵箱
  • git init 初始化你的倉庫
  • git add . 把工作區的文件全部提交到暫存區
  • git add .// 把工作區的文件提交到暫存區
  • git commit -m "xxx" 把暫存區的所有文件提交到倉庫區,暫存區空空蕩蕩
  • git remote add origin https://github.com/name/name_cangku.git 把本地倉庫與遠端倉庫連接起來
  • git push -u origin master 把倉庫區的主分支 master 提交到遠端倉庫裡
  • git push -u origin <其他分支> 把其他分支提交到遠端倉庫
  • git status 查看當前倉庫的狀態
  • git diff 查看文件修改的具體內容
  • git log 顯示從最近到最遠的提交歷史
  • git clone + 倉庫地址下載克隆文件
  • git reset --hard + 版本號 回溯版本,版本號在 commit 的時候與 master 跟隨在一起(--soft 保留更改撤銷 commit ,--hard 會失去 reset 的 commit 的所有更改)
  • git reflog 顯示命令歷史
  • git checkout -- 撤銷命令,用版本庫裡的文件替換掉工作區的文件。我覺得就像是 Git 世界的 ctrl + z
  • git rm 刪除版本庫的文件
  • git branch 查看當前所有分支
  • git branch <分支名字> 創建分支
  • git checkout <分支名字> 切換到分支
  • git merge <分支名字> 合併分支
  • git branch -d <分支名字> 刪除分支,有可能會刪除失敗,因為 Git 會保護沒有被合併的分支
  • git branch -D + <分支名字> 強行刪除,丟棄沒被合併的分支
  • git log --graph 查看分支合併圖
  • git log --oneline 查看 commit 的概況
  • git merge --no-ff <分支名字> 合併分支的時候禁用 Fast forward 模式,因為這個模式會丟失分支歷史信息
  • git stash 當有其他任務插進來時,把當前工作現場 “存儲” 起來,以後恢復後繼續工作
  • git stash list 查看你剛剛 “存放” 起來的工作去哪裡了
  • git stash apply 恢復卻不刪除 stash 內容
  • git stash drop 刪除 stash 內容
  • git stash pop 恢復的同時把 stash 內容也刪了
  • git remote 查看遠端庫的信息,會顯示 origin,遠端倉庫默認名稱為 origin
  • git remote -v 顯示更詳細的信息
  • git pull 把最新的提交從遠端倉庫中抓取下來,在本地合併,和 git push 相反
  • git rebase 把分叉的提交歷史 “整理” 成一條直線,看上去更直觀(開發中通常使用 rebase,而不是直接使用 merge)
  • git tag 查看所有標籤,可以知道歷史版本的 tag
  • git tag 打標籤,默認為 HEAD。比如 git tag v1.0
  • git tag <版本號> 把版本號打上標籤,版本號就是 commit 時,跟在旁邊的一串字母數字
  • git show 查看標籤信息
  • git tag -a -m "<說明>" 創建帶說明的標籤。 -a 指定標籤名,-m 指定說明文字
  • git tag -d 刪除標籤
  • git push origin 推送某個標籤到遠端
  • git push origin --tags 一次性推送全部尚未推送到遠端的本地標籤
  • git push origin /tags/ 刪除遠端標籤
  • git config --global color.ui true 讓 Git 顯示顏色,會讓命令輸出看起來更醒目
  • git add -f 強制提交已忽略的的文件
  • git check-ignore -v 檢查為什麼 Git 會忽略該文件
  • git cherry-pick <commit hash 值>
  • git worktree 創建一個新的工作區,可以快速在本地同時開發多個分支的倉庫(可以拷貝了一份本地倉庫)
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。