1. Git是什么
Git 是一個分布式版本控制系統 (Distributed Version Control System, DVCS)。 它的核心目標是跟蹤文件的變化,讓你能夠隨時記錄、回溯、協作和管理你的項目。
2. 介紹
2.1 Git 工作區、暫存區、本地倉庫介紹
區域名稱 | 英文名 | 說明 | 相關命令 |
---|---|---|---|
工作區 | Working Directory | 你當前編輯的目錄,包含所有可見的項目文件 | git status , git checkout |
暫存區 | Staging Area / Index | 暫時保存你準備提交的文件修改(git add 后進入) | git add , git reset |
本地倉庫 | Local Repository | 提交后的版本快照,存儲于 .git 目錄中 | git commit , git log |
遠程倉庫(可選) | Remote Repository | GitHub、Gitee 等遠程平臺上的倉庫,用于多人協作 | git push , git pull |
2.2 文件生命周期(狀態流轉)
編輯文件 → git add → git commit → git push
工作區 暫存區 本地倉庫 遠程倉庫
2.3 狀態變更圖示(簡單流程)
[工作區] --git add--> [暫存區] --git commit--> [本地倉庫] --git push--> [遠程倉庫]↑ ↓ ↑修改 git reset HEAD file git pull↑ ↓
恢復(checkout) 拉取更新
3. 操作
指令 | 說明 | 示例 |
---|---|---|
git status | 查看當前工作區和暫存區狀態 | git status |
git add <file> | 將文件加入暫存區,準備提交 | git add main.c |
git add . | 添加當前目錄下所有更改文件到暫存區 | git add . |
git diff | 查看工作區和暫存區之間的差異(未暫存的修改) | git diff |
git diff --cached | 查看暫存區和最后一次 commit 的差異(已暫存未提交) | git diff --cached |
git commit -m "msg" | 提交暫存區內容到本地倉庫,并附帶提交說明 | git commit -m "fix bugs" |
git log | 查看提交歷史記錄 | git log |
git reset HEAD <file> | 從暫存區移除文件(但保留工作區更改) | git reset HEAD main.c |
git checkout -- <file> | 撤銷工作區修改,恢復成最后一次 commit 的內容 | git checkout -- main.c |
git reset --soft HEAD~1 | 撤銷最近一次 commit,保留更改在暫存區 | git reset --soft HEAD~1 |
git reset --mixed HEAD~1 | 撤銷最近一次 commit,保留更改在工作區(默認方式) | git reset --mixed HEAD~1 |
git reset --hard HEAD~1 | 撤銷最近一次 commit,且清除所有更改(慎用!) | git reset --hard HEAD~1 |
git log --oneline | 簡潔查看提交歷史(每條一行) | git log --oneline |
git reflog | 查看 HEAD 引用日志,找回丟失的提交 | git reflog |
git stash | 暫存當前所有修改(保存工作進度) | git stash |
git stash pop | 恢復最近一次 stash 并刪除 | git stash pop |
git stash apply | 應用最近一次 stash(不刪除) | |
git rm | 刪除工作區和暫存區的文件 | git rm file |
4. 忽略文件
.gitignore
以下文件需要被忽略:
- 系統或者軟件自動生成的文件
- 編譯產生的中間文件和結果文件
- 運行時生成日志文件、緩存文件、臨時文件
涉及身份、密碼、口令、秘鑰等敏感文件
匹配規則:
按行從上到下匹配
# 代表注釋
* 匹配多個字符
? 匹配單個字符
[ ]表示匹配列表中的單個字符,比如:[abc] 表示a/b/c
** 表示匹配任意的中間目錄中括號可以使用短中線連接,比如:[0-9]表示任意一位數字,[a-z]表示任意一位小寫字
! 表示取反
示例
忽略所有的 .a 文件
但跟蹤所有的 lib.a,即便你在前面忽略了.a 文件
!lib.a
只忽略當前目錄下的TOD0 文件,而不忽略subdir/ToD0
/TOD0
# 忽略任何目錄下名為 build 的文件夾
build/
忽略 doc/notes.txt,”但不忽略 doc/server/arch.txt
doc/*.txt
忽略 doc/目錄及其所有子目錄下的·pdf 文件
doc/**/*.pdf
👿注意,github官網有不同語言的gitignore模板,可以直接使用
5. SSH配置
遠程倉庫和本地倉庫同步的方式
https已不再使用
推薦使用ssh
ssh公鑰和密鑰的關系:
+-----------------+ +-----------------+
| 你的電腦 |----->| 遠程服務器 |
| (擁有私鑰) | | (擁有公鑰) |
+-----------------+ +-----------------+
配置密鑰流程:
Windows:
1.ssh-keygen -t rsa -b 4096 -c "郵箱"
生成的密鑰一般在:C:\Users\<你的用戶名>\.ssh\
2.然后將rsa.pub內的內容添加到github上
3.測試命令行輸入:ssh -T git@github.com
4.若通過則可以直接使用git clone ssh地址
5.不通過需要看下方提示
Linux:
cd .ssh
ssh-keygen -t rsa -b 4096
🤓若無法連接,可以嘗試:
在~/.ssh/
下創建config
文件
添加內容:# github Host github.com HostName ssh.github.com Port 443
6. 遠程倉庫和本地倉庫關聯
1.關聯本地倉庫和遠程倉庫git remote add origin <遠程倉庫的 URL>1.1 查看本地關聯的倉庫git remote -v
2.推送本地倉庫git push -u 遠程倉庫別名 本地分支:遠程分支
3.拉取遠程倉庫自動合并git pull手動合并git fetch
7. 分支
Git 的分支(branch)功能允許你在版本庫中創建多個開發線索,使你可以在不影響主線(如 main
)的情況下開發新功能、修復 bug 等。
? 主要用途
- 并行開發不同功能
- 實驗新特性
- 快速 bug 修復
- 提高協作效率
🛠? 常用 Git Branch 操作
1.創建新分支git branch 分支名
2.切換分支git checkout 分支名# 或 Git 2.23+ 版本git switch 分支名
3.查看分支列表git branch
4.合并分支git switch 分支名
5.刪除分支git branch -d 分支名 (已合并)git branch -D 分支名 (未合并)
8. 解決分支沖突
想象一下你和你的團隊成員正在同一個 Git 倉庫中并行開發不同的功能或修復不同的 bug。每個人都在自己的分支上工作,這樣可以保持主線代碼的穩定,并且讓不同的開發任務相互隔離。
當以下兩種情況同時發生時,就可能產生分支沖突:
- 不同的分支修改了同一文件的相同部分。 這意味著你和你的同事可能在同一文件的同一行或相鄰的幾行代碼上做了不同的更改。
- 其中一個分支的更改被合并(git merge)或變基(git rebase)到另一個分支時。 Git 在嘗試自動合并這些不同的修改時,發現無法確定最終應該保留哪個版本。
簡單來說,分支沖突就是 Git 在合并或變基分支時,遇到對同一文件相同部分的沖突修改,不知道應該采納哪個版本而需要人為介入解決的情況。
情景
- master分支修改了main1.txt 第一行
- dev分支修改了main1.txt 第一行
- master commit 修改
- dev commit 修改
- master merge dev
- 沖突產生,需要手動修改和保留,合并沖突內容
- 添加暫存區
- 提交修改
若不想繼續合并,執行
git merge --abort
終止合并過程