目标

  • 掌握 Git 基础概念与常用命令:仓库、提交、暂存区、分支
  • 熟悉常见工作流:创建/切换分支、合并、变基、解决冲突
  • 了解远程协作:添加远程、推送/拉取、使用 Gitee(码云)

提示:Windows 可使用 Git Bash 或 PowerShell(需先安装 Git for Windows)。


一、快速上手

1. Windows 安装 Git

  • 下载与安装

  • 验证与基础配置
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。
  1. 新建目录并初始化仓库
mkdir demo-git && cd demo-git
git init
  1. 配置用户名邮箱(仅首次或需要覆盖时)
git config user.name "学生"
git config user.email "student@example.com"
  1. 创建 README 并首次提交(中文提交信息)
echo "# Demo Git 项目" > README.md
git add README.md
git commit -m "初始化仓库并添加 README"
  1. 新建 .gitignore 并提交(中文提交信息)
echo -e "/dist/\n*.log" > .gitignore
git add .gitignore
git commit -m ".gitignore:忽略构建产物和日志"
  1. 创建 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)"
  1. 创建功能分支并切换
git switch -c feature/login
  1. 在功能分支新增登录功能类(提交 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 方法"
  1. 在功能分支完善登出功能(提交 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 方法"
  1. 切回主分支并做一次修复(覆盖重写 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)"
  1. 将主干变更同步到功能分支(rebase,更线性)
git switch feature/login
git rebase main
  1. 若出现冲突则解决并继续(无冲突可跳过)
# 编辑有冲突的文件,确认内容后:
git add .
git rebase --continue
  1. 将功能分支合并回主干(无快进,保留记录)
git switch main
git merge --no-ff feature/login -m "合并 feature/login:登录功能完成"
  1. 查看提交历史图
git log --oneline --graph --decorate --all
  1. 创建发布标签(v1.0.0)
git tag -a v1.0.0 -m "首次发布版本"
  1. 添加远程并首次推送(以 Gitee 为例,替换为你的仓库)
git remote add origin https://gitee.com/<your-namespace>/<repo>.git
git push -u origin main
  1. 推送功能分支与标签
git push -u origin feature/login
git push origin --tags
  1. 创建新分支新增 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
  1. 制造一个误提交并回退工作区/暂存区
echo "wrong" > tmp.txt
git add tmp.txt
# 发现误加:从暂存区移除,保留工作区
git restore --staged tmp.txt
# 丢弃工作区更改(小心)
git restore tmp.txt
  1. 修改最近一次提交的提交信息(未推送前),并升级 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"
  1. 回滚某次已推送的功能(生成反向提交,安全)
# 假设要回滚上一步提交:
git revert HEAD
# 推送到远程:
git push origin main

提示:

  • 如遇推送被拒绝,先执行 git fetchgit pull --rebase origin main 同步。
  • 在多人协作中,建议使用 Pull Request/Merge Request 进行代码评审与合并。
最后修改:2025 年 09 月 10 日
如果觉得我的文章对你有用,请随意赞赏
END
本文作者:
文章标题:软件工程实践一:Git 使用教程(含分支与 Gitee)
本文地址:https://blog.ybyq.wang/archives/1095.html
版权说明:若无注明,本文皆Xuan's blog原创,转载请保留文章出处。