*Java 沉淀重走长征路*之——《从零到一玩转 Git 与 GitHub:一套方法论让你彻底告别代码混乱》
写在前面:为什么你学了 Git 还是用不好?
很多开发者都有这样的经历:看了一堆 Git 教程,记住了几十条命令,可一到实际工作,面对冲突时还是手忙脚乱,一不小心就覆盖了同事的代码,或者把不该提交的文件推到了远程仓库。原因何在?
因为绝大多数教程只教「命令是什么」,却没告诉你「为什么要用这个命令」以及「在企业里怎么配合团队使用」。本文借鉴了一套经过验证的「6 阶段教学法」,从解决实际痛点出发,逐步深入到企业级落地,让你不仅会用 Git,更能用好 Git,成为团队中让人放心的版本控制专家。
本文覆盖的核心知识点:
Git 与 GitHub 的区别与联系
工作区、暂存区、本地仓库、远程仓库
分支的创建、切换、合并、删除
代码的提交、推送、拉取、回退、重置
合并冲突的解决
标签的使用
cherry-pick 精选提交
Git Flow 工作流
阶段1:问题锚定——为什么需要版本控制?
1.1 场景化抛出问题
假设你是团队中的一名后端开发,正在开发一个电商系统。某天,产品经理要求你添加一个“用户积分”功能。你信心满满地开始写代码,可接下来的场景你熟悉吗?
场景A:代码回滚噩梦
-
你修改了多个文件,想尝试一个新方案,但不确定是否能成功。
-
你复制了一份代码备份,命名为
project_backup_20250401。 -
改了半小时,发现新方案行不通,想回到之前的版本。但你发现备份文件夹里有很多文件已经过时,根本分不清哪个版本才是可用的。
-
你只能凭记忆手动恢复,甚至可能丢失了最近修复的一个 Bug。
场景B:协作冲突大乱斗
-
你和前端同事共用同一个项目文件夹,通过 QQ 或微信传递代码。
-
同事发来一个更新包,你解压后覆盖了自己的文件,结果你之前写的接口全没了。
-
或者你俩同时修改了同一个文件,最终版本全靠手动合并,每次合并都心惊胆战。
场景C:线上事故溯源难
-
昨晚发布的新版本出现了一个严重 Bug,导致订单无法支付。
-
你打开代码,却不知道到底是哪一行代码引发的,因为上次发布后你修改了十几个文件,改动分散在各处。
-
领导问你“到底是谁改的”,你只能支支吾吾地说“可能是大家改的”。
这些场景在真实开发中每天都在发生。究其根本,是因为缺乏有效的版本控制。
1.2 技术定位梳理
Git 和 GitHub 正是为了解决上述问题而生的工具。
-
Git:一个分布式版本控制系统。它的核心价值是让开发者能够:
-
记录每次修改(谁、什么时候、改了什么)
-
随时回退到任意历史版本
-
创建独立分支,在不影响主代码的前提下进行实验
-
并行开发,多人同时修改同一项目而互不干扰
-
-
GitHub:一个基于 Git 的代码托管平台。它的核心价值是:
-
作为远程中央仓库,供团队共享代码
-
提供协作功能(Pull Request、Issues、Wiki)
-
集成CI/CD、项目管理等开发工具链
-
简单说:Git 是工具,GitHub 是平台。Git 负责在你本地管理版本,GitHub 负责帮你把代码托管到云端,方便团队协作。
1.3 技术边界说明
-
Git 不能做什么:
-
不能存储超大文件(如视频、数据库文件),但可以通过 Git LFS 扩展。
-
不能自动解决冲突,最终决定权仍在开发者。
-
不能取代项目文档或沟通。
-
-
GitHub 不能做什么:
-
不能保证私有仓库的绝对安全(需配合权限管理)。
-
不能完全替代专业的 CI/CD 工具(虽然 GitHub Actions 已很强大)。
-
在国内访问速度可能受限,部分企业会选择 GitLab 或 Gitee。
-
阶段2:基础认知——Git 的核心概念与最小示例
2.1 核心概念拆解(大白话版)
2.1.1 工作区、暂存区、本地仓库、远程仓库
把 Git 管理代码的过程想象成在厨房做菜:
-
工作区:你的厨房台面。你在这里切菜、配菜(修改文件),但还没下锅。
-
暂存区:你的调料盘。你将要下锅的食材放到盘子里(
git add),准备烹饪。 -
本地仓库:你的锅。你把盘里的食材倒进锅里(
git commit),开始烹饪,形成一个菜肴版本。 -
远程仓库:餐厅的菜单库。你将做好的菜肴拍照上传到菜单(
git push),其他食客(同事)就能看到并取用。
2.1.2 分支是什么?
分支就像在厨房里开辟多条操作台:
-
主分支(main/master):餐厅的正式菜单,只有通过试菜(测试)的菜肴才能放进去。
-
功能分支(feature):你为了研发一道新菜(新功能),单独开了一个台面。在这里你可以随意尝试,不用担心影响正式菜单。
-
合并(merge):新菜研发成功,你把它添加到正式菜单中。
2.1.3 Git 与 GitHub 的关系再深入
-
Git 是本地厨房里的所有工具和流程。
-
GitHub 是一个可以让你把厨房里的“菜谱”(代码)分享给全世界的平台,并且支持多人同时在一个菜谱上改进。
2.2 最小可运行示例
让我们通过一个最简单的例子,从零开始体验 Git 的全流程。
Step 1:安装 Git
-
访问 https://git-scm.com/,下载对应操作系统的版本并安装。
-
安装后打开终端(cmd 或 bash),输入
git --version,看到版本号即安装成功。
Step 2:配置用户信息(这是必须的,因为 Git 会记录每次提交是谁做的)
git config --global user.name "Your Name" git config --global user.email "your.email@example.com"
Step 3:初始化仓库并添加文件
# 创建一个新目录 mkdir my-project cd my-project # 初始化 Git 仓库(生成 .git 目录) git init # 创建一个文件 echo "Hello Git" > hello.txt # 查看当前状态(可以看到 hello.txt 未被跟踪) git status
Step 4:将文件添加到暂存区
git add hello.txt # 或者添加所有变化:git add . git status # 现在文件变为绿色,表示已暂存
Step 5:提交到本地仓库
git commit -m "第一次提交:添加 hello.txt" # 输出:1 file changed, 1 insertion(+)
Step 6:关联远程仓库并推送
-
首先在 GitHub 上创建一个空仓库(不要勾选 Initialize with README)。
-
复制仓库地址(如
https://github.com/yourname/my-project.git)。
# 添加远程仓库地址,起名为 origin git remote add origin https://github.com/yourname/my-project.git # 推送本地 main 分支到远程,并设置上游关联 git push -u origin main
至此,你已经在本地完成了一次版本记录,并将代码推送到了 GitHub。整个流程就是 Git 最基础的 add → commit → push。
2.3 核心原理极简讲解
2.3.1 Git 的提交对象
每次 git commit 都会生成一个提交对象,它包含:
-
一个 40 位 SHA-1 哈希值作为唯一 ID(如
a1b2c3d...) -
作者、提交者、时间戳
-
提交说明
-
指向父提交的指针(第一次提交没有父提交)
-
一个树对象,记录了当前所有文件的快照
Git 的版本历史实际上就是由这些提交对象串联成的一条有向无环图。
2.3.2 分支的本质
分支只是一个轻量级的指针,指向某个提交对象。默认分支叫 main 或 master,它指向最新的提交。当你创建一个新分支,比如 feature,只是新建了一个指向当前提交的指针。切换分支时,Git 会移动 HEAD 指针指向不同的分支。
正因为分支只是指针,所以创建和切换都非常快,这是 Git 比 SVN 等集中式版本控制高效的关键原因之一。
2.3.3 工作区、暂存区的底层
-
工作区:你实际看到的文件。
-
暂存区:对应
.git/index文件,记录了下一次提交将要包含的文件列表及它们的哈希。 -
本地仓库:
.git/objects目录下存储的所有对象。
当你 git add 时,Git 会计算文件内容的哈希,将文件压缩为 blob 对象存入 .git/objects,并将该文件的元信息更新到暂存区。git commit 时,Git 根据暂存区内容创建树对象,再创建提交对象。
阶段3:核心用法拆解——企业高频操作
3.1 按场景分类:个人开发与团队协作
我们将 Git 操作分为两大类,每类包含若干高频场景。
3.1.1 个人开发场景
| 场景 | 命令 | 说明 |
|---|---|---|
| 初始化仓库 | git init |
在现有项目中创建 Git 仓库 |
| 克隆远程仓库 | git clone <url> |
从 GitHub 等平台下载项目 |
| 查看状态 | git status |
随时查看哪些文件被修改、暂存 |
| 查看历史 | git loggit log --oneline --graph |
查看提交记录,图形化展示分支 |
| 添加修改 | git add <file>git add . |
将指定文件或所有改动加入暂存区 |
| 提交 | git commit -m "message" |
将暂存区内容提交到本地仓库 |
| 推送到远程 | git push |
将本地提交推送到远程仓库 |
| 从远程拉取 | git pull |
拉取远程更新并合并到当前分支 |
| 查看差异 | git diffgit diff --staged |
查看工作区与暂存区的差异,或暂存区与上次提交的差异 |
| 撤销工作区修改 | git checkout -- <file>git restore <file> |
丢弃工作区的改动(谨慎使用) |
| 撤销暂存 | git reset HEAD <file>git restore --staged <file> |
将文件从暂存区移回工作区,保留修改 |
| 修改最后一次提交 | git commit --amend |
修改提交信息或补充遗漏的文件 |
3.1.2 团队协作场景
| 场景 | 命令 | 说明 |
|---|---|---|
| 创建分支 | git branch <branch-name> |
创建新分支 |
| 切换分支 | git checkout <branch-name>git switch <branch-name> |
切换到指定分支(推荐 switch) |
| 创建并切换 | git checkout -b <branch-name>git switch -c <branch-name> |
创建分支并立即切换 |
| 合并分支 | git merge <branch-name> |
将指定分支合并到当前分支 |
| 删除分支 | git branch -d <branch-name> |
删除已合并的分支 |
| 强制删除 | git branch -D <branch-name> |
删除未合并的分支 |
| 查看所有分支 | git branch -a |
包括本地和远程分支 |
| 拉取指定分支 | git pull origin <branch> |
拉取远程的特定分支并合并 |
| 推送本地分支 | git push origin <local-branch> |
将本地分支推送到远程 |
| 删除远程分支 | git push origin --delete <branch> |
删除远程分支 |
| 解决冲突 | 手动编辑文件,然后 git add + git commit |
冲突解决后提交 |
| 标签管理 | git tag <tag-name>git push --tags |
创建轻量标签并推送到远程 |
| 精选提交 | git cherry-pick <commit-hash> |
将某次提交应用到当前分支 |
3.2 关键参数/配置说明
3.2.1 git commit 的关键参数
-
-m "message":直接提供提交信息。 -
-a:自动将已跟踪文件的修改加入暂存区(但不会包括新增文件)。 -
--amend:修改最近一次提交。如果之前漏了某个文件,可以先git add,再git commit --amend,这样就不会产生多余的提交记录。
3.2.2 git push 的关键参数
-
-u(--set-upstream):将本地分支与远程分支关联,之后可以直接git push或git pull而无需指定远程和分支名。 -
--force或-f:强制推送,会覆盖远程分支历史。极度危险,通常只在紧急修复或重置后使用,且需团队明确沟通。
3.2.3 git reset 的三个模式
-
--soft:仅移动 HEAD 指针,工作区和暂存区不变。适合“撤销提交但保留修改以便重新提交”。 -
--mixed(默认):移动 HEAD 并重置暂存区,但工作区不变。适合“撤销提交且取消暂存”。 -
--hard:移动 HEAD、重置暂存区和工作区。所有未提交的修改将永久丢失,使用前务必确认。
3.2.4 git merge 的策略
-
--no-ff(no fast-forward):即使可以快进,也创建一个新的合并提交。这在 Git Flow 中常用于保留功能分支的合并记录。 -
--squash:将目标分支的所有提交压缩成一个新提交,然后合并到当前分支。适合将多个零散提交整理成一个干净的提交。
3.3 常见坑点演示及解决方案
坑点1:git reset --hard 后丢失未提交的修改
场景:你正在开发一个新功能,工作区有很多改动,但还没提交。你执行了 git reset --hard HEAD^,结果所有未提交的修改瞬间消失。
解决方案:
-
如果已经发生,尝试用
git reflog找回丢失的提交。git reflog记录了 HEAD 的每一次移动,找到之前的提交哈希,然后git reset --hard <hash>恢复。 -
最佳实践:养成经常提交的习惯,尤其是重要改动前先
git commit;或者在执行危险操作前先git stash暂存工作区。
坑点2:合并冲突后不知所措
场景:git pull 后提示“Automatic merge failed; fix conflicts”,你看到文件里有 <<<<<<<、=======、>>>>>>> 标记,不知道如何处理。
解决方案:
-
打开冲突文件,手动选择保留哪部分代码(或者两者结合)。
-
删除 Git 添加的标记行。
-
保存文件后,执行
git add <file>标记为已解决。 -
最后
git commit完成合并。
最佳实践:在合并前确保当前分支是最新的(git pull),并且自己的修改已经提交。合并时尽量使用 IDE 提供的冲突解决工具(如 VS Code、IntelliJ IDEA),它们可以可视化对比,极大降低出错概率。
坑点3:git push 被拒绝(non-fast-forward)
场景:你执行 git push,报错“! [rejected] main -> main (non-fast-forward)”,意思是远程分支有比你本地更新的提交。
解决方案:
-
先
git pull --rebase(或git pull),将远程更新合并到本地,然后再git push。 -
如果是因为你之前做了
git reset或git commit --amend改变了历史,那么你需要git push --force,但务必先和团队沟通,因为这会覆盖远程历史,影响他人。
坑点4:把密码/密钥文件提交到了仓库
场景:你不小心把 application-secret.yml 提交了,其中包含数据库密码,现在想彻底删除它。
解决方案:
-
如果刚提交且未推送,可以用
git rm --cached <file>将其从暂存区移除,然后git commit --amend。 -
如果已经推送,需要重写历史:
git filter-branch或使用BFG Repo-Cleaner工具,然后强制推送。注意:这会改变所有提交的哈希,团队所有人需要重新克隆仓库。
阶段4:场景融合——团队协作中的 Git 实战
4.1 业务流程串联:一个典型的功能开发流程
假设我们有一个电商后台项目,团队有 3 名开发者:Alice、Bob 和 Charlie。他们采用基于 Git 的协作流程:
1. 产品经理在 Jira 上创建一个“用户积分功能”任务,分配给 Alice。 2. Alice 从最新主分支创建功能分支:git checkout -b feature/user-points 3. Alice 在本地开发,多次提交:git add . && git commit -m "xxx" 4. 开发完成后,Alice 将分支推送到远程:git push -u origin feature/user-points 5. Alice 在 GitHub 上创建一个 Pull Request (PR),请求将 feature/user-points 合并到 main。 6. Bob 和 Charlie 作为 reviewer 查看代码,提出修改意见。 7. Alice 根据反馈修改代码,再次推送,PR 会自动更新。 8. 审核通过后,由维护者(如技术负责人)点击“Merge”按钮,完成合并。 9. 合并后,触发 CI/CD 自动构建、测试、部署到测试环境。 10. 功能测试通过后,由运维部署到生产环境。
这个流程中,Git 和 GitHub 紧密协作,实现了代码审查、持续集成和团队协作的无缝衔接。
4.2 技术选型对比
Git vs SVN(集中式版本控制)
-
Git 优势:分布式,每个开发者本地都有完整仓库,不依赖网络;分支轻量,合并灵活;速度快。
-
SVN 优势:权限控制细致;学习曲线平缓;对大文件支持较好(但 Git LFS 已弥补)。
-
选型建议:新项目优先 Git,尤其是开源和互联网团队。传统企业若对权限要求极高且团队习惯 SVN,可继续使用。
GitHub vs GitLab vs Gitee
-
GitHub:全球最大开源社区,生态丰富(Actions、Codespaces、Projects),适合开源项目或国际化团队。
-
GitLab:一体化 DevOps 平台,内置 CI/CD 非常强大,私有化部署成熟,适合企业自建。
-
Gitee:国内访问速度快,符合国内开发者习惯,适合以国内为主的团队。
选型建议:预算充足且需要私有部署选 GitLab;国内团队且希望快速上手选 Gitee;开源项目或已有 GitHub 生态选 GitHub。
阶段5:企业级实战——从规范到落地的完整项目
5.1 实战项目选型:构建一个团队协作的“任务管理”应用
为了完整演示 Git 企业级使用,我们设计一个简单的 任务管理 API,技术栈:Spring Boot + MySQL + MyBatis,部署在云服务器。但本文重点不在代码实现,而在 Git 操作和协作规范。
项目结构(简化):
task-manager/ ├── .gitignore ├── README.md ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/com/example/taskmanager/ │ │ │ ├── controller/ │ │ │ ├── service/ │ │ │ ├── mapper/ │ │ │ └── model/ │ │ └── resources/ │ │ ├── application.yml │ │ └── mapper/*.xml │ └── test/ └── docs/
5.2 企业开发规范落地
5.2.1 分支命名规范
采用 Git Flow 风格的命名:
-
main:生产环境代码,任何时候都是可部署状态。 -
develop:开发主线,集成所有已完成的功能。 -
feature/*:功能分支,如feature/user-login、feature/task-create。 -
release/*:发布分支,如release/1.0.0,用于准备发布。 -
hotfix/*:热修复分支,如hotfix/fix-login-bug。
5.2.2 提交信息规范
参考 Conventional Commits 规范:
<type>(<scope>): <subject> <body> <footer>
type:feat(新功能)、fix(修复)、docs(文档)、style(格式)、refactor(重构)、test(测试)、chore(构建/工具)
scope:可选,表示影响的模块(如 api、db、config)
subject:简短描述,不超过 50 字
body:详细说明,说明“为什么改”和“怎么改”
footer:关闭的 Issue 号等
示例:
feat(task): 添加任务创建接口 实现了 POST /api/tasks 接口,接收任务标题和描述,返回创建后的任务对象。 Closes #12
团队可以使用 commitlint 等工具强制校验提交信息格式。
5.2.3 代码分层与目录结构
-
Controller:接收请求,参数校验,调用 Service。
-
Service:业务逻辑,事务管理。
-
Mapper/DAO:数据库访问。
-
Model:实体类、DTO、VO。
在 Git 层面,每次提交应保持“逻辑原子性”,即一个提交只做一件事,比如“添加用户注册接口”不应该同时包含“修复登录 bug”。
5.2.4 Pull Request 流程规范
-
开发者从
develop分支创建feature/xxx。 -
开发完成后,推送分支,在 GitHub/GitLab 上创建 PR,目标分支为
develop。 -
PR 模板包含:
-
简述功能
-
关联的 Issue
-
测试情况
-
截图(如果有 UI)
-
-
至少一位 reviewer 批准后,由代码负责人合并。
-
合并方式:通常选择 Squash and merge(将整个分支的提交压缩成一个)或 Merge commit(保留完整历史),根据团队习惯选择。
-
合并后删除远程分支。
5.2.5 异常处理与日志规范
在代码中合理使用日志,同时在 Git 提交中不应包含调试用的 System.out.println 或注释掉的代码。可以在 .gitignore 中忽略 IDE 配置文件、编译输出等。
5.3 测试&部署与 Git 集成
5.3.1 单元测试
在提交前,开发者应运行本地单元测试(如 mvn test)。可以在 Git 的 pre-commit 钩子中自动运行测试,防止破坏代码的提交进入仓库。
5.3.2 持续集成(CI)
使用 GitHub Actions 或 GitLab CI,当推送代码到远程时自动触发:
-
拉取最新代码
-
编译构建
-
运行测试
-
静态代码分析(如 SonarQube)
-
构建 Docker 镜像
-
部署到测试环境
配置文件示例(.github/workflows/ci.yml):
name: CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
- name: Build with Maven
run: mvn clean install
- name: Run tests
run: mvn test
5.3.3 持续部署(CD)
当 main 分支接收到合并时,自动构建并部署到生产环境。可以通过 Git 标签触发:如 git tag v1.0.0 后推送标签,触发生产部署。
阶段6:复盘升华——从会用走向用好
6.1 最佳实践总结
6.1.1 提交规范
-
小步提交:每次提交只包含一个逻辑单元,方便回退和审查。
-
提交前测试:确保当前版本至少能编译通过。
-
不要提交无意义的文件:通过
.gitignore忽略编译产物、日志、本地配置等。
6.1.2 分支策略
-
保持主分支干净:
main分支只能通过 PR 合并,且必须经过测试和审查。 -
定期同步 develop:功能分支应经常从
develop拉取最新代码,避免最后合并时出现大量冲突。 -
及时删除合并后的分支:避免分支数量膨胀。
6.1.3 冲突解决
-
在合并前先
git fetch和git diff查看差异。 -
冲突发生后,不要慌张,使用专业工具(如 VS Code 的 3-way merge)。
-
解决冲突后,再次测试确保功能正常。
6.1.4 备份与恢复
-
定期推送远程,本地仓库不是唯一的。
-
使用
git reflog作为最后的救命稻草。
6.2 技术演进讲解
6.2.1 Git 的诞生
2005 年,Linux 内核开发社区与 BitKeeper(当时使用的版本控制工具)关系破裂,Linus Torvalds 用两周时间编写了 Git。它的设计目标:
-
分布式
-
高性能
-
数据完整性(SHA-1 校验)
-
支持非线性开发(分支)
6.2.2 Git Flow 与 GitHub Flow
-
Git Flow:由 Vincent Driessen 提出,定义了严格的分支模型(master、develop、feature、release、hotfix)。适合有明确发布周期的项目。
-
GitHub Flow:更简化,只有一个长期分支
main,所有改动都通过 PR 合并。适合持续部署的 Web 项目。 -
演进趋势:随着 CI/CD 普及,很多团队转向 GitHub Flow 或 GitLab Flow,减少分支复杂度,加快迭代速度。
6.2.3 Git 的未来
-
Git 2.x 不断优化性能,引入
git switch、git restore等更直观的命令。 -
Git LFS 解决了大文件存储问题。
-
Git 与 DevOps 深度融合,成为现代软件开发的核心基础设施。
6.3 面试/工作高频问题及解答
Q1:Git 和 SVN 的主要区别是什么?
-
分布式 vs 集中式:Git 每个开发者都有完整仓库,SVN 只有中央仓库。
-
分支模型:Git 分支轻量,创建合并成本极低;SVN 分支是目录拷贝,成本高。
-
速度:Git 本地操作速度快,SVN 多数操作需要网络。
-
存储方式:Git 基于内容哈希存储,SVN 基于文件差异。
Q2:git reset、git revert、git checkout 的区别?
-
git reset:移动 HEAD 和分支指针,可改变历史(危险)。 -
git revert:创建一个新的提交来撤销之前的提交,不改变历史,安全。 -
git checkout:用于切换分支或恢复工作区文件。git restore是它的替代命令。
Q3:如何解决合并冲突?
-
先用
git status查看冲突文件。 -
手动编辑文件,保留需要的代码,删除冲突标记。
-
执行
git add标记为已解决。 -
执行
git commit完成合并。
Q4:什么是 git rebase?和 git merge 有什么区别?
-
git merge:将两个分支的历史合并,产生一个合并提交,历史真实反映分支结构。 -
git rebase:将当前分支的提交“变基”到目标分支上,形成线性历史,使提交记录更整洁。但注意不要在公共分支上使用rebase,否则会导致其他人历史冲突。
Q5:git pull 和 git fetch 的区别?
-
git fetch:只下载远程更新,但不合并到当前分支。 -
git pull=git fetch+git merge(或git fetch+git rebase如果配置了--rebase)。
Q6:如何删除一个远程分支?
bash
git push origin --delete <branch-name>
或者在 GitHub 上直接删除。
Q7:如何撤销已经推送的提交?
如果只是提交信息错了,可以用 git commit --amend 修改后强制推送(git push --force),但必须确保没有其他人基于该提交工作。更安全的方式是用 git revert 创建一个反提交。
Q8:如何找回被删除的分支或提交?
使用 git reflog 找到对应的哈希,然后 git checkout -b <new-branch> <hash> 恢复。
写在最后
Git 和 GitHub 是每个开发者必备的技能,但真正掌握它们需要理解背后的思想,而不仅仅是记忆命令。通过本文的六个阶段,我们从“为什么要用”开始,到“怎么用”,再到“企业里怎么规范用”,一步步构建了完整的知识体系。
希望你在今后的开发中,能够:
-
像用记事本一样自然使用 Git
-
在团队协作中成为版本控制的专家
-
避免因版本混乱导致的线上事故
如果你觉得本文对你有帮助,欢迎分享给更多朋友。如果你有任何疑问或想深入了解某个知识点,请在评论区留言,我会持续更新。
附录:常用命令速查表
| 命令 | 说明 |
|---|---|
git init |
初始化本地仓库 |
git clone <url> |
克隆远程仓库 |
git status |
查看状态 |
git add <file> |
将文件加入暂存区 |
git commit -m "msg" |
提交 |
git push |
推送 |
git pull |
拉取并合并 |
git fetch |
只拉取不合并 |
git branch |
列出分支 |
git checkout -b <branch> |
创建并切换分支 |
git merge <branch> |
合并分支 |
git rebase <branch> |
变基 |
git reset --hard HEAD^ |
回退到上一个版本 |
git revert <commit> |
撤销某次提交 |
git cherry-pick <commit> |
应用某个提交到当前分支 |
git tag <name> |
创建标签 |
git log --oneline --graph |
图形化查看历史 |
git reflog |
查看所有 HEAD 变动 |
git stash |
暂存当前工作区 |
本文参考了 Pro Git 书籍、Git 官方文档以及众多社区实践。文中案例代码可在 [GitHub 仓库] 获取。
更多推荐




所有评论(0)