初始化
初始化設定使用者名稱和郵箱
git config --global user.name "zjq" #設定使用者名稱
git config --global user.email email@mail.com #設定郵箱
git config --global credential.helper store #儲存,後續無需再設定
建立倉庫
git init <project-name> #建立一個新的本地倉庫(省略project-name則在當前目錄建立)
git clone <url> #下載一個遠端倉庫
三個工作區域
工作區(Working Directory):.git所在的目錄,實際操作的目錄
暫存區(Staging Area/Index):中間區域,用於臨時存放即將提交的修改內容
本地倉庫(Local Repository):git儲存程式碼和版本資訊的主要位置
四種檔案狀態
未跟蹤(Untrack):新建立的,尚未被git管理起來的檔案
未修改(Unmodified):被git管理起來,但檔案內容沒有發生變化
已修改(Modified):已修改的檔案,但未新增到暫存區裡面
已暫存(Staged):修改後且新增到暫存區的檔案
新增和提交檔案
git status # 檢視倉庫的狀態
git add <filename> # 新增到暫存區
可以使用萬用字元,如git add *.txt
也可以使用目錄,如git add .
git commit # 提交到本地倉庫,注意:只會提交暫存區的檔案
git log # 檢視倉庫提交歷史記錄,可以用--oneline檢視簡潔提交
reset回退版本 三種模式
soft:保留工作區和暫存區內容
hard:不保留工作區和暫存區內容
mixed:保留工作區內容,不保留暫存區內容
git diff檢視差異
git rm刪除檔案
方式1:rm刪除工作區檔案,再刪除暫存區內容
rm file #刪除本地工作區檔案
git add --all file #更新暫存區
方式2:使用git命令直接刪除工作區和暫存區
git rm <file> #把檔案從工作區和暫存區同時刪除,
#要刪除的檔案是沒有修改過的,就是說和當前版本庫檔案的內容相同。
git rm --cached <file> #把檔案從暫存區刪除,但保留在當前工作區中
git rm -r * #遞迴刪除某個子目錄下的所有子目錄和檔案
git ls-files 檢視倉庫中的檔案
刪除後切記要commit
.gitignore檔案
應該忽略哪些檔案
ignore檔案匹配規則
示例
# 忽略所有的.a檔案
*.a
# 但跟蹤所有的lib.a檔案
!lib.a
# 只忽略當前目錄下的TODO檔案,而不忽略subdir/TODO
/TODO
# 忽略任何目錄下名為build的檔案
build/
# 忽略doc/notes.txt,但不忽略doc/server/arch.txt
doc/*.txt
# 忽略doc/目錄及其子目錄下的.pdf檔案
doc/**/*.pdf
提示:GitHub上提供了各種語言的gitignore的檔案模板,可以修改後使用
遠端倉庫 Github/Gitee
配置遠端倉庫
生成ssh金鑰
cd
cd .ssh
# 生成ssh金鑰
ssh-keygen -t rsa -b 4096
# 將.pub公鑰檔案內容複製到遠端倉庫賬戶的金鑰配置中
克隆倉庫
git clone <repo-address>
向遠端倉庫提交內容
git push <remote> <branch>
從遠端倉庫拉取更新內容
git pull <remote>
關聯本地倉庫和遠端倉庫
# step1.新增遠端倉庫
git remote add <遠端倉庫名> <遠端倉庫地址>
# step2.提交到遠端倉庫
git push -u <遠端倉庫名> <分支名>
# 檢視遠端倉庫
git remote -v
# 拉取遠端倉庫內容
git pull <遠端倉庫名> <遠端分支名>:<本地分支名>
# 遠端與本地分支名相同可省略
分支
# 檢視分支列表
git branch
# 建立分支
git branch branch-name
# 切換分支
git switch branch-name
# 合併分支
git merge branch-name
# 刪除分支
git branch -d branch-name # 刪除已合併的分支
git branch -D branch-name # 刪除未合併的分支
合併分支時的衝突處理
merge
兩個分支未修改同一個檔案的同一處位置:Git自動合併
兩個分支修改了同一個檔案的同一處位置:產生衝突
# step1.手工修改衝突檔案,合併衝突內容
# step2.新增暫存區
git add file
# step3.提交修改
git commit -m "message"
# 中止合併:當不想繼續執行合併操作時可以使用下面的命令來中止合併過程
git merge --abort
Rebase
每個分支都有一個HEAD指標指向最新的提交,Rebase操作會找到兩個分支的最近公共祖先結點,將git當前所在分支從最近公共祖先結點到HEAD指標嫁接到另一個分支的HEAD指標之後
二者對比
Merge不會破壞原分支的提交記錄,方便回溯和檢視;但會產生額外的提交結點,分支圖較為複雜。
Rebase不會新增額外的提交記錄,形成線性歷史,比較直觀和乾淨;但會改變提交歷史,改變了當前分支branch out的節點,避免在共享分支時使用
分支管理和工作流模型
GitFlow模型
主線/基線分支 主要分支
包含了專案最新穩定版本的程式碼,應隨時保證主線分支程式碼是可釋出的,會被部署到生產環境中,不允許直接修改,只能透過合併分支
問題修復分支
從主線分支分離出來,用於解決線上bug問題,修復完成後合併回main分支
命名規則:hotfix-#issueid-desc
開發分支 主要分支
從主線分支分離出來,包含專案最新開發版本的程式碼,用於開發和測試
功能分支
從開發分支分離出來,包含專案最近開發的新功能,用於開發新功能