git學習筆記

安河桥北i發表於2024-04-18

初始化

初始化設定使用者名稱和郵箱

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儲存程式碼和版本資訊的主要位置
image

四種檔案狀態

未跟蹤(Untrack):新建立的,尚未被git管理起來的檔案
未修改(Unmodified):被git管理起來,但檔案內容沒有發生變化
已修改(Modified):已修改的檔案,但未新增到暫存區裡面
已暫存(Staged):修改後且新增到暫存區的檔案
image

新增和提交檔案

git status # 檢視倉庫的狀態
git add <filename> # 新增到暫存區
可以使用萬用字元,如git add *.txt
也可以使用目錄,如git add .
git commit # 提交到本地倉庫,注意:只會提交暫存區的檔案
git log # 檢視倉庫提交歷史記錄,可以用--oneline檢視簡潔提交

reset回退版本 三種模式

soft:保留工作區和暫存區內容
hard:不保留工作區和暫存區內容
mixed:保留工作區內容,不保留暫存區內容
image

git diff檢視差異

image

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檔案

應該忽略哪些檔案

image

ignore檔案匹配規則

image

示例

# 忽略所有的.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指標之後
image

二者對比

Merge不會破壞原分支的提交記錄,方便回溯和檢視;但會產生額外的提交結點,分支圖較為複雜。
Rebase不會新增額外的提交記錄,形成線性歷史,比較直觀和乾淨;但會改變提交歷史,改變了當前分支branch out的節點,避免在共享分支時使用

分支管理和工作流模型

GitFlow模型

主線/基線分支 主要分支

包含了專案最新穩定版本的程式碼,應隨時保證主線分支程式碼是可釋出的,會被部署到生產環境中,不允許直接修改,只能透過合併分支

問題修復分支

從主線分支分離出來,用於解決線上bug問題,修復完成後合併回main分支
命名規則:hotfix-#issueid-desc

開發分支 主要分支

從主線分支分離出來,包含專案最新開發版本的程式碼,用於開發和測試

功能分支

從開發分支分離出來,包含專案最近開發的新功能,用於開發新功能

Github Flow模型

image

相關文章