Git 从入门到实战
全程在终端(Windows 用 Git Bash,Linux/macOS 直接用终端)复制执行,每步带注释说明;练错了直接删掉整个文件夹重来,零风险。
前置准备
- 找一个空目录作为练习根目录
- 所有命令逐行执行,每执行一步可以观察
git status的输出变化 - 遇到「冲突提示」时按说明手动处理后,再继续执行后续命令
阶段1:基础核心操作
目标:理解「工作区 → 暂存区 → 本地仓库」三层结构,掌握基础提交流程
bash
# ========== 阶段1:基础操作 ==========
# 1. 创建并进入练习目录
mkdir git-practice
cd git-practice
# 2. 初始化Git仓库(生成 .git 隐藏目录)
git init
# 3. 新建第一个文件(模拟写代码)
echo "第1行代码" > demo.txt
# 4. 查看文件状态(untracked 未跟踪)
git status
# 5. 将文件加入暂存区
git add demo.txt
# 6. 再次查看状态(staged 已暂存)
git status
# 7. 提交到本地仓库,写清提交说明
git commit -m "第一次提交:新增demo.txt"
# 8. 修改文件,追加内容
echo "第2行代码" >> demo.txt
# 9. 查看工作区与最新提交的差异
git diff
# 10. 暂存所有修改并提交
git add .
git commit -m "第二次提交:新增第2行代码"
# 11. 简洁查看提交历史
git log --oneline阶段2:分支管理 + 冲突处理
目标:掌握分支创建/切换/合并,手动解决冲突,理解 rebase 变基
bash
# ========== 阶段2:分支与冲突处理 ==========
# 1. 查看当前所有分支
git branch
# 2. 创建并切换到功能分支(模拟开发用户模块)
git switch -c feature/user
# 3. 在功能分支新增文件并提交
echo "用户模块代码" > user.txt
git add .
git commit -m "feature:完成用户模块"
# 4. 切回主分支
git switch main
# 5. 主分支也修改 demo.txt 并提交
echo "主分支更新内容" >> demo.txt
git add .
git commit -m "main:更新demo文件"
# 6. 切回功能分支,修改 demo.txt 同一位置(故意制造冲突)
git switch feature/user
echo "分支修改了第一行" > demo.txt
git add .
git commit -m "feature:修改demo第一行"
# 7. 切回主分支,执行合并
git switch main
git merge feature/user执行到这里会出现 CONFLICT 冲突提示! 手动打开
demo.txt,删除<<<<<<<、=======、>>>>>>>标记,改成最终想要的内容,保存文件后,再继续执行下面的命令。
bash
# 8. 标记冲突已解决,完成合并
git add .
git commit -m "合并feature/user分支,解决冲突"
# 9. 删除已合并的功能分支
git branch -d feature/user
# 10. 图形化查看合并后的提交历史
git log --oneline --graph补充:Rebase 变基练习
bash
# ===== Rebase 变基练习 =====
# 1. 新建支付功能分支
git switch -c feature/pay
echo "支付模块代码" > pay.txt
git add .
git commit -m "feature:新增支付模块"
# 2. 主分支先前进一个提交
git switch main
echo "主分支迭代更新" >> demo.txt
git add .
git commit -m "main:主分支迭代"
# 3. 切回功能分支,执行变基
git switch feature/pay
git rebase main变基也可能触发冲突:
- 处理冲突后执行:
git add .+git rebase --continue- 想放弃变基执行:
git rebase --abort
bash
# 4. 变基完成后查看历史,提交会变成一条直线
git log --oneline --graph阶段3:撤销与回退全场景
目标:对应不同场景用对撤销命令,搞砸了能救回来
bash
# ========== 阶段3:撤销与回退 ==========
# 先切回 main 分支
git switch main
## 场景1:修改了文件,还没 add,想撤销修改
echo "乱写的测试内容" >> demo.txt
git diff # 先看改动
git restore demo.txt # 恢复到最近一次提交的状态
## 场景2:已经 add 暂存了,想撤回暂存
echo "测试暂存撤销" >> demo.txt
git add demo.txt
git status # 看到 staged 状态
git restore --staged demo.txt # 撤出暂存区,工作区修改保留
git status # 变回 modified 状态
## 场景3:已经 commit,想回退提交(仅未推送到远程时使用)
# 先看当前提交记录
git log --oneline
# 模式1:soft - 只回退提交记录,文件保留在暂存区
git reset --soft HEAD~1
git status
git log --oneline
# 模式2:mixed(默认)- 回退提交+暂存区,文件留在工作区
git reset HEAD~1
git status
git log --oneline
# 模式3:hard - 彻底回退,所有改动消失(练习用,真实项目慎用!)
git reset --hard HEAD~1
git log --oneline
## 场景4:已 commit 且已 push 到远程,用 git revert 安全回滚
# 核心区别:reset 会删除/改写提交历史;revert 新增反向提交,保留全部历史
# 铁律:已经推送到公共分支的提交,绝对不要用 reset,必须用 revert
# 先构造一个待撤销的提交
echo "错误的测试代码" >> demo.txt
git add .
git commit -m "bug:错误提交了一行代码"
git log --oneline
# 执行 revert 反转指定提交(HEAD 表示撤销最近一次提交)
# --no-edit 表示不编辑提交信息,直接生成默认的 Revert 提交
git revert --no-edit HEAD
# 查看历史:原来的错误提交还在,多了一条 Revert 开头的新提交
git log --oneline
# 查看文件内容:错误代码已经被撤销
cat demo.txtrevert 遇到冲突的处理方式:
- 手动修改冲突文件为最终内容
git add .标记冲突已解决git revert --continue完成反转- 想放弃本次 revert:
git revert --abort
bash
## 场景5:代码写一半,临时要切分支(stash 储藏)
echo "写到一半的功能" > temp.txt
git add .
git status
# 暂存工作现场
git stash save "未完成的临时功能"
git status # 工作区变干净了
git stash list # 查看所有暂存记录
# 模拟切分支干别的事
git switch -c temp-branch
git switch main
# 恢复暂存的工作现场
git stash pop # 恢复并删除该暂存记录
git status
## 场景6:误删提交,用 reflog 找回
# 故意用 hard 回退一个提交
git reset --hard HEAD~1
git log --oneline # 看不到刚才的提交了
# 查看所有操作历史(包括已删除的提交)
git reflog
# 找到丢失的提交哈希(前面的7位字符),替换下面的 xxx 后执行
# git reset --hard xxx阶段4:本地模拟远程仓库协作
目标:掌握 clone、push、pull、fetch,模拟多人开发流程,无需联网/无需 GitHub 账号
bash
# ========== 阶段4:模拟远程协作 ==========
# 回到练习目录的上一级
cd ..
# 1. 创建裸仓库(充当远程服务器)
mkdir remote-repo.git
cd remote-repo.git
git init --bare
cd ..
# 2. 回到本地练习仓库,关联远程地址
cd git-practice
git remote add origin ../remote-repo.git
git remote -v # 查看远程地址
# 3. 推送到远程仓库(-u 建立关联,后续直接 git push 即可)
git push -u origin main
# 4. 模拟另一台电脑,克隆远程仓库
cd ..
git clone ./remote-repo.git another-pc
cd another-pc
# 5. 模拟同事修改代码并推送
echo "同事修改的内容" >> demo.txt
git add .
git commit -m "同事:更新demo文件"
git push
# 6. 回到自己的本地仓库,拉取远程更新
cd ../git-practice
# 方式一:fetch 只拉取不合并(更安全,推荐)
git fetch origin
git log --oneline origin/main # 查看远程分支的提交
git merge origin/main # 手动合并
# 方式二:pull 拉取并自动合并 = fetch + merge
# git pull origin main
## 补充:远程分支的 revert 实操
# 模拟线上bug:提交错误代码并推送到远程
echo "线上bug代码" >> demo.txt
git add .
git commit -m "bug:线上提交错误代码"
git push origin main
# 发现bug,用 revert 安全回滚(不改写远程历史,不影响其他协作者)
git revert --no-edit HEAD
git push origin main
# 此时远程其他协作者正常 pull 就能拿到回滚后的代码,不会出现历史冲突阶段5:进阶实用命令
bash
# ========== 阶段5:进阶技巧 ==========
## 1. cherry-pick 挑选单个提交
git switch -c feature/fix
echo "修复bug" > fix.txt
git add .
git commit -m "fix:修复登录bug"
git switch main
# 把上面修复提交的哈希替换 xxx,单独合入main分支
# git cherry-pick xxx
## 2. tag 版本标签
git tag -a v1.0.0 -m "正式发布v1.0版本"
git tag # 查看所有标签
git push origin v1.0.0 # 推送标签到远程
## 3. .gitignore 忽略文件
echo "node_modules/" > .gitignore
echo "*.log" >> .gitignore
git add .gitignore
git commit -m "新增gitignore配置"
## 4. git blame 查看代码责任人
git blame demo.txt自测清单
全部能独立完成就满足日常开发 99% 的场景:
关键提醒
- 已经推送到远程的提交,不要用
git reset --hard,优先用git revert生成反向提交 - 公共主分支(main/master)不要 rebase,只对自己的私有功能分支 rebase
- Windows 开发全程用 Git Bash,命令和 Linux 完全一致,避免兼容坑
- 任何时候搞砸了,先执行
git reflog,大部分情况都能找回代码

