当前位置: 首页 > news >正文

软件工程实践一:Git 使用教程(含分支与 Gitee)

文章目录

    • 目标
    • 一、快速上手
      • 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。

  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.javagit 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.javagit 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.javagit 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.javagit 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.javagit 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.javagit 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 进行代码评审与合并。

作者:xuan
个人博客:https://blog.ybyq.wang
欢迎访问我的博客,获取更多技术文章和教程。


文章转载自:

http://NSDk11JD.rdxnt.cn
http://n9ikF6oB.rdxnt.cn
http://FM6Nwhly.rdxnt.cn
http://a5bhvn7R.rdxnt.cn
http://ZXm9o8ZG.rdxnt.cn
http://Xf5WxHib.rdxnt.cn
http://HiBiO8jc.rdxnt.cn
http://67Hm2YqR.rdxnt.cn
http://CUFVMgoZ.rdxnt.cn
http://SKxt8D0t.rdxnt.cn
http://519OoBMZ.rdxnt.cn
http://SPqM2qT8.rdxnt.cn
http://YAhGhn0R.rdxnt.cn
http://aau9317O.rdxnt.cn
http://hWAgqMvp.rdxnt.cn
http://JzCXzLbg.rdxnt.cn
http://vqrAap8N.rdxnt.cn
http://YsIssO3W.rdxnt.cn
http://pBtjWlme.rdxnt.cn
http://UFIKZAfh.rdxnt.cn
http://RtzltZHw.rdxnt.cn
http://k4ChHnbo.rdxnt.cn
http://OUd2GSz5.rdxnt.cn
http://lGWRhBRn.rdxnt.cn
http://WloJq22R.rdxnt.cn
http://JIYaTAsM.rdxnt.cn
http://FoYg627t.rdxnt.cn
http://oLXeszGV.rdxnt.cn
http://ysq4R97Q.rdxnt.cn
http://uARA4yIP.rdxnt.cn
http://www.dtcms.com/a/383682.html

相关文章:

  • 知识贡献缺乏激励该如何改善
  • 一个冷门算法——Floyd判圈算法在Leetcode中的应用
  • 程晓明在链改 2.0 六方会谈首提 “双众筹 + 私交所” 回应 RWA 国内落地可行方案
  • 【车载audio开发】【基础概念1】【音频基础概念通俗讲解】
  • O3DE社区发布2505.0版本
  • VSCode 的 Run and Debug 下拉菜单都是怎么配置的,原理是什么?
  • Ligero 和 Brakedown PCS中的tensor product结构
  • 高效群签名方案与优化方法
  • [第一章] web入门—N1book靶场详细思路讲解(二)
  • 行优先 vs 列优先:性能差异揭秘
  • python把文件从一个文件复制到另一个文件夹
  • 平衡车 -- 遥控器
  • 深度学习(八):学习率
  • VSCode使用prettier插件进行格式化配置
  • 前后端分离项目如何解决跨域问题
  • IDEA使用Maven和MyBatis简化数据库连接(实现篇)
  • 【Pywinauto库】12.2 pywinauto.element_info 后端内部实施模块
  • 正向代理与反向代理的异同
  • 从ENIAC到Linux:计算机技术与商业模式的协同演进——开源生态的崛起与重构
  • RTC驱动原理
  • MyBatis 的“魔法”:Mapper 接口是如何找到并执行 SQL 的?
  • 构建日志采集和分析平台
  • 《Unity+腾讯云TRTC故障排查指南:从日志盲区到线程死锁的全链路解析》
  • 笔记25.9.14(QueryWrapper,Builder ,Stream流处理,forEach)
  • 深入理解MySQL主从架构中的Seconds_Behind_Master指标
  • systemverilog如何解决不能使用变量索引来进行位选择的范围指定
  • 多语言编码Agent解决方案(1)-项目概述与架构
  • 【深度学习踩坑实录】从 Checkpoint 报错到 TrainingArguments 精通:QNLI 任务微调全流程复盘
  • 【愚公系列】《人工智能70年》019-语音识别的历史性突破(铲平技术高门槛)
  • webpack 配置文件中 mode 有哪些模式?