史上最全 Git 圖文教程,沒有之一
共 14178字,需瀏覽 29分鐘
·
2024-07-25 10:30
來源:juejin.cn/post/7245176801491894333
?? 歡迎加入小哈的星球,你將獲得: 專屬的項目實戰(zhàn) / 1v1 提問 / Java 學(xué)習(xí)路線 / 學(xué)習(xí)打卡 / 每月贈書 / 社群討論
新項目:《從零手?jǐn)]:仿小紅書(微服務(wù)架構(gòu))》 正在持續(xù)爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 點擊查看項目介紹; 《從零手?jǐn)]:前后端分離博客項目(全棧開發(fā))》 2期已完結(jié),演示鏈接:http://116.62.199.48/; 截止目前,累計輸出 50w+ 字,講解圖 2200+ 張,還在持續(xù)爆肝中.. 后續(xù)還會上新更多項目,目標(biāo)是將 Java 領(lǐng)域典型的項目都整一波,如秒殺系統(tǒng), 在線商城, IM 即時通訊,Spring Cloud Alibaba 等等,戳我加入學(xué)習(xí),解鎖全部項目,已有1800+小伙伴加入
![]()
Git安裝
安裝
1.先去官網(wǎng)下載這個軟件, 準(zhǔn)備安裝到本電腦中
https://git-scm.com/
2.根據(jù)自己電腦系統(tǒng)下載此軟件到本機
Windows 系統(tǒng)直接下載
.exe文件即可,macOS 系統(tǒng)使用Homebrew命令行安裝,終端輸入git --version確認(rèn)安裝
3.默認(rèn)選擇默認(rèn)安裝路徑即可,如若想更改路徑,務(wù)必使用英文路徑
4.對于 Windows 系統(tǒng),查看安裝是否成功: 在任意文件夾右鍵,查看是否有Git Base Here 選項,有就成功了
介紹
Git 的三個區(qū)域:
-
工作區(qū): 處理工作的區(qū)域 -
暫存區(qū): 臨時存放的區(qū)域 -
本地git倉庫: 最終的存放區(qū)域
在文件夾的體現(xiàn)如下:
-
工作區(qū): 在你電腦里看到的目錄 -
暫存區(qū): 在.git文件夾內(nèi)的index中 (二進(jìn)制記錄) -
版本庫: 指的整個.git文件夾 (也認(rèn)為是本地倉庫)
在代碼中的體現(xiàn)如下:
Git使用
官方文檔:教程鏈接[1]
菜鳥教程:教程鏈接[2]
Git配置
安裝完 Git 之后,要做的第一件事就是設(shè)置你的用戶名和郵件地址。因為每一個 Git 提交都會使用這些信息
命令格式如下:中文自己看情況換
-
git config: 固定命令,設(shè)置git相關(guān)配置 -
--global: 全局配置;一次配置,整機在使用git時都生效
git config --global user.name 你的用戶名
git config --global user.email 你的郵箱地址
運行命令效果如下:
配置后,可以運行如下命令查看是否成功
git config --list
#如果信息太多,可以輸入 q 退出
運行命令效果如下:
出現(xiàn)以上內(nèi)容即為注冊成功。如果后續(xù)想要修改,只需要重新執(zhí)行一下命令即可
文件右側(cè)標(biāo)記
一般使用 VSCode 打開一個包含git倉庫的文件夾時,會有這些標(biāo)記
右側(cè)沒有標(biāo)記的時候為未修改 或 此文件/文件夾,被git忽略不跟蹤變化
-
M:已修改(Modified) - 文件已被修改但還沒有被添加到暫存區(qū) -
A:已添加(Added) - 文件已經(jīng)被添加到暫存區(qū),但還沒有被提交 -
D:已刪除(Deleted) - 文件已經(jīng)被刪除,并且已經(jīng)被標(biāo)記為刪除,但還沒有提交 -
R:已重命名(Renamed) - 文件已經(jīng)被重命名,這也算作是一種修改,需要被添加到暫存區(qū) -
C:已復(fù)制(Copied) - 文件已經(jīng)被復(fù)制,這也算作是一種修改,需要被添加到暫存區(qū) -
U:已更新但未融合(Updated but Unmerged) - 這表示一個文件已經(jīng)被更新了,但在合并時發(fā)生了沖突,需要手動解決沖突后再標(biāo)記為已解決
Git基礎(chǔ)命令
初始化空的Git倉庫
新建一個文件夾或現(xiàn)有的文件夾并不是 git 倉庫,因為文件夾內(nèi)不包含 .git 文件夾,沒有被 git 管理
可以在新文件夾或現(xiàn)有文件夾,運行如下命令得到 .git 文件夾,初始化成功則可讓 git 開始準(zhǔn)備管理
# 初始化 git 倉庫, 產(chǎn)物: .git 文件夾 (所在文件夾"內(nèi)"被管理)
git init
例如,在新文件夾中輸入git init命令用于初始化空的git版本庫
初始化空的 git 倉庫成功后,在項目文件夾中,開啟顯示隱藏文件,即可查看 .git 文件夾
-
對于 Windows 系統(tǒng),在查看里面勾選隱藏的項目選項 -
對于 macOS 系統(tǒng),使用快捷鍵 Command + Shift + .切換隱藏文件顯示
記錄更新到Git倉庫
每當(dāng)完成了一個階段的目標(biāo),想要記錄下它時,就將它提交到倉庫
核心操作:工作區(qū)開發(fā)--->將修改后的文件添加到暫存區(qū)--->將暫存區(qū)的文件記錄到版本庫
把工作區(qū)變化放到暫存區(qū)中,執(zhí)行如下命令
# 將 index.html 添加到暫存區(qū)
git add index.html
# 將css目錄下一切添加到暫存區(qū)
git add css
如下命令,可以一次性把所有變化文件放入暫存區(qū)
# .的意思是當(dāng)前目錄下所有變化都暫存
git add .
把暫存區(qū)內(nèi)容,提交到版本庫,命令如下(此處文字說明可以不加引號)
git commit -m '提交的內(nèi)容說明'
過程圖示:
以上命令相當(dāng)于存檔了一次,在版本庫中產(chǎn)生一次提交記錄并生成版本號
本次存檔,不耽誤我們在工作區(qū) (項目文件夾) 下繼續(xù)編寫項目
Git日志及狀態(tài)查看
查看所有提交的日志記錄,命令如下
git log
運行命令效果如下:
當(dāng)我們的日志越來越多,可能想要簡化查看,可以輸入如下命令
--oneline:在一行顯示簡略信息
git log --oneline
運行命令效果如下:
如果改的代碼過多,忘記改過哪些了,可以運行如下命令來查看 git 倉庫變化,只能看未提交的所有變更的文件狀態(tài)
git status
運行命令效果如下:
暫存并再次提交,產(chǎn)生一次版本記錄
git add .
git commit -m '新建登錄頁面_和樣式'
過程圖示:
Git版本回退
時光機,回到過去~
回退命令語法如下
git reset --hard 版本號
查看版本號(每次的版本號隨機生成)
git log --oneline
嘗試回退到 477321b 這次記錄上
git reset --hard 477321b
觀察工作區(qū),回退成功
如果想要在回到最近一次提交的記錄,但發(fā)現(xiàn)git log看不到未來的記錄了,問題不大。輸入git reflog命令,可以查看 git 所有的操作記錄,包括你的reset記錄
git reflog
運行命令效果如下:
拓展命令:
-
git bash(終端)清屏:clear -
git bash(終端)另起一頁:Ctrl + L
Git忽略文件
有的時候,我們某些文件或文件夾不想讓 git 進(jìn)行跟蹤管理。這時候可以在 .git 文件夾同級目錄下新增.gitignore的忽略文件并寫入忽略規(guī)則(此處的文件名就是 .gitignore ,不是后綴)
項目文件夾結(jié)構(gòu)如下:
# .gitignore內(nèi)容:
password.txt
其余用法:
# 忽略文件夾
css
# 忽略文件夾下的某個文件
css/index.js
# 忽略文件夾下某類文件
css/*.js
根目錄新建 password.txt,查看 git 追蹤到了哪些變化
git status
運行命令效果如下:
發(fā)現(xiàn)只新增了.gitignore ,符合規(guī)則的都被忽略掉了
.gitignore文件在項目中可以根據(jù)腳手架自動生成,無需自己編寫,當(dāng)然如果你非要寫,以下是Vue官方自動生成的.gitignore文件代碼,可供復(fù)制使用
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
Git分支
分支本質(zhì)
分支其實就是一個叫HEAD的指針標(biāo)記,每次代碼提交,此HEAD指針都會往后移動一次,保證指向的 (并且工作區(qū)里的) 都是最后一次提交
例如:當(dāng)我們輸入命令:git reset --hard a3bcab2,HEAD指針會移動,而且HEAD移動后,會影響工作區(qū)里的代碼
創(chuàng)建分支
-
創(chuàng)建分支命令如下
# 創(chuàng)建分支
git branch 分支名
該命令創(chuàng)建分支后不會自動切換分支,我們可以運行命令查看現(xiàn)在這個 .git 版本庫里所有分支
-
查看當(dāng)前版本庫所有分支命令如下
# 查看當(dāng)前版本庫所有分支,綠色帶*代表現(xiàn)在所處的分支
git branch
運行命令效果如下:
-
手動切換到分支上
# 切換分支命令
git checkout 分支名
運行命令效果如下:
第一次創(chuàng)建并切換到 reg 分支,你會發(fā)現(xiàn) master 分支上的所有代碼 (和當(dāng)前節(jié)點所有提交記錄) 都被復(fù)制了過來 了,我們只需要在這個基礎(chǔ)上接著往后開發(fā)就行
過程圖示:
分支下開發(fā)流程
我們現(xiàn)在就可以在當(dāng)前 reg 分支下來編寫注冊頁面的邏輯代碼,例如新建reg.html文件,并隨便寫點內(nèi)容。隨后暫存并提交一次,這次提交的記錄會出現(xiàn)在這里,如圖
以后在當(dāng)前 reg 分支下開發(fā),就會在 reg 范圍內(nèi),每次提交產(chǎn)生一次版本記錄,不會影響到別的分支
分支合并
我們可以把分支里寫好的代碼,合并到主分支或其他分支上,步驟如下:
首先,切換到你要合并到的目標(biāo)分支上(以master主分支為例)
# 切換分支
git checkout master
切換分支后,HEAD指針位置如下:
合并命令語法
# 把目標(biāo)分支名下的所有記錄, 合并到當(dāng)前分支下
git merge 目標(biāo)分支名
這里我們執(zhí)行命令git merge reg,執(zhí)行后效果如圖:
可見,reg 代碼提交記錄已經(jīng)復(fù)制到了 master (主分支) 中
分支刪除
假如注冊功能開發(fā)完畢,代碼已經(jīng)合并到 master 分支上,我們已經(jīng)不需要 reg 分支
命令如下
git branch -d 分支名
如果分支的修改沒有被合并到其他分支上,Git 會提示一個類似以下的錯誤信息:
error: The branch 'branch_name' is not fully merged. If you are sure you want to delete it, run 'git branch -D branch_name'.
在這種情況下,Git 建議你確認(rèn)是否要刪除這個分支。如果你確定要刪除該分支并且不在乎丟失該分支的修改,你可以使用git branch -D <branch_name>命令來強制刪除該分支。但請注意,這樣會丟失掉分支上的未合并修改
分支合并時的沖突問題
在兩個分支修改了同一個文件并提交過,在合并的時候,就會產(chǎn)生沖突
這里模擬一次簡單的沖突:
-
在 master 分支下,修改 login.html的某行代碼,并完成一次暫存提交
-
切換到 reg 分支下,也修改 login.html的對應(yīng)行代碼,并完成一次暫存提交
-
再切換回到 master 分支下,用合并命令,把 reg 分支下代碼和變化合并過來,不出意外就會出現(xiàn)沖突了
發(fā)生沖突后,VSCode界面
此時我們要進(jìn)行抉擇:
采用當(dāng)前更改、采用傳入更改、全部保留
選擇保留方式后,需要再次暫存提交一次
此時結(jié)束沖突狀態(tài),變回正常狀態(tài)
打印沖突合并后的日志記錄
總結(jié):當(dāng)我們合并遇到?jīng)_突了,應(yīng)手動解決,然后暫存,提交一次即可
Git分支流程圖詳解(拓展)
HEAD頭指針,它指向當(dāng)前所在的分支或者某個具體的提交記錄。每次提交會產(chǎn)生新的記錄master和HEAD會后移
以當(dāng)前節(jié)點為基準(zhǔn)創(chuàng)建新的分支 (包含之前的所有提交記錄),git branch reg 就會在當(dāng)前的提交記錄上創(chuàng)建一個新的指針,名稱為reg
git checkout reg切換的是HEAD指針指向 (切換分支)
注冊頁面新建后,git add .添加到暫存區(qū),git commit -m 產(chǎn)生了一次提交記錄
注冊頁面的樣式新建后暫存提交,產(chǎn)生了一次提交記錄
合并分支,例如把 A 合并到 B上
-
git checkout B,切換到目標(biāo)分支 B -
git merge A,把 A 分支記錄合并到所在 B 分支下
先切換到主分支git checkout master
合并reg分支git merge reg
在reg分支下,修改了index.html文件,并暫存提交,產(chǎn)生了記錄
切換到master分支,并修改index.html文件(同一個文件),暫存提交,產(chǎn)生了記錄
在master分支中,想要把reg合并過來。由于修改了同一個文件,會報錯,需要解決沖突
手動解決沖突后,會產(chǎn)生一個新的提交記錄
刪除reg分支,全部過程結(jié)束
Git遠(yuǎn)程倉庫
介紹
遠(yuǎn)程倉庫是指托管在因特網(wǎng)或其他網(wǎng)絡(luò)上的 Git 倉庫,可以存儲我們版本庫的所有記錄和存檔記錄
遠(yuǎn)程倉庫在團隊協(xié)作中發(fā)揮著重要的作用。它不僅可以充當(dāng)備份存儲,保護你的代碼免受數(shù)據(jù)丟失的風(fēng)險,還可以讓團隊成員之間輕松地共享代碼、查看代碼變更、進(jìn)行代碼審查等
主流的遠(yuǎn)程倉庫有 GitHub (gay hub)全球最大的同行交友社區(qū),以及服務(wù)器在國內(nèi)的 gitee(碼云)。由于 GitHub 服務(wù)器在國外,方便起見,這里以碼云為例,供初學(xué)者參考,GitHub 流程與 gitee 類似
注冊
注冊登錄 gitee.com 網(wǎng)站以后,添加主郵箱為自己本地 git 倉庫設(shè)置的郵箱,注意一定要相同,否則無法正確提交 如果忘記了本地設(shè)置的郵箱地址:
-
可以打開控制臺輸入 git config --list重新查看郵箱地址 -
當(dāng)然也可以使用 git config --global user.email你的郵箱地址重新覆蓋原來的郵箱地址
郵箱設(shè)置界面不要勾選不公開我的郵箱地址,否則也無法正常提交
倉庫新建
可以選擇創(chuàng)建一個遠(yuǎn)程倉庫的項目 (可以多個),創(chuàng)建界面如下
勾選完成后選擇創(chuàng)建,創(chuàng)建后, 會得到一個遠(yuǎn)程倉庫的地址鏈接,一般是以.git結(jié)尾的地址
地址分為兩種最常用的兩種傳輸協(xié)議:
-
HTTPS協(xié)議: 需要輸入用戶名和密碼 https://gitee.com/(userName)/(repositoryName).gitssh -
SSH協(xié)議: 需要配置密鑰,可免密碼登錄 [email protected]:userName/repositoryName.git
選擇SSH路徑,界面如下
SSH配置
我們可以在本機一次性配置 SSH 以后免密登錄,SSH 密鑰組成和作用如下:
-
作用: 實現(xiàn)本地倉庫和 gitee 平臺之間免登錄的加密數(shù)據(jù)傳輸 -
組成: id_rsa (私鑰文件,存放于客戶端的電腦中即可)、id_rsa.pub (公鑰文件,需要配置到 gitee 平臺中)
私鑰加密的信息,只能通過公鑰解密。公鑰加密的信息,只能通過私鑰解密。安全性高!
SSH 密鑰創(chuàng)建與使用步驟:
-
先在本機生成一個密鑰 (以后也可以重新生成、重新配置),打開一個終端,輸入以下命令:
ssh-keygen -t rsa -C "你注冊賬號的郵箱" -
連續(xù)敲擊 3 次回車,即可在
C:\Users\用戶名文件夾.ssh目錄中生成id_rsa和id_rsa.pub兩個文件 -
使用 VSCode 打開
id_rsa.pub文件,復(fù)制里面的文本內(nèi)容 -
粘貼配置到 碼云 -> 設(shè)置 -> ssh 公鑰 中即可
-
如果為 mac ,可進(jìn)入以下教程查看:mac獲取公鑰
初始化空倉庫
先給本地倉庫配置個遠(yuǎn)程倉庫的地址, 建立倉庫之間的鏈接
由于每次 push 操作都需要帶上遠(yuǎn)程倉庫的地址,十分麻煩,我們可以給倉庫設(shè)置一個別名
# 給遠(yuǎn)程倉庫設(shè)置一個別名
git remote add 倉庫別名 倉庫地址
git remote add origin [email protected]:(username)/repository.git
# 刪除 origin 這個別名
git remote remove origin
# 使用 -u 記錄 push 到遠(yuǎn)端分支的默認(rèn)值,將來直接 git push 即可
git push -u 倉庫別名 分支名
下面為實際操作舉例:
-
隨便新建一個項目文件夾,初始化 git,隨后在項目文件中隨便填充點內(nèi)容,這里我新增一個 .gitignore文件,隨后暫存提交到本地 git 庫
-
輸入以下命令:
# 注意:這里的existing_git_repo是你的項目根路徑
# 如果你是在項目文件夾開啟的終端,忽略此行
cd existing_git_repo
# 添加遠(yuǎn)程倉庫關(guān)聯(lián),倉庫別名origin,可以隨意更改,后接ssh地址
# 此處的ssh是自動生成的,可以去gitee空倉庫的代碼頁直接復(fù)制即可
git remote add origin [email protected]:li-houyi/test-factory.git
# 第一次推送到遠(yuǎn)程時需要指定具體的分支,因為遠(yuǎn)程倉庫并沒有這個分支
# 使用 -u 記錄 push 到遠(yuǎn)端分支的默認(rèn)值,將來直接 git push 即可
git push -u origin "master"
-
出現(xiàn)此頁面即為成功:
注意:推送的本地倉庫一定要非空并且本地暫存提交過,不然會報錯!這點也很好理解,你傳個空的項目到一個空倉庫,這可不得給你報錯嗎
-
推送成功后重新進(jìn)入 gitee 倉庫頁面查看是否正確推送
空倉庫創(chuàng)建成功后可以在管理頁面將倉庫開源,當(dāng)然也可以不設(shè)置開源(默認(rèn)私有)
克隆項目
如果你想要從遠(yuǎn)程倉庫克隆一份項目代碼到本地進(jìn)行開發(fā),可以使用 git clone 命令
git clone [options] <repository-url> [directory]
# directory(可選)克隆后的本地倉庫所處的目錄名稱(默認(rèn)創(chuàng)建與遠(yuǎn)程倉庫名字相同的目錄)
常見選項:
-
-b <branch>或--branch <branch>: 指定要克隆的遠(yuǎn)程倉庫的特定分支,它不會影響克隆操作所獲取的分支數(shù)量,而只是指定了默認(rèn)要檢出的分支(不指定則默認(rèn)克隆遠(yuǎn)程倉庫的主分支) -
--depth <depth>: 指定克隆的深度,即只克隆指定數(shù)量的提交歷史 -
--single-branch: 僅克隆指定分支以及該分支上的歷史記錄,不下載其他分支 -
--recurse-submodules: 初始化并克隆子模塊的內(nèi)容 -
-n 或 --no-checkout: 克隆后不立即檢出任何分支,保留 HEAD 指向原始倉庫的默認(rèn)分支 -
-o <name>或--origin <name>: 自定義遠(yuǎn)程倉庫的別名。 -
-u <remote> <branch>或--set-upstream-to=<remote>/<branch>: 設(shè)置追蹤關(guān)系,使得本地分支自動與指定的遠(yuǎn)程分支關(guān)聯(lián)
如果項目只有一個分支,那么以上代碼執(zhí)行完畢就已經(jīng)克隆結(jié)束了(git clone 默認(rèn)拉取 master 分支),不過實際開發(fā)中,并非只有一個分支,于是我們還需執(zhí)行以下步驟:
-
在本地建分支,分支名與遠(yuǎn)程分支名相同,查看遠(yuǎn)程分支名使用 git branch -r
git checkout -b 對應(yīng)遠(yuǎn)程分支名
-
拉取遠(yuǎn)程分支 (不要在 master 分支直接拉取對應(yīng)分支的代碼,切換到新建的分支)
# 每次拉取都需要指定遠(yuǎn)程倉庫名和分支名
git pull 遠(yuǎn)程倉庫名 分支名
-
以上兩行命令可以合并寫做一行(創(chuàng)建并拉取遠(yuǎn)程分支代碼)
git checkout -b 分支名 origin/分支名
-
拓展: 設(shè)置 git pull默認(rèn)拉取的分支(設(shè)置本地分支與遠(yuǎn)程分支相關(guān)聯(lián))
git branch --set-upstream-to=origin/遠(yuǎn)程分支名 本地分支名
Git遠(yuǎn)程倉庫流程回顧
Step1:
Step2:
Step3:
Step4:
Git常用命令總覽
本命令默認(rèn)遠(yuǎn)程倉庫名為origin、默認(rèn)遠(yuǎn)程倉庫主分支名為master、<>為必填項,[]為可選項
?? 歡迎加入小哈的星球,你將獲得: 專屬的項目實戰(zhàn) / 1v1 提問 / Java 學(xué)習(xí)路線 / 學(xué)習(xí)打卡 / 每月贈書 / 社群討論
新項目:《從零手?jǐn)]:仿小紅書(微服務(wù)架構(gòu))》 正在持續(xù)爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 點擊查看項目介紹; 《從零手?jǐn)]:前后端分離博客項目(全棧開發(fā))》 2期已完結(jié),演示鏈接:http://116.62.199.48/; 截止目前,累計輸出 50w+ 字,講解圖 2200+ 張,還在持續(xù)爆肝中.. 后續(xù)還會上新更多項目,目標(biāo)是將 Java 領(lǐng)域典型的項目都整一波,如秒殺系統(tǒng), 在線商城, IM 即時通訊,Spring Cloud Alibaba 等等,戳我加入學(xué)習(xí),解鎖全部項目,已有1800+小伙伴加入
![]()
2. 偷偷曝光下國內(nèi)軟件外包公司!(2024 最新版,很全!)
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點“在看”,關(guān)注公眾號并回復(fù) Java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
PS:因公眾號平臺更改了推送規(guī)則,如果不想錯過內(nèi)容,記得讀完點一下“在看”,加個“星標(biāo)”,這樣每次新文章推送才會第一時間出現(xiàn)在你的訂閱列表里。
點“在看”支持小哈呀,謝謝啦
