史上最全 Git 圖文教程,沒有之一
Git 安裝
安裝
- 先去官網下載這個軟件, 準備安裝到本電腦中
https://git-scm.com/
- 根據自己電腦系統下載此軟件到本機
Windows 系統直接下載
.exe
文件即可,macOS 系統使用Homebrew
命令行安裝,終端輸入git --version
確認安裝
-
默認選擇默認安裝路徑即可,如若想更改路徑,務必使用英文路徑
-
對於 Windows 系統,查看安裝是否成功: 在任意文件夾右鍵,查看是否有
Git Base Here
選項,有就成功了
介紹
Git 的三個區域:
-
工作區: 處理工作的區域
-
暫存區: 臨時存放的區域
-
本地 git 倉庫: 最終的存放區域
在文件夾的體現如下:
-
工作區: 在你電腦裏看到的目錄
-
暫存區: 在. git 文件夾內的 index 中 (二進制記錄)
-
版本庫: 指的整個. git 文件夾 (也認爲是本地倉庫)
在代碼中的體現如下:
Git 使用
官方文檔:教程鏈接 [1]
菜鳥教程:教程鏈接 [2]
Git 配置
安裝完 Git 之後,要做的第一件事就是設置你的用戶名和郵件地址。因爲每一個 Git 提交都會使用這些信息
命令格式如下:中文自己看情況換
-
git config: 固定命令,設置 git 相關配置
-
--global: 全局配置;一次配置,整機在使用 git 時都生效
git config --global user.name 你的用戶名
git config --global user.email 你的郵箱地址
運行命令效果如下:
配置後,可以運行如下命令查看是否成功
git config --list
#如果信息太多,可以輸入 q 退出
運行命令效果如下:
出現以上內容即爲註冊成功。如果後續想要修改,只需要重新執行一下命令即可
文件右側標記
一般使用 VSCode 打開一個包含 git 倉庫的文件夾時,會有這些標記
右側沒有標記的時候爲未修改 或 此文件 / 文件夾,被 git 忽略不跟蹤變化
-
M:已修改(Modified) - 文件已被修改但還沒有被添加到暫存區
-
A:已添加(Added) - 文件已經被添加到暫存區,但還沒有被提交
-
D:已刪除(Deleted) - 文件已經被刪除,並且已經被標記爲刪除,但還沒有提交
-
R:已重命名(Renamed) - 文件已經被重命名,這也算作是一種修改,需要被添加到暫存區
-
C:已複製(Copied) - 文件已經被複制,這也算作是一種修改,需要被添加到暫存區
-
U:已更新但未融合(Updated but Unmerged) - 這表示一個文件已經被更新了,但在合併時發生了衝突,需要手動解決衝突後再標記爲已解決
Git 基礎命令
初始化空的 Git 倉庫
新建一個文件夾或現有的文件夾並不是 git 倉庫,因爲文件夾內不包含 .git
文件夾,沒有被 git 管理
可以在新文件夾或現有文件夾,運行如下命令得到 .git
文件夾,初始化成功則可讓 git 開始準備管理
# 初始化 git 倉庫, 產物: .git 文件夾 (所在文件夾"內"被管理)
git init
例如,在新文件夾中輸入git init
命令用於初始化空的 git 版本庫
初始化空的 git 倉庫成功後,在項目文件夾中,開啓顯示隱藏文件,即可查看 .git
文件夾
-
對於 Windows 系統,在查看裏面勾選隱藏的項目選項
-
對於 macOS 系統,使用快捷鍵
Command + Shift + .
切換隱藏文件顯示
記錄更新到 Git 倉庫
每當完成了一個階段的目標,想要記錄下它時,就將它提交到倉庫
核心操作:工作區開發
--->將修改後的文件添加到暫存區
--->將暫存區的文件記錄到版本庫
把工作區變化放到暫存區中,執行如下命令
# 將 index.html 添加到暫存區
git add index.html
# 將css目錄下一切添加到暫存區
git add css
如下命令,可以一次性把所有變化文件放入暫存區
# .的意思是當前目錄下所有變化都暫存
git add .
把暫存區內容,提交到版本庫,命令如下(此處文字說明可以不加引號)
git commit -m '提交的內容說明'
過程圖示:
以上命令相當於存檔了一次,在版本庫中產生一次提交記錄並生成版本號
本次存檔,不耽誤我們在工作區 (項目文件夾) 下繼續編寫項目
Git 日誌及狀態查看
查看所有提交的日誌記錄,命令如下
git log
運行命令效果如下:
當我們的日誌越來越多,可能想要簡化查看,可以輸入如下命令
--oneline:在一行顯示簡略信息
git log --oneline
運行命令效果如下:
如果改的代碼過多,忘記改過哪些了,可以運行如下命令來查看 git 倉庫變化,只能看未提交的所有變更的文件狀態
git status
運行命令效果如下:
暫存並再次提交,產生一次版本記錄
git add .
git commit -m '新建登錄頁面_和樣式'
過程圖示:
Git 版本回退
時光機,回到過去~
回退命令語法如下
git reset --hard 版本號
查看版本號(每次的版本號隨機生成)
git log --oneline
嘗試回退到 477321b 這次記錄上
git reset --hard 477321b
觀察工作區,回退成功
如果想要在回到最近一次提交的記錄,但發現 git log 看不到未來的記錄了,問題不大。輸入git reflog
命令,可以查看 git 所有的操作記錄,包括你的 reset 記錄
git reflog
運行命令效果如下:
拓展命令:
-
git bash(終端)清屏:clear
-
git bash(終端)另起一頁:Ctrl + L
Git 忽略文件
有的時候,我們某些文件或文件夾不想讓 git 進行跟蹤管理。這時候可以在 .git 文件夾同級目錄下新增.gitignore
的忽略文件並寫入忽略規則(此處的文件名就是 .gitignore
,不是後綴)
項目文件夾結構如下:
# .gitignore內容:
password.txt
其餘用法:
# 忽略文件夾
css
# 忽略文件夾下的某個文件
css/index.js
# 忽略文件夾下某類文件
css/*.js
根目錄新建 password.txt
,查看 git 追蹤到了哪些變化
git status
運行命令效果如下:
發現只新增了.gitignore
,符合規則的都被忽略掉了
.gitignore
文件在項目中可以根據腳手架自動生成,無需自己編寫,當然如果你非要寫,以下是 Vue 官方自動生成的.gitignore
文件代碼,可供複製使用
# 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 分支
分支本質
分支其實就是一個叫 HEAD 的指針標記,每次代碼提交,此 HEAD 指針都會往後移動一次,保證指向的 (並且工作區裏的) 都是最後一次提交
例如:當我們輸入命令:git reset --hard a3bcab2
,HEAD 指針會移動,而且 HEAD 移動後,會影響工作區裏的代碼
創建分支
- 創建分支命令如下
# 創建分支
git branch 分支名
該命令創建分支後不會自動切換分支,我們可以運行命令查看現在這個 .git 版本庫裏所有分支
- 查看當前版本庫所有分支命令如下
# 查看當前版本庫所有分支,綠色帶*代表現在所處的分支
git branch
運行命令效果如下:
- 手動切換到分支上
# 切換分支命令
git checkout 分支名
運行命令效果如下:
第一次創建並切換到 reg 分支,你會發現 master 分支上的所有代碼 (和當前節點所有提交記錄) 都被複制了過來 了,我們只需要在這個基礎上接着往後開發就行
過程圖示:
分支下開發流程
我們現在就可以在當前 reg 分支下來編寫註冊頁面的邏輯代碼,例如新建reg.html
文件,並隨便寫點內容。隨後暫存並提交一次,這次提交的記錄會出現在這裏,如圖
以後在當前 reg 分支下開發,就會在 reg 範圍內,每次提交產生一次版本記錄,不會影響到別的分支
分支合併
我們可以把分支裏寫好的代碼,合併到主分支或其他分支上,步驟如下:
首先,切換到你要合併到的目標分支上(以 master 主分支爲例)
# 切換分支
git checkout master
切換分支後,HEAD 指針位置如下:
合併命令語法
# 把目標分支名下的所有記錄, 合併到當前分支下
git merge 目標分支名
這裏我們執行命令git merge reg
,執行後效果如圖:
可見,reg 代碼提交記錄已經複製到了 master (主分支) 中
分支刪除
假如註冊功能開發完畢,代碼已經合併到 master 分支上,我們已經不需要 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 建議你確認是否要刪除這個分支。如果你確定要刪除該分支並且不在乎丟失該分支的修改,你可以使用git branch -D <branch_name>
命令來強制刪除該分支。但請注意,這樣會丟失掉分支上的未合併修改
分支合併時的衝突問題
在兩個分支修改了同一個文件並提交過,在合併的時候,就會產生衝突
這裏模擬一次簡單的衝突:
- 在 master 分支下,修改
login.html
的某行代碼,並完成一次暫存提交
- 切換到 reg 分支下,也修改
login.html
的對應行代碼,並完成一次暫存提交
- 再切換回到 master 分支下,用合併命令,把 reg 分支下代碼和變化合並過來,不出意外就會出現衝突了
發生衝突後,VSCode 界面
此時我們要進行抉擇:
採用當前更改
、採用傳入更改
、全部保留
選擇保留方式後,需要再次暫存提交一次
此時結束衝突狀態,變回正常狀態
打印衝突合併後的日誌記錄
總結:當我們合併遇到衝突了,應手動解決,然後暫存,提交一次即可
Git 分支流程圖詳解(拓展)
HEAD 頭指針,它指向當前所在的分支或者某個具體的提交記錄。每次提交會產生新的記錄 master 和 HEAD 會後移
以當前節點爲基準創建新的分支 (包含之前的所有提交記錄),git branch reg
就會在當前的提交記錄上創建一個新的指針,名稱爲 reg
git checkout reg
切換的是 HEAD 指針指向 (切換分支)
註冊頁面新建後,git add .
添加到暫存區,git commit -m
產生了一次提交記錄
註冊頁面的樣式新建後暫存提交,產生了一次提交記錄
合併分支,例如把 A 合併到 B 上
-
git checkout B
,切換到目標分支 B -
git merge A
,把 A 分支記錄合併到所在 B 分支下
先切換到主分支git checkout master
合併 reg 分支git merge reg
在 reg 分支下,修改了index.html
文件,並暫存提交,產生了記錄
切換到 master 分支,並修改index.html
文件 (同一個文件),暫存提交,產生了記錄
在 master 分支中,想要把 reg 合併過來。由於修改了同一個文件,會報錯,需要解決衝突
手動解決衝突後,會產生一個新的提交記錄
刪除 reg 分支,全部過程結束
Git 遠程倉庫
介紹
遠程倉庫是指託管在因特網或其他網絡上的 Git 倉庫,可以存儲我們版本庫的所有記錄和存檔記錄
遠程倉庫在團隊協作中發揮着重要的作用。它不僅可以充當備份存儲,保護你的代碼免受數據丟失的風險,還可以讓團隊成員之間輕鬆地共享代碼、查看代碼變更、進行代碼審查等
主流的遠程倉庫有 GitHub (gay hub) 全球最大的同行交友社區,以及服務器在國內的 gitee(碼雲)。由於 GitHub 服務器在國外,方便起見,這裏以碼云爲例,供初學者參考,GitHub 流程與 gitee 類似
註冊
註冊登錄 gitee.com
網站以後,添加主郵箱爲自己本地 git 倉庫設置的郵箱,注意一定要相同,否則無法正確提交 如果忘記了本地設置的郵箱地址:
-
可以打開控制檯輸入
git config --list
重新查看郵箱地址 -
當然也可以使用
git config --global user.email
你的郵箱地址重新覆蓋原來的郵箱地址
郵箱設置界面不要勾選不公開我的郵箱地址,否則也無法正常提交
倉庫新建
可以選擇創建一個遠程倉庫的項目 (可以多個),創建界面如下
勾選完成後選擇創建,創建後, 會得到一個遠程倉庫的地址鏈接,一般是以.git
結尾的地址
地址分爲兩種最常用的兩種傳輸協議:
-
HTTPS 協議: 需要輸入用戶名和密碼
https://gitee.com/(userName)/(repositoryName).gitssh
-
SSH 協議: 需要配置密鑰,可免密碼登錄
git@gitee.com:userName/repositoryName.git
選擇 SSH 路徑,界面如下
SSH 配置
我們可以在本機一次性配置 SSH 以後免密登錄,SSH 密鑰組成和作用如下:
-
作用: 實現本地倉庫和 gitee 平臺之間免登錄的加密數據傳輸
-
組成: id_rsa (私鑰文件,存放於客戶端的電腦中即可)、id_rsa.pub (公鑰文件,需要配置到 gitee 平臺中)
私鑰加密的信息,只能通過公鑰解密。公鑰加密的信息,只能通過私鑰解密。安全性高!
SSH 密鑰創建與使用步驟:
-
先在本機生成一個密鑰 (以後也可以重新生成、重新配置),打開一個終端,輸入以下命令:
ssh-keygen -t rsa -C "你註冊賬號的郵箱"
-
連續敲擊 3 次回車,即可在
C:\Users\用戶名文件夾.ssh目錄
中生成id_rsa
和id_rsa.pub
兩個文件 -
使用 VSCode 打開
id_rsa.pub
文件,複製裏面的文本內容 -
粘貼配置到 碼雲 -> 設置 -> ssh 公鑰 中即可
-
如果爲 mac ,可進入以下教程查看:mac 獲取公鑰
初始化空倉庫
先給本地倉庫配置個遠程倉庫的地址, 建立倉庫之間的鏈接
由於每次 push 操作都需要帶上遠程倉庫的地址,十分麻煩,我們可以給倉庫設置一個別名
# 給遠程倉庫設置一個別名
git remote add 倉庫別名 倉庫地址
git remote add origin git@gitee.com:(username)/repository.git
# 刪除 origin 這個別名
git remote remove origin
# 使用 -u 記錄 push 到遠端分支的默認值,將來直接 git push 即可
git push -u 倉庫別名 分支名
下面爲實際操作舉例:
- 隨便新建一個項目文件夾,初始化 git,隨後在項目文件中隨便填充點內容,這裏我新增一個
.gitignore
文件,隨後暫存提交到本地 git 庫
- 輸入以下命令:
# 注意:這裏的existing_git_repo是你的項目根路徑
# 如果你是在項目文件夾開啓的終端,忽略此行
cd existing_git_repo
# 添加遠程倉庫關聯,倉庫別名origin,可以隨意更改,後接ssh地址
# 此處的ssh是自動生成的,可以去gitee空倉庫的代碼頁直接複製即可
git remote add origin git@gitee.com:li-houyi/test-factory.git
# 第一次推送到遠程時需要指定具體的分支,因爲遠程倉庫並沒有這個分支
# 使用 -u 記錄 push 到遠端分支的默認值,將來直接 git push 即可
git push -u origin "master"
- 出現此頁面即爲成功:
注意:推送的本地倉庫一定要非空並且本地暫存提交過,不然會報錯!這點也很好理解,你傳個空的項目到一個空倉庫,這可不得給你報錯嗎
- 推送成功後重新進入 gitee 倉庫頁面查看是否正確推送
空倉庫創建成功後可以在管理頁面將倉庫開源,當然也可以不設置開源(默認私有)
克隆項目
如果你想要從遠程倉庫克隆一份項目代碼到本地進行開發,可以使用 git clone
命令
git clone [options] <repository-url> [directory]
# directory(可選)克隆後的本地倉庫所處的目錄名稱(默認創建與遠程倉庫名字相同的目錄)
常見選項:
-
-b <branch>
或--branch <branch>
: 指定要克隆的遠程倉庫的特定分支,它不會影響克隆操作所獲取的分支數量,而只是指定了默認要檢出的分支(不指定則默認克隆遠程倉庫的主分支) -
--depth <depth>
: 指定克隆的深度,即只克隆指定數量的提交歷史 -
--single-branch: 僅克隆指定分支以及該分支上的歷史記錄,不下載其他分支
-
--recurse-submodules: 初始化並克隆子模塊的內容
-
-n 或 --no-checkout: 克隆後不立即檢出任何分支,保留 HEAD 指向原始倉庫的默認分支
-
-o <name>
或--origin <name>
: 自定義遠程倉庫的別名。 -
-u <remote> <branch>
或--set-upstream-to=<remote>/<branch>
: 設置追蹤關係,使得本地分支自動與指定的遠程分支關聯
如果項目只有一個分支,那麼以上代碼執行完畢就已經克隆結束了(git clone
默認拉取 master 分支),不過實際開發中,並非只有一個分支,於是我們還需執行以下步驟:
- 在本地建分支,分支名與遠程分支名相同,查看遠程分支名使用
git branch -r
git checkout -b 對應遠程分支名
- 拉取遠程分支 (不要在 master 分支直接拉取對應分支的代碼,切換到新建的分支)
# 每次拉取都需要指定遠程倉庫名和分支名
git pull 遠程倉庫名 分支名
- 以上兩行命令可以合併寫做一行(創建並拉取遠程分支代碼)
git checkout -b 分支名 origin/分支名
- 拓展: 設置
git pull
默認拉取的分支(設置本地分支與遠程分支相關聯)
git branch --set-upstream-to=origin/遠程分支名 本地分支名
Git 遠程倉庫流程回顧
Step1:
Step2:
Step3:
Step4:
Git 常用命令總覽
本命令默認遠程倉庫名爲 origin、默認遠程倉庫主分支名爲 master、<>
爲必填項,[]
爲可選項
參考資料
[1]
官方教程鏈接: https://git-scm.com/book/zh/v2 / 起步 - 關於版本控制
[2]
菜鳥教程鏈接: https://www.runoob.com/git/git-tutorial.htm
來源:juejin.cn/post/7245176801491894333
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/U3pTkEYgwD-dD7EaGa6wIw