Git 是一個分布式版本控制系統,用于跟蹤文件的更改,通常用于源代碼管理。它的設計目的是為了協同工作和版本管理,讓多個開發人員能夠高效地合作開發和維護代碼。
Git環境配置
在官網可以找到對應下載:Git - Downloads (git-scm.com)。安裝選項均默認即可
也可以在Windows命令行輸入:
winget install --id Git.Git -e --source winget
對于Ubuntu來說,這個PPA提供了最新的穩定的上游Git版本:
add-apt-repository ppa:git-core/ppa #可以通過添加 Git Core PPA 來安裝最新的穩定版 Git
apt update #添加 PPA 后,更新你的包列表:
apt install git #安裝最新版本的 Git
打開 Git Bash(可以在開始菜單中找到)
設置用戶名和郵箱:
git config --global user.name "你的名字"
git config --global user.email "你的郵箱地址(可隨意填寫)"
驗證配置:
git config --list
創建新的本地倉庫
在 Git Bash 中導航到你想創建新倉庫的目錄。例如:
cd D:\Test #或者在目錄下右鍵打開 Git Bash 窗口
初始化一個新的 Git 倉庫:
git init [目錄] #缺省則為當前目錄
這將在 D:\Test
目錄下創建一個新的 Git 倉庫
Git基礎操作
在 Git 中,工作目錄下文件的修改(增加、刪除、更新)會經歷幾個狀態,這些狀態會隨著你執行不同的 Git 命令而發生變化。主要的狀態包括:未追蹤(Untracked)、已暫存(Staged) 和 已提交(Committed)。
git status
命令的作用是查看當前 Git 倉庫中文件的狀態:
git status
未追蹤(Untracked)
未追蹤狀態指的是 Git 不跟蹤該文件的任何變化。這些文件存在于你的工作目錄中,但尚未被 Git 跟蹤。當你在工作目錄中新增一個文件時,它就處于未追蹤狀態。
處理方法:
-
添加到暫存區(Stage):將未追蹤的文件添加到 Git 的暫存區,使其成為已暫存狀態,準備提交到倉庫中。
git add <文件名>
或者,如果要添加所有未追蹤的文件:
git add .
已暫存(Staged)
已暫存狀態指的是文件已經被添加到 Git 的暫存區,準備被提交到倉庫中。當你執行 git add
命令后,文件就會進入這個狀態。
處理方法:
-
提交到倉庫:將已暫存的文件提交到 Git 倉庫中。
git commit -m "提交說明"
-
撤銷暫存:如果你想撤銷暫存,可以使用
git reset
命令。這會將文件從暫存區移除,但保留在工作目錄中的修改。git reset <文件名>
-
**恢復工作區文件:**恢復文件到暫存區或特定提交的狀態:
git restore <文件名>
-
恢復暫存區文件:從特定提交或暫存區恢復文件到工作區:
git restore --source=<提交ID> --staged <文件名>
已提交(Committed)
已提交狀態指的是文件的修改已經被成功提交到 Git 倉庫中,成為歷史記錄的一部分。
-
查看提交歷史:使用
git log
命令查看提交歷史記錄。git log [option]
- –all 顯示所有分支
- –pretty=oneline 將提交信息顯示為一行
- –abbrev-commit 使得輸出的commitId更簡短
- –graph 以圖的形式顯示
-
回滾到歷史版本:如果需要回滾到過去的某個版本,可以使用
git checkout
或git reset
命令,具體取決于是否想保留歷史記錄。git checkout <提交ID> <文件名> # 恢復單個文件到特定提交狀態 git restore --source=<提交ID> <文件名> # 恢復單個文件到特定提交狀態 git reset --hard <提交ID> # 回滾整個倉庫到特定提交狀態
git checkout
是一個功能強大但復雜的命令,包含了切換分支、恢復文件等多種操作。Git 2.23.0 版本中引入新命令git switch
和git restore
將這些功能分離,使得使用更加直觀和明確。
其他狀態和命令:
-
修改但未暫存:如果文件已經被 Git 跟蹤,但在提交前又有新的修改,它們會處于修改但未暫存的狀態。你可以使用
git diff
查看工作目錄和暫存區之間的差異,并決定是否要添加修改到暫存區。git diff
-
刪除文件:如果你刪除了工作目錄中的文件,Git 會將其標記為已刪除狀態。你可以使用
git rm
命令從暫存區中刪除文件,并提交該變更。git rm <文件名>
-
顯示日志:即倉庫中所有的引用更新歷史。它記錄了本地倉庫中 HEAD 和分支引用的變動,包括提交、合并、重置等操作,即使在分支已被刪除或者重置后也能查看到相應的引用歷史。
git reflog
添加文件忽略
將文件添加到 Git 的忽略列表可以防止它們被 Git 跟蹤和提交到版本控制系統中。這在某些情況下非常有用,比如臨時文件、日志文件、編譯生成的文件等不需要進行版本控制的文件。
添加要忽略的文件模式:
在工作目錄創建并打開 .gitignore
文件,并在其中添加你想要忽略的文件或目錄的模式。模式可以是文件名、文件夾名或使用通配符來匹配多個文件。Git 將根據 .gitignore
文件中的規則來忽略相應的文件或目錄。以下是一些示例:
-
忽略特定文件或目錄:
# 忽略臨時文件 temp.txt temp/# 忽略編譯生成的文件 *.exe *.dll# 忽略日志文件 *.log
-
使用通配符:
*
表示零個或多個字符。?
表示任意單個字符。!
表示取消忽略指定模式。
確保 .gitignore
文件本身被跟蹤并提交到倉庫中,以便所有團隊成員都能享有相同的忽略規則。
分支
查看本地分支
使用 git branch
命令可以查看本地倉庫中的所有分支。這個命令會列出當前倉庫中所有的分支,并且會標注出當前所在的分支(前面帶有 *
號)。
命令形式:
git branch
示例輸出:
假設你有兩個分支:master
和 feature/new-feature
,其中 master
是當前分支。
* masterfeature/new-feature
在這個示例中,*
標志表示當前所在的分支是 master
。
創建本地分支
使用 git branch <分支名>
命令可以創建一個新的本地分支,但是創建后并不會自動切換到該分支,需要使用 git checkout
或 git switch
命令切換到新創建的分支。
命令形式:
git branch <分支名>
示例:
創建一個名為 feature/new-feature
的新分支:
git branch feature/new-feature
切換分支
使用 git checkout <分支名>
命令可以切換到已經存在的本地分支。
命令形式:
git checkout <分支名>
git switch <分支名>
示例:
切換到 feature/new-feature
分支:
git checkout feature/new-feature
創建并切換到分支
如果要創建一個新的分支并立即切換到該分支,可以使用 git checkout -b <分支名>
或git switch -c <新分支名>
命令。
命令形式:
git checkout -b <新分支名>
git switch -c <新分支名>
示例:
創建并切換到名為 bugfix/123-fix
的新分支:
git checkout -b bugfix/123-fix
git switch -c bugfix/123-fix
這個命令相當于執行了以下兩個命令:
git branch bugfix/123-fix # 創建新分支
git checkout|switch bugfix/123-fix # 切換到新分支
合并分支
使用 git merge <分支名>
命令可以將指定分支的更改合并到當前分支。
命令形式:
git merge <分支名>
示例:
假設你當前在 master
分支,想將 feature/new-feature
分支合并到 master
:
git checkout master # 確保當前在 master 分支
git merge feature/new-feature
刪除分支
使用 git branch -d <分支名>
命令可以刪除一個已經存在的本地分支。需要注意的是,不能刪除當前所在的分支,刪除分支前需要切換到其他分支。
命令形式:
git branch -d <分支名>
如果要強制刪除一個分支(即使它包含未合并的更改),可以使用 git branch -D <分支名>
命令。
示例:
刪除名為 bugfix/123-fix
的分支:
git branch -d bugfix/123-fix
如果想強制刪除 bugfix/456-fix
分支,可以使用:
git branch -D bugfix/456-fix
沖突解決
當你執行 git merge
或 git pull
操作時,如果存在沖突,Git 會在合并的過程中停止,并提示你手動解決沖突。沖突會在合并操作的輸出中顯示。
沖突文件:
Git 會將沖突標記為帶有特殊標記的文件,標記的部分指示了沖突發生的位置。你需要手動編輯這些文件來解決沖突。
例如,一個沖突標記可能看起來像這樣:
<<<<<<< HEAD
這是當前分支的內容
=======
這是要合并的內容
>>>>>>> 分支名
<<<<<<< HEAD
到=======
之間的部分是當前分支(通常是你所在的分支)的修改。=======
到>>>>>>> 分支名
之間的部分是要合并的分支(通常是你要合并進當前分支的其他分支)的修改。
操作:
-
解決沖突:在沖突標記之間編輯文件,選擇或合并你需要的更改。你可以選擇保留當前分支的更改、使用要合并的分支的更改,或者合并兩者的內容。
-
保存文件:解決沖突后,保存文件并關閉編輯器。
-
添加解決后的文件:將解決沖突后的文件標記為已解決狀態,使用
git add
命令將文件添加到暫存區。git add <沖突文件>
-
完成合并:繼續執行合并操作,使用
git commit
提交已解決的合并。git commit
-
如果你不想保留默認的合并提交消息,可以通過編輯器提供的界面來編輯提交消息。
分支使用原則與流程
在軟件開發中,通常會采用一些標準化的分支管理策略,以便有效地管理和協作。以下是常見的分支使用原則與流程:
分支名稱 | 描述 | 主要用途 | 合并目標分支 |
---|---|---|---|
master | 線上生產環境的主分支,存放穩定的、經過測試的代碼。 | 發布到生產環境的代碼版本 | 無 |
develop | 從 master 分支派生,主要用于整個開發團隊的集成開發。 | 所有開發人員的日常工作基礎 | master (發布) |
feature/xxxx | 從 develop 分支派生,用于開發新功能或進行特定任務的臨時分支。 | 同期并行開發不同功能或任務 | develop |
hotfix/xxxx | 從 master 分支派生,用于緊急修復線上生產環境中的問題。 | 緊急修復線上的 bug | master , develop |
test | 從 develop 或 master 分支派生,用于代碼集成測試和驗收測試。 | 確保開發的功能符合預期且不影響現有功能的測試 | develop , master |
pre | 從 develop 分支派生,用于預上線環境測試,準備進行線上發布前的最終驗證。 | 預發布階段的最終測試和驗證 | master |
release/xxxx | 從 develop 分支派生,用于準備發布新版本的臨時分支。 | 發布前的準備工作,包括版本號更新、文檔編寫等 | master |
- 發布到生產環境的代碼版本:
master
分支存放著經過測試并準備發布到生產環境的穩定代碼版本。只有經過充分測試和驗證的代碼才能合并到master
分支。 - 所有開發人員的日常工作基礎:
develop
分支是所有開發人員進行日常開發的基礎分支,新功能的開發和測試都在這個分支上進行。 - 同期并行開發不同功能或任務:
feature/xxxx
分支用于并行開發不同的功能或任務,每個分支對應一個特定的開發任務,完成后合并回develop
分支。 - 緊急修復線上的 bug:
hotfix/xxxx
分支通常由master
分支派生,用于緊急修復線上生產環境中的問題,修復完成后需要合并回master
和develop
分支。 - 確保開發的功能符合預期且不影響現有功能的測試:
test
分支用于進行集成測試和驗收測試,確保開發的功能與預期一致且不會影響現有功能的穩定性。 - 預發布階段的最終測試和驗證:
pre
分支用于進行預上線環境的最終測試和驗證,確認準備發布到生產環境的代碼版本穩定可靠。 - 發布前的準備工作:
release/xxxx
分支用于準備發布新版本,包括版本號的更新、文檔的編寫、最終的測試和驗證等工作,完成后將代碼合并到master
分支進行發布。