文章目錄
- 目標
- 一、快速上手
- 1. Windows 安裝 Git
- 2. 初始化 / 克隆
- 二、核心概念速覽
- 三、常用命令清單
- 1) 查看狀態與差異
- 2) 添加與提交
- 3) 歷史與回溯
- 4) 撤銷與恢復(Git 2.23+ 推薦新命令)
- 5) 忽略文件
- 四、分支與合并(Branch & Merge)
- 1) 創建與切換
- 2) 更新主干與合并
- 3) 推送與合并回主干
- 4) 解決沖突
- 5) 常見工作流
- 五、遠程協作(Remote)
- 1) 添加與管理遠程
- 2) 獲取與推送
- 3) 追蹤分支(上游)
- 六、Gitee(碼云)使用
- 1) 創建倉庫
- 2) 使用賬號密碼或個人訪問令牌(推薦)
- 3) 綁定遠程并推送(以 HTTPS 為例)
- 4) 從 GitHub 遷移到 Gitee(鏡像)
- 七、進階:變基、挑揀、暫存與標簽
- 1) 交互式變基(整理提交歷史)
- 2) 挑揀(把某提交拷到當前分支)
- 3) 暫存(臨時擱置工作)
- 4) 標簽(發布打標)
- 八、常見問題速查
- 九、實戰練習:20 步從零到協作
目標
- 掌握 Git 基礎概念與常用命令:倉庫、提交、暫存區、分支
- 熟悉常見工作流:創建/切換分支、合并、變基、解決沖突
- 了解遠程協作:添加遠程、推送/拉取、使用 Gitee(碼云)
提示:Windows 可使用 Git Bash 或 PowerShell(需先安裝 Git for Windows)。
原文鏈接:https://blog.ybyq.wang/archives/1095.html
一、快速上手
1. Windows 安裝 Git
- 下載與安裝
- 前往 Git for Windows 官網 或 Gitee 鏡像站下載安裝包
- 雙擊安裝包,按向導進行安裝
- 驗證與基礎配置
git --version
which bash
# 基本配置(簽名和默認分支)
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
git config --global color.ui auto
# Windows:換行符自動轉換(跨平臺推薦)
git config --global core.autocrlf true
# 可選:將 VS Code 設為默認編輯器
git config --global core.editor "code --wait"
- 賬號與 Gitee 綁定(推薦使用個人訪問令牌)
# 方式一:賬號密碼(不推薦)
# 推送時按提示輸入 Gitee 用戶名和密碼# 方式二:個人訪問令牌(推薦,更安全)
# 1. 登錄 Gitee → 個人設置 → 私人令牌
# 2. 創建令牌并勾選需要的權限(如 projects)
# 3. 推送時用戶名填 Gitee 用戶名,密碼填該令牌
2. 初始化 / 克隆
# 初始化本地倉庫(在當前目錄創建 .git)
git init# 克隆遠程倉庫
git clone <repo-url>
二、核心概念速覽
- 工作區(Working Directory):你看到的文件
- 暫存區(Staging Area):下次提交的快照
- 本地倉庫(Local Repository):提交歷史(HEAD 指向的分支)
- 遠程倉庫(Remote):如
origin
(GitHub/Gitee 等)
三、常用命令清單
1) 查看狀態與差異
git status # 當前狀態
git diff # 工作區 vs 暫存區
git diff --staged # 暫存區 vs 最近一次提交
2) 添加與提交
git add <file> # 添加到暫存區
git add . # 添加所有修改
git commit -m "feat: add user api" # 提交# 修改上一條提交信息(未推送時)
git commit --amend -m "fix: correct message"
3) 歷史與回溯
git log --oneline --graph --decorate --all# 查看某次提交內容
git show <commit>
4) 撤銷與恢復(Git 2.23+ 推薦新命令)
# 丟棄工作區更改(小心使用)
git restore <file># 從暫存區移除(保留工作區修改)
git restore --staged <file># 還原一個提交(生成反向提交)
git revert <commit># 重置分支到某提交(危險,謹慎)
# --soft: 僅移動 HEAD;--mixed: 重置暫存區;--hard: 丟棄工作區
git reset --mixed <commit>
5) 忽略文件
創建 .gitignore
:
# Java/IDE 示例
/target/
*.class
*.log
.idea/
*.iml
.DS_Store
四、分支與合并(Branch & Merge)
1) 創建與切換
# 創建并切換到新分支
git switch -c feature/login
# 在已有分支間切換
git switch main
2) 更新主干與合并
# 將 feature/login 合并到 main
git switch main
git merge feature/login# 同步主干最新(需先配置遠程)
git fetch origin
git switch main
git pull --rebase origin main# 回到功能分支并合并主干變更
git switch feature/login
# 策略 1:合并提交(保留分叉歷史)
git merge main --no-ff -m "merge main into feature/login"
# 策略 2:變基(歷史更線性)
# 說明:將當前分支的提交“挪到” main 最新之后,減少合并提交
git rebase main
3) 推送與合并回主干
# 首次推送功能分支并建立上游
git push -u origin feature/login# 發起合并(建議 PR/MR 流程),或本地合并:
git switch main
git merge --no-ff feature/login -m "feat(login): implement basic login"
git push origin main
4) 解決沖突
# 沖突后,編輯沖突文件并標記已解決
git add <conflicted-files>
# 若在 rebase 流程:
git rebase --continue
# 若放棄 rebase:
git rebase --abort
5) 常見工作流
- Git Flow:
main
+develop
+ feature/release/hotfix(適合版本節奏固定) - Trunk-Based:
main
+ 短分支 + 小步快跑 + CI(多數團隊推薦)
五、遠程協作(Remote)
1) 添加與管理遠程
git remote -v
# 添加遠程別名 origin
git remote add origin <url>
# 修改遠程地址
git remote set-url origin <new-url>
2) 獲取與推送
git fetch origin # 僅拉取,不更新本地分支
git pull --rebase origin main # 拉取并變基(歷史更干凈)
git push origin main # 推送
3) 追蹤分支(上游)
# 建立本地分支與遠程上游的關聯(首次)
git push -u origin feature/x
# 之后即可:
# git push
# git pull --rebase
# 如有沖突:
# git add .
# git rebase --continue 或 git merge --continue
六、Gitee(碼云)使用
1) 創建倉庫
- 登錄 Gitee,新建倉庫,獲取 HTTPS 或 SSH 地址
2) 使用賬號密碼或個人訪問令牌(推薦)
# 方式一:賬號密碼(推送時按提示輸入)
# 方式二:個人訪問令牌(推薦)
# 1) Gitee 個人設置 → 私人令牌
# 2) 創建令牌并勾選權限(如 projects)
# 3) 推送時用戶名=Gitee 用戶名,密碼=個人令牌
3) 綁定遠程并推送(以 HTTPS 為例)
# 在已有本地倉庫中添加 origin(Gitee)
git remote add origin https://gitee.com/<your-namespace>/<repo>.git
# 首次推送(設置上游)
git push -u origin main
4) 從 GitHub 遷移到 Gitee(鏡像)
- 方案 A:在 Gitee 倉庫設置中使用“從 GitHub 導入倉庫”
- 方案 B:本地設置兩個遠程,手動推送
git remote add github git@github.com:<ns>/<repo>.git
git remote add gitee https://gitee.com/<ns>/<repo>.git
# 推送全部分支與標簽
git push gitee --all
git push gitee --tags
七、進階:變基、挑揀、暫存與標簽
1) 交互式變基(整理提交歷史)
git rebase -i HEAD~5 # squash / fixup / reword / reorder
2) 挑揀(把某提交拷到當前分支)
git cherry-pick <commit>
3) 暫存(臨時擱置工作)
git stash push -m "wip: refactor"
git stash list
git stash apply # 或 pop
4) 標簽(發布打標)
git tag v1.0.0
git tag -a v1.0.1 -m "hotfix"
git push origin --tags
八、常見問題速查
- push 被拒絕:先
git fetch
,再git rebase origin/main
或開分支提 PR - Detached HEAD:
git switch <branch>
回到分支;需要保存可新建分支git switch -c temp
- 誤刪文件:從最近提交恢復
git restore --source=HEAD -- <file>
- 大文件入庫:考慮 Git LFS;或加入
.gitignore
并清理歷史 - 行尾換行混亂:檢查
core.autocrlf
設置;跨平臺建議true
九、實戰練習:20 步從零到協作
場景:在本地新建項目 → 管理變更 → 分支開發 → 合并與解決沖突 → 連接遠程并推送 → 打標簽與回滾。命令可在 PowerShell 或 Git Bash 中執行。要求:提交信息使用中文,示例代碼使用 Java。
- 新建目錄并初始化倉庫
mkdir demo-git && cd demo-git
git init
- 配置用戶名郵箱(僅首次或需要覆蓋時)
git config user.name "學生"
git config user.email "student@example.com"
- 創建 README 并首次提交(中文提交信息)
echo "# Demo Git 項目" > README.md
git add README.md
git commit -m "初始化倉庫并添加 README"
- 新建 .gitignore 并提交(中文提交信息)
echo -e "/dist/\n*.log" > .gitignore
git add .gitignore
git commit -m ".gitignore:忽略構建產物和日志"
- 創建 Java 主類并提交(App v1)
mkdir src
# 寫入 src/App.java(v1)
echo "public class App {" > src/App.java
echo " public static void main(String[] args) {" >> src/App.java
echo " System.out.println(\"v1\");" >> src/App.java
echo " }" >> src/App.java
echo "}" >> src/App.javagit add src/App.java
git commit -m "新增 Java 主類 App(v1)"
- 創建功能分支并切換
git switch -c feature/login
- 在功能分支新增登錄功能類(提交 1)
# 寫入 src/AuthService.java(僅 login)
echo "public class AuthService {" > src/AuthService.java
echo " public boolean login() { return true; }" >> src/AuthService.java
echo "}" >> src/AuthService.javagit add src/AuthService.java
git commit -m "登錄功能:新增 AuthService,包含 login 方法"
- 在功能分支完善登出功能(提交 2)
# 覆蓋寫入,新增 logout 方法
echo "public class AuthService {" > src/AuthService.java
echo " public boolean login() { return true; }" >> src/AuthService.java
echo " public boolean logout() { return true; }" >> src/AuthService.java
echo "}" >> src/AuthService.javagit add src/AuthService.java
git commit -m "登錄功能:補充 logout 方法"
- 切回主分支并做一次修復(覆蓋重寫 App.java)
git switch main
# 將 App.java 覆蓋為含 HOTFIX 的版本
echo "public class App {" > src/App.java
echo " public static void main(String[] args) {" >> src/App.java
echo " System.out.println(\"v1\");" >> src/App.java
echo " System.out.println(\"HOTFIX\");" >> src/App.java
echo " }" >> src/App.java
echo "}" >> src/App.javagit add src/App.java
git commit -m "主分支修復:修正啟動日志(HOTFIX)"
- 將主干變更同步到功能分支(rebase,更線性)
git switch feature/login
git rebase main
- 若出現沖突則解決并繼續(無沖突可跳過)
# 編輯有沖突的文件,確認內容后:
git add .
git rebase --continue
- 將功能分支合并回主干(無快進,保留記錄)
git switch main
git merge --no-ff feature/login -m "合并 feature/login:登錄功能完成"
- 查看提交歷史圖
git log --oneline --graph --decorate --all
- 創建發布標簽(v1.0.0)
git tag -a v1.0.0 -m "首次發布版本"
- 添加遠程并首次推送(以 Gitee 為例,替換為你的倉庫)
git remote add origin https://gitee.com/<your-namespace>/<repo>.git
git push -u origin main
- 推送功能分支與標簽
git push -u origin feature/login
git push origin --tags
- 創建新分支新增 Banner 類,并將提交挑揀到 main
git switch -c feature/banner
# 寫入 src/Banner.java
echo "public class Banner {" > src/Banner.java
echo " public static void show() { System.out.println(\"BANNER\"); }" >> src/Banner.java
echo "}" >> src/Banner.javagit add src/Banner.java
git commit -m "新增 Banner 類:打印橫幅"
# 回到 main,通過分支名挑揀該提交(取分支 tip 提交)
git switch main
git cherry-pick feature/banner
- 制造一個誤提交并回退工作區/暫存區
echo "wrong" > tmp.txt
git add tmp.txt
# 發現誤加:從暫存區移除,保留工作區
git restore --staged tmp.txt
# 丟棄工作區更改(小心)
git restore tmp.txt
- 修改最近一次提交的提交信息(未推送前),并升級 App 到 v2
# 覆蓋寫入 App.java(v2)
echo "public class App {" > src/App.java
echo " public static void main(String[] args) {" >> src/App.java
echo " System.out.println(\"v1\");" >> src/App.java
echo " System.out.println(\"v2\");" >> src/App.java
echo " }" >> src/App.java
echo "}" >> src/App.javagit add src/App.java
git commit -m "升級主程序至 v2"
# 發現提交信息需要更準確:
git commit --amend -m "App 升級:輸出 v1 與 v2"
- 回滾某次已推送的功能(生成反向提交,安全)
# 假設要回滾上一步提交:
git revert HEAD
# 推送到遠程:
git push origin main
提示:
- 如遇推送被拒絕,先執行
git fetch
與git pull --rebase origin main
同步。 - 在多人協作中,建議使用 Pull Request/Merge Request 進行代碼評審與合并。
作者:xuan
個人博客:https://blog.ybyq.wang
歡迎訪問我的博客,獲取更多技術文章和教程。