目标
- 掌握 Git 基础概念与常用命令:仓库、提交、暂存区、分支
- 熟悉常见工作流:创建/切换分支、合并、变基、解决冲突
- 了解远程协作:添加远程、推送/拉取、使用 Gitee(码云)
提示:Windows 可使用 Git Bash 或 PowerShell(需先安装 Git for Windows)。
一、快速上手
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.java
git 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.java
git 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.java
git 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.java
git 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.java
git 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.java
git 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 进行代码评审与合并。