Git版本控制從入門到精通的完全指南
作為當(dāng)今最流行的分布式版本控制系統(tǒng),Git 已經(jīng)成為開發(fā)者必備的技能之一。無論你是獨(dú)立開發(fā)者還是團(tuán)隊(duì)協(xié)作,Git 都能幫助你高效管理代碼版本。本文將帶你從零開始,逐步掌握 Git 的核心概念和常用操作。
Git 初始化與配置
git init
這個(gè)簡單的命令會(huì)在當(dāng)前目錄創(chuàng)建一個(gè)新的 Git 倉庫。Git 倉庫是 Git 用來跟蹤和管理項(xiàng)目變更的核心機(jī)制。執(zhí)行后,你會(huì)看到一個(gè)隱藏的 .git 文件夾,它包含了 Git 所需的所有倉庫數(shù)據(jù)。
git config user.name "sin" git config user.email "123456@qq.com"
這些配置命令非常重要,因?yàn)樗鼈冊O(shè)置了提交代碼時(shí)的作者信息。Git 會(huì)將這些信息附加到你的每一次提交上,這樣其他人就能知道是誰做了哪些修改。
查看配置項(xiàng):
git config -l
這個(gè)命令會(huì)列出所有 Git 配置,包括用戶信息、別名設(shè)置等。當(dāng)需要檢查或調(diào)試配置問題時(shí)非常有用。
刪除配置
git config -unset user.email
如果你需要?jiǎng)h除某個(gè)特定的配置項(xiàng),可以使用這個(gè)命令。注意,如果該配置是在全局設(shè)置的,你需要使用相同的范圍來刪除它。
一臺服務(wù)器可以創(chuàng)建多個(gè)本地倉庫,加了global相當(dāng)于配置在全局都生效。
git config --global user,name "sin"
全局配置(--global)會(huì)將設(shè)置應(yīng)用于當(dāng)前用戶的所有倉庫,而本地配置(不加--global)只影響當(dāng)前倉庫。這在多項(xiàng)目開發(fā)中特別有用。
是用global創(chuàng)建的想要重置需要同樣是用global關(guān)鍵字。
我們可以進(jìn)入.get文件:
[sin@VM-4-8-centos gitcode]$ cd .git
[sin@VM-4-8-centos .git]$ tree ./
./
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
| |-- applypatch-msg.sample
| |-- commit-msg.sample
| |-- post-update.sample
| |-- pre-applypatch.sample
| |-- pre-commit.sample
| |-- prepare-commit-msg.sample
| |-- pre-push.sample
| |-- pre-rebase.sample
| -- update.sample
|-- info
| -- exclude
|-- objects
| |-- info
| -- pack
-- refs
|-- heads
-- tags
.git 目錄是 Git 倉庫的核心,包含了所有版本控制所需的數(shù)據(jù)。其中:
objects目錄存儲所有數(shù)據(jù)內(nèi)容refs目錄存儲指向分支和標(biāo)簽的指針HEAD文件指向當(dāng)前所在的分支config文件包含倉庫特定的配置選項(xiàng)
不能再.git文件中手動(dòng)修改任何內(nèi)容。手動(dòng)修改可能會(huì)導(dǎo)致倉庫損壞,應(yīng)該始終使用 Git 命令來操作。
Git 基本工作流程

這張圖清晰地展示了 Git 的三個(gè)主要區(qū)域:工作區(qū)、暫存區(qū)(Stage/Index)和版本庫(Repository)。理解這三個(gè)區(qū)域的關(guān)系對掌握 Git 至關(guān)重要。
git add file.txt
git add 命令將工作區(qū)的修改添加到暫存區(qū)。暫存區(qū)就像一個(gè)準(zhǔn)備區(qū),讓你可以精心挑選哪些修改要包含在下一次提交中。
git commit file.txt -m"本次提交的細(xì)節(jié)"
git commit 命令將暫存區(qū)的修改永久保存到版本庫中。提交信息(-m參數(shù))應(yīng)該清晰描述這次提交的目的,這對日后回溯歷史非常有幫助。
git log
git log 顯示項(xiàng)目的提交歷史,包括每次提交的作者、日期和提交信息。這是了解項(xiàng)目演變過程的主要方式。
Git 對象模型
[root@VM-4-8-centos gitstudy]# tree .git
.git
|-- branches
|-- COMMIT\_EDITMSG
|-- config
|-- description
|-- HEAD
|-- hooks
| |-- applypatch-msg.sample
| |-- commit-msg.sample
| |-- post-update.sample
| |-- pre-applypatch.sample
| |-- pre-commit.sample
| |-- prepare-commit-msg.sample
| |-- pre-push.sample
| |-- pre-rebase.sample
| -- update.sample
|-- index
|-- info
| -- exclude
|-- logs
| |-- HEAD
| -- refs
| -- heads
| -- master
|-- objects
| |-- 2f
| | -- 96a52bce7a059aab3577e7e9b8499df7aa46dc
| |-- 9c
| | -- 7b41e1c03f5499d21419108d6ef57d0bec1da4
| |-- ec
| | -- 8c05d08dbd2166e7550d64239cd997a35e396c
| |-- info
| -- pack
-- refs
|-- heads
| -- master
-- tags
Git 的核心是一個(gè)內(nèi)容尋址文件系統(tǒng),這意味著它存儲的是文件內(nèi)容的哈希值而非文件名。每次提交都會(huì)創(chuàng)建一個(gè)新的對象存儲在 objects 目錄中。
[root@VM-4-8-centos gitstudy]# cat .git/refs/heads/master ec8c05d08dbd2166e7550d64239cd997a35e396c
master 分支實(shí)際上只是一個(gè)指向特定提交對象的指針。這種設(shè)計(jì)使得分支創(chuàng)建和切換非常高效。
git cat-file -p ec8c05d08dbd2166e7550d64239cd997a35e396c
git cat-file 命令可以查看 Git 對象的內(nèi)容。這是深入了解 Git 內(nèi)部工作原理的強(qiáng)大工具。
[root@VM-4-8-centos gitstudy]# git cat-file -p ec8c05d08dbd2166e7550d64239cd997a35e396c tree 9c7b41e1c03f5499d21419108d6ef57d0bec1da4 author sin <123456@sin.com> 1747633828 +0800 committer sin <123456@sin.com> 1747633828 +0800 Init and test
這個(gè)提交對象包含了指向樹對象(tree)的指針、作者信息、提交者信息和提交消息。樹對象則包含了項(xiàng)目目錄結(jié)構(gòu)和文件指針。
git追蹤管理的不是文件,是修改。這意味著 Git 關(guān)注的是內(nèi)容的變化,而不是文件本身。這種設(shè)計(jì)使得 Git 能夠高效地處理文件重命名、移動(dòng)等操作。
查看狀態(tài)與差異
git status
git status 是日常使用最頻繁的命令之一。它會(huì)告訴你:
- 哪些文件被修改但未暫存
- 哪些文件已暫存準(zhǔn)備提交
- 當(dāng)前所在的分支
- 與遠(yuǎn)程分支的關(guān)系
[root@VM-4-8-centos gitstudy]# touch file1 [root@VM-4-8-centos gitstudy]# ls file1 readme [root@VM-4-8-centos gitstudy]# git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # file1 nothing added to commit but untracked files present (use "git add" to track)
這個(gè)輸出顯示我們創(chuàng)建了一個(gè)新文件 file1,但它目前處于"未跟蹤"狀態(tài),意味著 Git 還沒有開始跟蹤它的變化。
使用git diff,可以查看文件的修改:
[root@VM-4-8-centos gitstudy]# git diff readme diff --git a/readme b/readme index 2f96a52..f633a22 100644 --- a/readme +++ b/readme @@ -1 +1,2 @@ sdsadsad +nihao
git diff 顯示工作區(qū)與暫存區(qū)之間的差異。這個(gè)輸出顯示我們在 readme 文件中添加了一行"nihao"。
版本回退
git reset [--soft | --mixed | --hard] [HEAD]

版本回退是 Git 的強(qiáng)大功能之一,但需要謹(jǐn)慎使用。三種模式的區(qū)別:
--soft: 只移動(dòng) HEAD 指針,不改變暫存區(qū)和工作區(qū)--mixed(默認(rèn)): 移動(dòng) HEAD 指針并重置暫存區(qū),但不改變工作區(qū)--hard: 徹底回退,移動(dòng) HEAD 指針、重置暫存區(qū)和工作區(qū)
要慎用hard,防止一次回退導(dǎo)致代碼消失。使用 --hard 前,確保你已經(jīng)保存或提交了所有重要更改。
回退一次之后,如何ID沒有被清楚,還是有后悔藥可以吃的(撤回 回退)
使用git reflog可以查看回退操作。git reflog 記錄了 HEAD 的所有變化,即使是被"丟失"的提交也能在這里找到。
撤銷修改

如果在工作區(qū)中,可以使用下面的代碼進(jìn)行撤銷修改:
- 手動(dòng)修改
- Git checkout -- [filename]
git checkout -- <file> 會(huì)丟棄工作區(qū)中指定文件的所有修改,將其恢復(fù)到最近一次提交或暫存的狀態(tài)。
如果代碼同時(shí)在工作區(qū)與暫存區(qū),需要使用git reset進(jìn)行版本回退。這種情況下,你需要先取消暫存(git reset HEAD <file>),然后再撤銷工作區(qū)的修改。
刪除文件
Git提供刪除命令,可以同時(shí)刪除工作區(qū)與暫存區(qū)。
git rm
git rm 不僅會(huì)從工作目錄中刪除文件,還會(huì)將這次刪除操作記錄到暫存區(qū)。這與直接刪除文件后運(yùn)行 git add 效果相同。
分支管理

分支是 Git 最強(qiáng)大的功能之一。Head可以指向其他分支,被指向的分支是當(dāng)前工作的分支。
創(chuàng)建分支:
git branch dev
分支在 Git 中非常輕量級 - 它們只是指向特定提交的指針。創(chuàng)建新分支不會(huì)復(fù)制任何文件,只是創(chuàng)建一個(gè)新的指針。
切換分支:
git checkout dev
切換分支會(huì)更新工作目錄中的文件以匹配該分支指向的提交。如果工作區(qū)有未提交的修改,Git 會(huì)阻止切換以避免數(shù)據(jù)丟失。
查看當(dāng)前分支:
git branch
不帶參數(shù)的 git branch 會(huì)列出所有本地分支,并在當(dāng)前分支前標(biāo)記星號。
合并操作: 在轉(zhuǎn)到master分支上后運(yùn)行下面的代碼,即可將dev分支合并到master分支上。
git merge dev
合并將另一個(gè)分支的修改整合到當(dāng)前分支。Git 會(huì)嘗試自動(dòng)合并,如果遇到?jīng)_突,需要手動(dòng)解決。
刪除本地分支:
git branch -d dev
刪除分支前,確保它的所有修改都已經(jīng)合并到其他分支。如果分支未合并,Git 會(huì)拒絕刪除,除非使用 -D 強(qiáng)制刪除。
git中如果兩個(gè)分支產(chǎn)生沖突,會(huì)在生成的項(xiàng)目中顯示出來,之后由開發(fā)人員手動(dòng)修復(fù)沖突。沖突標(biāo)記格式為:
<<<<<<< HEAD 當(dāng)前分支的內(nèi)容 ======= 要合并的分支的內(nèi)容 >>>>>>> branch-name
在手動(dòng)合并之后,需要進(jìn)行一次提交操作。這個(gè)提交就是合并提交,記錄了沖突解決的結(jié)果。
在git中,可以將提交過程展示為可視的圖:
git log --graph --abbrev-commit
--graph 選項(xiàng)會(huì)繪制 ASCII 圖形展示分支和合并歷史,--abbrev-commit 顯示縮寫的提交哈希,使輸出更簡潔。
分支管理策略
FastForward模式下面,并不能看出來這次的提交是正常提交還是通過merge的提交。當(dāng)合并的分支是當(dāng)前分支的直接祖先時(shí),Git 默認(rèn)會(huì)使用"快進(jìn)"(fast-forward)合并,即簡單移動(dòng)分支指針而不創(chuàng)建合并提交。要強(qiáng)制創(chuàng)建合并提交,可以使用 --no-ff 選項(xiàng)。
遠(yuǎn)程倉庫操作
從本地將代碼上傳到遠(yuǎn)程倉庫:
git push
git push 將本地分支的提交上傳到遠(yuǎn)程倉庫。第一次推送時(shí)需要使用 -u 選項(xiàng)設(shè)置上游分支。
將遠(yuǎn)程倉庫拉去到本地:
git fetch
git fetch 從遠(yuǎn)程倉庫下載所有數(shù)據(jù),但不會(huì)自動(dòng)合并到工作分支。這讓你可以在合并前先檢查變化。
git pull origin master:master
git pull 實(shí)際上是 git fetch 和 git merge 的組合操作。它會(huì)從遠(yuǎn)程倉庫獲取最新更改并嘗試合并到當(dāng)前分支。
如果遠(yuǎn)端和本地的名稱一樣的話也可以使用下面的縮寫版:
git pull origin master
Git 別名
git除了可以配置name和email,也可以為命令起別名:
git config --global alias.lpa 'log --pretty=oneline --abbrev-commit'
別名可以顯著提高工作效率。例如,上面的命令創(chuàng)建了一個(gè) lpa 別名,可以顯示簡潔的提交歷史。
標(biāo)簽管理
可以對一次commit進(jìn)行標(biāo)簽的標(biāo)識。標(biāo)簽通常用于標(biāo)記發(fā)布版本(v1.0, v2.0等)。
使用下面的命令,可以默認(rèn)為最新的提交打一個(gè)標(biāo)簽:
git tag v1.0
標(biāo)簽分為輕量標(biāo)簽(只是一個(gè)指向特定提交的指針)和附注標(biāo)簽(包含打標(biāo)簽者信息、日期和消息)。要?jiǎng)?chuàng)建附注標(biāo)簽,使用 -a 選項(xiàng)。
使用下面的命令可以查看現(xiàn)在有哪些標(biāo)簽存在:
git tag
在標(biāo)簽命令之后也可以進(jìn)行評論。使用 -m 選項(xiàng)可以為標(biāo)簽添加注釋,這對發(fā)布說明特別有用。
可以用下面的代碼刪除標(biāo)簽:
git tag -d v1.0
標(biāo)簽?zāi)J(rèn)只在本地創(chuàng)建,要共享標(biāo)簽到遠(yuǎn)程倉庫,需要顯式推送(git push origin v1.0)。
總結(jié)
Git 是一個(gè)功能強(qiáng)大且靈活的工具,掌握它可以顯著提高你的開發(fā)效率。建議從基礎(chǔ)命令開始練習(xí),逐步熟悉更高級的功能。記?。?/p>
- 頻繁提交,保持提交的原子性
- 編寫有意義的提交信息
- 合理使用分支進(jìn)行功能開發(fā)
- 定期與遠(yuǎn)程倉庫同步
隨著經(jīng)驗(yàn)的積累,你會(huì)越來越欣賞 Git 的設(shè)計(jì)哲學(xué)和強(qiáng)大能力。
以上就是Git版本控制從入門到精通的完全指南的詳細(xì)內(nèi)容,更多關(guān)于Git版本控制指南的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
修改git commit的author信息實(shí)現(xiàn)方式
當(dāng)多賬號Git提交出現(xiàn)用戶錯(cuò)誤時(shí),可通過rebase修改歷史提交的作者信息,使用amend調(diào)整最后一次提交,再用continue恢復(fù)流程,確保提交記錄顯示正確的賬號信息2025-07-07

