基本概念
工作区
电脑代码所在的文件夹被称为工作区;
本地版本库
工作区中有一个.git目录,是git的版本库;
暂存库
本地版本库存储了一个名为stage的暂存去,还有git默认创建的master,以及指向master的一个指针HEAD;

远程版本库
一般指git服务器上的仓库。
以上功能关联关系

常见操作
- 拉取代码
git clone [https链接]
- 配置开发者账户密码(在git项目目录下操作)
用于每次提交代码时带的提交人信息。
git config user.name ZD
git config user.email zhangdou@88.com
- 编辑分支(本地)
a. 创建本地分支
git branch dev2
b. 修改本地分支
git branch -m dev2 dev3
c. 查看本地所有分支
git branch
d. 切换至本地分支
git checkout dev3
e. 删除本地分支
git branch -d dev3
- 查看文件变动(未提交的文件)
git status
- 添加文件到暂存区
git add readme.md
- 提交变动到版本库(提交)
git commit -m ‘git测试提交’ -m ‘第二行提交原因’
git commit -am ‘提交原因’ //将修改或删除进行提交,新增不提交
git commit —amend -m ‘修改提交原因’ //修改最后一次提交原因
- 推送分支到远程服务器(推送)
git push origin master
origin 指代的是当前的git服务器地址,这⾏命令的意思是把本地 master 分⽀推送到服务器
- 将服务器代码拉到本地
git pull origin dev
- 查看git提交记录
git log
- 给提交打标签
a. 标记某次提交记录,标记版本号
1. 确保代码已提交
git add .
git commit -m “Prepare release v1.0”
2. 创建附注标签
git tag -a v1.0 -m “Version 1.0 released”
3. 推送标签到远程
git push origin v1.0
b. 根据标签回退代码
1. 查看标签找到目标版本
git tag -l
2. 检出标签对应提交
git checkout v1.0
- 移动或重命名文件、目录
git mv a.md b.md -f
将 a.md 重命名为 b.md ,同时添加变动到暂存区,加 -f 参数可以强制重命名
- 从工作区和暂存区移除文件
git rm b.md
- 将其他分支合并到当前分支
git merge
- git栈
在 Git 的栈中保存当前修改或删除的⼯作进度,当你在⼀个分⽀⾥做某项功能开发时,接到通知把昨天已经测试完没问题 的代码发布到线上,但这时你已经在这个分⽀⾥加⼊了其它未提交的代码,这个时候就可以把这些未提交的代码存到栈⾥。
git stash //将未提交的文件保存到git栈中
git stash -m “描述” //保存时附加说明(推荐)
git stash list //查看栈中保存的列表
git stash show # 查看最新储藏的差异摘要
git stash show -p # 查看最新储藏的完整差异
git stash apply # 恢复最新储藏的修改(保留储藏记录)
git stash pop # 恢复最新储藏的修改并删除储藏记录
git stash apply stash@{n} # 恢复指定储藏(如 stash@{1})
git stash drop stash@{n} # 删除指定储藏
git stash clear # 删除所有储藏
使用场景
1. 本地修改不影响主分支(提交及撤销提交保留修改)
- 切换到本地dev分支(版本更新新增逻辑);
- 在dev分支进行代码修改;
- 提交dev修改代码不推送;
- 签出代码至
master分支(临时修改bug操作或排查逻辑); - 签出至dev分支并拉取代码保持与远程仓库一致;
- 从提交记录撤销最后一次提交操作。
git checkout dev # 切换到 dev 分支(若不存在会报错)
git add . # 暂存所有修改
git commit -m "dev 分支的修改描述" # 提交到 dev 分支
git log --oneline -n 3 # 查看dev分支最近三条提交记录回退操作
# 回退到上一个提交
git reset --soft HEAD~1
# 或指定提交哈希(更安全,尤其当提交较多时)
git reset --soft e4f5g6hHEAD~1表示回退到上一个提交(即父提交),HEAD~2表示回退到上上个提交,以此类推。- 执行后,提交记录会消失(本地分支
dev的提交历史回到e4f5g6h),但你的代码修改仍保留在工作区,可直接编辑后重新提交。
拓展: 撤销最近一次提交,并彻底丢弃修改
git reset --hard HEAD~1
# 或指定提交哈希
git reset --hard e4f5g6h- 执行后,
dev分支的提交历史会直接回退到目标提交,且工作区的所有修改(包括未暂存和已暂存的)都会被彻底删除。
| 需求 | 命令示例 | 效果 |
|---|---|---|
| 撤销最近一次提交,保留修改 | git reset --soft HEAD~1 | 提交记录回退,工作区/暂存区修改保留(可重新提交) |
| 撤销最近一次提交,彻底丢弃修改 | git reset --hard HEAD~1 | 提交记录和工作区修改全部删除(不可逆!慎用) |
| 撤销历史提交(保留历史记录) | git revert <目标提交哈希> | 新增一个反向提交,抵消原提交的影响(适合公共分支) |
2. 本地修改不影响主分支(暂存功能)
暂存是将本地已修改未提交的代码按需求暂时存储起来,存储后当前工作区中显示的是未修改前的代码,暂存恢复后又恢复成已修改的代码。
# 暂存当前所有修改(工作区和暂存区)
git stash save "临时保存:调试中的功能" # 可选描述
# 查看所有暂存的记录
git stash list # 输出类似:stash@{0}: On dev: 临时保存:调试中的功能
# 恢复最近一次暂存的修改(保留暂存区状态)
git stash apply stash@{0}
# 恢复并删除暂存记录(常用)
git stash pop stash@{0}
# 彻底删除暂存记录
git stash drop stash@{0}
# idea中的操作方式
git -> stash Changes/隐藏变更 场景 1:只提交部分文件
- 修改了
src/app.js(完成新功能)和test/test.js(测试未完成)。 - 执行
git add src/app.js将新功能暂存。 - 执行
git commit -m "完成新功能",仅提交src/app.js的修改。 test/test.js的未完成修改保留在工作区,后续继续完善后暂存提交。
场景 2:拆分一个大提交为多个小提交
- 你在
src/utils.js中同时修复了一个 bug 和优化了代码结构。 - 先
git add -p src/utils.js,选择只暂存 bug 修复的部分。 - 执行
git commit -m "修复 utils.js 中的空指针异常"。 - 再次
git add -p src/utils.js,选择暂存代码优化的部分。 - 执行
git commit -m "优化 utils.js 的循环逻辑"。
场景 3:临时保存未完成的修改
- 正在开发新功能时,需要紧急修复线上 bug(切换到
master分支)。 - 执行
git stash暂存当前未完成的修改。 - 切换到
master分支,创建并提交 bug 修复。 - 切回
dev分支,执行git stash pop恢复之前的修改,继续开发。