文章目錄
- Git(一):初識Git
- Git簡介
- 核心功能
- 分布式特性
- 結構與操作
- 優勢與適用場景
- 創建本地倉庫
- git init
- 配置name與email
- --global
- 工作區、暫存區與版本庫
- git add
- git commit
- commit后.git的變化
Git(一):初識Git
Git簡介
Git 是一個分布式版本控制系統,由 Linus Torvalds 于 2005 年為管理 Linux 內核開發而創建 。其核心功能是跟蹤文件的修改歷史,并支持多人協作開發,使團隊成員能夠高效地管理代碼變更、回溯版本、合并修改等
核心功能
- 版本控制:Git 通過記錄文件的每次修改(稱為“提交”),形成一個完整的版本歷史。用戶可以隨時回溯到任意版本,甚至恢復早期的代碼狀態
- 分支與合并:Git 支持創建和管理多個分支(branch),允許開發者在獨立的分支上開發新功能或修復問題,最終通過合并(merge)將更改整合到主分支中 。這種非線性工作流程(如“功能分支”模型)顯著提升了協作效率
- 遠程協作:Git 是分布式系統,每個開發者本地擁有完整的代碼倉庫(.git 目錄),無需依賴中心服務器。團隊成員可通過 git push 和 git pull 同步代碼,實現跨設備的協作
- 差異比較:Git 可生成差異文件(diff),直觀展示文件或版本之間的修改內容,便于審查和調試
分布式特性
- 本地副本:每個開發者擁有獨立的本地倉庫,即使在無網絡連接時也能獨立工作,增強了系統的魯棒性
- 離線操作:開發者可在本地完成代碼修改、提交和分支管理,僅在需要時將更改推送到遠程倉庫(如 GitHub、GitLab)
結構與操作
- 工作區:日常存放代碼的目錄,用戶在此進行修改
- 暫存區(Staging Area) :用于準備提交的中間區域,通過
git add
將修改標記為待提交 - 版本庫(.git) :隱藏的
.git
目錄存儲所有提交歷史和元數據,用戶不應直接修改該目錄 - 遠程倉庫:托管在云端(如 GitHub、Gitee)的代碼倉庫,用于團隊協作和代碼同步
優勢與適用場景
- 高效性:Git 的設計注重速度,尤其適合處理大型項目(如 Linux 內核)的頻繁更新
- 靈活性:支持多種開發模式(如功能分支、特性分支),并提供豐富的命令(如
git rebase
、git stash
)以應對復雜需求 - 協作能力:通過
git pull
和git push
,團隊成員可實時同步代碼,減少沖突并確保代碼一致性
創建本地倉庫
git init
首先需要我們創建一個文件夾并進入該文件夾中,再執行git init
命令,此時文件夾中就會生成一個隱藏目錄.git
,隱藏的 .git
目錄用于存儲所有提交歷史和元數據,用戶不應直接修改該目錄
配置name與email
配置name和email是為了在遠程倉庫的提交記錄中明確操作者。這有助于團隊協作時追蹤代碼修改的來源,確保每個提交都能被正確歸因,命令如下:
git config --global user.name "你的名字"
git config --global user.email "你的郵箱地址"
配置成功后,可以使用如下命令查看配置項:
git config -l
同時,我們也可以刪除配置項后再重新配置,用到的命令如下:
git config --global --unset user.name
git config --global --unset user.email
–global
在Git中,git config --global user.name "你的名字"
命令中的--global
選項表示將配置的用戶名應用到當前用戶的所有Git倉庫中。具體來說,使用--global
選項時,Git會將用戶信息保存在用戶主目錄下的.gitconfig文件中,這樣無論你在哪個項目中使用Git,都會默認使用這個全局配置的用戶名和郵箱地址進行提交
使用--global
配置,在刪除時也需要帶上--global
工作區、暫存區與版本庫
我們在gitcode目錄中新建一個ReadMe文件,不進行其他操作,此時Git就可以進行版本控制了嗎?
答案是不能,因為ReadMe還沒有被添加進版本庫中,只是在工作區中
-
工作區:是在電腦上你要寫代碼或文件的目錄。
-
暫存區:英文叫stage或index。?般存放在.git 目錄下的index文件(.git/index)中,我們把暫存區有時也叫作索引(index)
-
版本庫:又名倉庫,英文名repository 。?作區有?個隱藏目錄.git ,它不算?作區,而是Git的版本庫。這個版本庫里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git 都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”
下面這個圖展示了工作區、暫存區和版本庫之間的關系:
圖中左側為工作區,右側為版本庫。Git的版本庫里存了很多東西,其中最重要的就是暫存區
- 在創建Git版本庫時,Git會為我們自動創建?個唯?的master分支,以及指向master的?個指 針叫HEAD(分支和HEAD的概念后面再說)
- 當對工作區修改(或新增)的文件執行git add命令時,暫存區目錄樹的文件索引會被更新
- 當執行提交操作
git commit
時,master分支會做相應的更新,可以簡單理解為暫存區的目錄樹才會被真正寫到版本庫中。
由上述描述我們便能得知:通過新建或粘貼進目錄的文件,并不能稱之為向倉庫中新增文件,而只是 在?作區新增了文件。必須要通過使用git add和git commit命令才能將文件添加到倉庫中進行管理!!
但是上圖中并沒有體現版本控制!我們每次**修改(新增、修改、刪除)**的內容存放在那里呢?
原因是在版本庫中還有一個名為Objects的對象庫,里面包含了創建的各種版本庫對象及內容。當執行git add
命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的?個新的對象中,就位于".git/objects"目錄下
git add
git add
是 Git 中用于將文件修改添加到暫存區(Staging Area)的命令。暫存區是提交前保存更改的臨時區域。通過git add
,可以將工作目錄中的文件修改、新增或刪除操作標記為“已暫存”,以便后續提交到版本庫
我們執行git add
命令,將ReadMe文件添加到暫存區中,再查看一下.git的目錄結構:
index與master中存放的都是索引,指向的是Objects中的對象
git add
命令執行時有兩種方式:
-
git add
后面直接加上文件名表示只添加該文件到暫存區,可以同時添加多個文件 -
git add .
表示添加工作區中所有文件到暫存區
git add
其他常見選項
- 添加所有文件(包括刪除的文件)
git add -A(all)
該命令會將當前目錄下所有文件的修改、新增和刪除操作添加到暫存區,適用于一次性處理所有變更
- 僅添加已跟蹤文件的修改和刪除
git add -u
該命令會將已跟蹤文件的修改(modified)和刪除(deleted)添加到暫存區,但不包括新增的文件(new)
- 撤銷添加,若需撤銷
git add
操作,可使用git reset
:
git reset
git commit
git commit
是 Git 中用于記錄對存儲庫更改的核心命令。它將暫存區的內容(即通過git add
添加的文件)保存為一個新的提交,并附帶描述更改的日志消息。新提交通常會成為當前分支的最新提交并更新分支指針指向它,格式如下:
git commit -m "日志信息"
同時我們可以使用git log
命令來查看提交記錄,它會按時間倒序顯示當前分支的提交記錄,最近的提交在頂部。每個提交包含哈希值、作者、日期和提交信息
git log --pretty=oneline
可以按行打印
那一長串的數字就是每次commit生成的commit id,它是每次提交的唯一標識,可以用來進行版本追蹤、數據完整性校驗、協作開發、回滾操作、代碼版本管理等
git commit
其他常見選項
- 修改最近一次提交,可以用來修正提交消息或添加遺漏的文件
git commit --amend -m "新的提交消息"
- 預覽將要提交的內容,但不實際創建提交
git commit --dry-run
commit后.git的變化
在前面的圖中,HEAD指向了master,我們來驗證一下:
我們再來看一下master指向的是什么
我們發現master指向了一個commit id,我們再查看一下這個commit id指向的內容,命令如下:
git cat-file -p commit id
這時我們發現,它就是我們最近一次提交的日志信息,我們再來查看一下tree后面的commit id:
我們一直查看到底,就會發現,其中記錄了我們在ReadMe中新增的內容,而上述所有的commit id均在Objects中有記錄
?
?