計算機工具基礎(七)——Git
Git
Git是一種分布式版本控制系統,被其跟蹤的文件可被查詢精細到行的修改記錄、回退版本、建立分支等
模型
一般流程:工作區\(\to\)暫存區\(\to\)倉庫(本地\(\to\)遠端)
-
工作區:項目的工作臺,用戶在此處直接編輯文件
-
暫存區(索引):用于暫存準備提交至本地倉庫的文件,Git只跟蹤暫存區內的文件
git ls-files:查看暫存區git ls-tree [Commit/Branch]:查看某個提交/分支的樹形結構
-
倉庫:存儲版本歷史的版本庫,分為本地倉庫與遠端倉庫。
git init:將此目錄初始化為本地倉庫(位于.git下,若要刪除全部倉庫,刪除.git即可)git status:查看該倉庫中文件狀態,包括修改、新增、刪除、未跟蹤等信息
配置
- 為標識提交者,需通過配置進行標識
- 用戶名配置:
git config --global user.name ["name"] - 郵箱配置:
git config --global user.email ["email"] global選項代表對所有倉庫有效- git的配置可在
.gitconfig文件中找到
文件狀態
未跟蹤態
-
未跟蹤:該文件未被Git跟蹤,即其僅存在于工作區中,不在暫存區或倉庫中
git add [Name]:將文件或文件夾添加至暫存區(支持使用通配符)
選項-p:交互式添加文件
-
將未跟蹤/未在倉庫中的文件(夾)名添加至
.gitignore中,即可忽略Git對其一切管理(注意文件夾以/結尾)
若先前已跟蹤/已在倉庫中,則需在暫存區和版本控制中刪除:git rm -r --cached [name]
注:git add命令支持-f選項,此選項會忽略.gitignore中的配置,將該目錄下所有文件添加到暫存區。
已跟蹤態
- 未修改:該文件相較于當前版本倉庫無任何修改
- 已修改:該文件在工作區已修改,但修改還未被添加至暫存區
git stash:臨時保存工作區更改git blame [Name]:查看文件歷史修改
- 已暫存:文件已準備提交至本地倉庫
文件刪除
git rm --cached [Name]:在暫存區刪除文件(工作區不刪除)git rm -f [Name]:同時在暫存區和工作區刪除文件。
若要刪除版本庫中的內容,只能在暫存區中先刪除,再進行提交。
提交、標簽
提交
-
提交(Commit):將暫存區文件提交至本地倉庫,并產生一個新版本,每個版本通過唯一的16進制字符串標識。
-
HEAD指針:永遠指向當前操作版本,隨新提交而自動更新(相當于鏈表的頭節點)。git reflog:查看HEAD指針變動歷史。
-
訪問提交:
- 直接使用16進制字符串訪問提交。
- 通過
HEAD指針訪問:HEAD~[num]或HEAD^[num],代表HEAD之前的第num個版本,若num為1可省略。
-
git commit -m ["Reason"]:將暫存區中的文件提交至本地倉庫,提交原因必填。若省略["Reason"],則調用默認編輯器填寫提交原因。
選項:-a將所有文件添加至暫存區并提交 -
git log:查看提交歷史、當前HEAD指針位置
選項:--oneline每個提交只輸出一行
--graph以ASCII圖顯示提交歷史 -
git checkout [Commit]:將HEAD指針指向特定提交,將發生頭指針分離。 -
頭指針分離:
HEAD指針被指向某一版本,而非該分支最新版本,此狀態被稱為頭指針分離。該狀態下只能查看歷史記錄,而不能進行分支操作。進入頭指針分離應當為臨時操作,否則可能會丟失信息。
標簽
git tag -a [TagName] [Commit]:為版本打標簽。若[Commit]省略,則給HEAD打標簽。git tag -d [TagName]:在本地刪除標簽。
回退
回退提交
git reset [--mode] [Commit]:將HEAD指針回退至指定版本,mode為指定的回退模式:-
mixed:回退倉庫與暫存區,工作區不變(當mode省略時的默認選項)。 -
soft:僅回退倉庫,工作區和暫存區不變。 -
hard:同時回退倉庫、工作區和暫存區。(慎用!)
-
回退文件/文件夾
git reset [Commit] -- [Name]:將某一文件回退至指定版本git checkout -- [Name]:從暫存區恢復該文件到工作區git checkout [Commit] -- [Name]:從特定提交中恢復該文件git restore [Options] [Name]:更清晰的恢復文件(推薦替代git checkout)- 選項:
--source=[Commit]/-s [Commit]從指定提交中恢復內容(默認為HEAD) --staged/-S:將暫存區的內容恢復至工作區--ours:當合并沖突時,恢復為當前分支的版本--theirs:當合并沖突時,恢復為另一分支的版本
- 選項:
差異對比
git diff:工作區與暫存區間差異。git diff HEAD:工作區與最新版本間差異。git diff --cached:查看暫存區與最新版本差異。git diff [ID1] [ID2]:比較兩個版本間差異。git diff [Name] [Name]:比較兩個分支間差異。
分支
分支(Branch):每個分支都是獨立的,擁有獨立的分支指針(指向該分支的最新版本)、工作區、暫存區、本地倉庫等。分為本地分支與遠程分支。
當本地倉庫被初始化時,默認僅具有一個main分支。
分支的創建、重命名、刪除
git branch:查看所有分支,當前所在分支會被以*標識。-r:查看遠程分支-a:查看所有分支
git branch [Branch]:創建分支(但不切換)git branch -m [OldName] [NewName]:重命名分支git branch -m [Newname]:重命名當前分支。使用-M選項強制重命名。git branch -d [Branch]:刪除已合并的分支[Branch],使用-D選項進行強制刪除(無論是否合并)
切換分支
git checkout
git checkout [Branch]:HEAD指針切換至該分支的最新提交。git checkout -:切換至前一個分支
git checkout -b [Branch]:創建并切換至該分支
git switch
git switch [Branch]:更清晰地切換分支,避免產生歧義(推薦用于替代checkout)git switch -c [Branch]:創建并切換至此分支
合并分支
git merge [Branch]:將分支[Branch]快速合并至當前分支,合并后會產生一次合并提交,提交圖成環狀結構。需手動處理解決沖突,使用git status查看沖突文件。- 合并沖突:當兩個分支修改了同一文件的同一部分時,會造成沖突。
>>>>>>HEAD下方為當前分支的代碼,<<<<<<[Name]上方為[Name]分支的代碼,======用于分隔兩者。手動編輯處理沖突后使用git add添加至暫存區,使用git merge --continue繼續合并分支。 git mergetool:使用工具解決合并沖突git merge --abort:取消合并
分支的變基
git rebase [Branch]:求當前分支與目標分支的LCA(最近公共祖先)版本,將當前分支自LCA版本的下個版本起,全部移植至目標分支的分支指針上,HEAD指針不動。提交圖仍為線性結構。
遠端倉庫
遠程倉庫的添加、重命名、刪除
git remote:查看本地倉庫的遠端倉庫列表。
選項-v:查看遠端倉庫的URLgit remote add [RemoteName] [RemotePath]:在遠端倉庫列表中添加名為[RemoteName]、地址為[RemotePath]的遠端倉庫。[RemoteName]默認為origin,[RemotePath]可為路徑、URL等。git remote show [RemoteName]:查看遠端倉庫詳細信息git remote rm [Remote_Name]:從遠端倉庫列表中刪除該遠端倉庫git remote rename [RemoteOldName] [RemoteNewName]:重命名遠端倉庫git remote set-url [RemoteName] [RemoteNewPath]:更新遠端倉庫路徑
設置上游分支
設置上游分支建立了本地分支與遠程分支的聯系。在執行git pull、git push前,必須設置上游分支,否則需在對應操作時候手動通過-u選項設置關聯。
git branch -u [RemoteName]/[RemoteBranch] [LocalBranch]:將遠程分支[RemoteName]/[RemoteBranch]設置為本地分支[LocalBranch]的上游分支。[LocalBranch]默認為當前分支。
克隆、拉取、推送
git clone [RemoteURL] [SaveName]:完整克隆遠端倉庫(包括所有分支及版本)
選項:-b [Branch]僅克隆指定分支
--depth=[N]僅克隆main分支最新的N個版本(淺克隆)。使用參數--branch [branch]淺克隆指定分支。git fetch [RemoteName]:拉取遠端倉庫最新版本,需使用git merge合并到工作區git pull [RemoteName] [RemoteBranch]:拉取遠端倉庫最新版本,合并到本地當前分支工作區(相當于git fetch+git merge)。若當前分支已設置上游分支,可直接運行git pull,否則需使用-u選項關聯遠程分支。git push [RemoteName] [LocalBranch]:[RemoteBranch]:將本地的分支版本上傳到遠端倉庫并合并。若當前分支已設置上游分支,可直接運行git push,否則需使用-u選項關聯遠程分支。使用--tags選項顯式推送所有標簽。

浙公網安備 33010602011771號