自从把git reflog
纹在手机壳上(开玩笑的),我的版本控制焦虑症终于进化成了奇怪的收集癖------现在看到干净的commit历史就想截图发朋友圈。今天就把工位显示器后面贴满的便利贴整理成《Git修真秘籍》,带各位道友突破版本控制的元婴期。
一、看破红尘:Git的禅宗三问
1. ".git"文件夹里到底在修仙什么?
随手拆解自家仓库的.git目录:
bash
objects/ # 修仙洞府:存着所有commit的压缩包
refs/ # 生死簿:记录分支和tag的指针
HEAD # 本命玉牌:当前所在的分支
config # 心法口诀:本地仓库的个性化配置
实验:把项目所有代码删光,然后执行git reset --hard
,见证代码从.git里涅槃重生(建议在提离职前尝试)
2. 为什么合并分支像开盲盒?
git merge
:把两个祖先的DNA强行缝合(容易生出代码怪胎)git rebase
:让当前分支认新爹(历史线干净得像P过的自拍)
灵魂拷问:当你要给开源项目提PR时,该选哪种姿势?答案在文末彩蛋
3. 如何让提交记录美过PS五件套?
交互式rebase进阶玩法:
bash
git rebase -i HEAD~5
# 可选项:
# fixup:把commit像叠汉堡一样压扁
# reword:给旧commit整容(改信息不改变内容)
# drop:抹黑历史(慎用!)
搭配git commit --fixup=<commitID>
食用更佳,自动生成待合并的commit
二、屠龙技:那些让同事直呼内行的骚操作
1. 时间刺客:精准定位BUG
当测试小姐姐说"上周还好好的":
bash
git bisect start
git bisect bad # 当前版本有问题
git bisect good v1.0 # 指定某个正常版本
# 根据提示反复测试,Git会自动二分定位罪魁commit
(建议搭配自动化测试脚本,体验人机合一的快感)
2. 乾坤大挪移:移植代码片段
不想合并整个分支?试试樱桃采摘:
bash
git log --oneline origin/feature # 找到想要的commit哈希
git cherry-pick abc123 # 单独移植这个修改
# 遇到冲突时别慌,这就像移植器官时的排异反应
3. 分身术:同时打多份工
bash
git worktree add ../hotfix-branch # 新建工作目录
# 在另一个文件夹修改紧急BUG,与原开发环境完全隔离
git worktree list # 查看所有分身
三、禁忌奥义:在作死边缘反复横跳
1. 给大文件开光(真的会遭雷劈)
当手滑commit了200MB的测试视频:
bash
git filter-repo --invert-paths --path "社死视频.mp4"
# 重写整个仓库历史,效果堪比月光宝盒
# 副作用:所有协作者必须重新clone仓库
(请提前购买团队奶茶保险)
2. 修改上古commit的黑魔法
想让三年前的commit符合新代码规范:
bash
git rebase -i --root # 从第一个commit开始修改
# 在编辑器中给旧commit加上edit标记
git commit --amend --no-edit # 悄悄修改文件
git rebase --continue # 挨个穿越时空
警告:此操作会导致所有commit哈希值改变,堪比改写平行宇宙
3. 把Git当数据库玩
用底层命令存奇怪的东西(仅供装逼):
bash
echo "老板最帅" | git hash-object -w --stdin
# 得到一串哈希值,在.git/objects里找到这个彩虹屁
git cat-file -p <哈希值> # 多年后依然能取出当年的马屁
四、飞升指南:打造你的诛仙台(开发环境)
1. 钩子脚本:代码界的智能管家
在.git/hooks里创建pre-commit:
bash
#!/bin/sh
# 提交前自动跑ESLint
npm run lint
if [ $? -ne 0 ]; then
echo "代码有内味了,先去洗洗"
exit 1
fi
2. 别名配置:你的专属仙诀
~/.gitconfig 暗藏玄机:
ini
[alias]
倒带 = "!f() { git reset --hard HEAD@{$1}; }; f" # 时光倒流N次提交
查水表 = shortlog -sn --no-merges # 查看团队代码贡献量
开天眼 = log --graph --oneline --all # 可视化分支图谱
3. 子模块:宗门嵌套之术
当需要把其他仓库当乐高积木用:
bash
git submodule add https://github.com/大佬的轮子.git
# 更新时记得:
git submodule update --init --recursive
(此法术易产生心魔,建议搭配文档使用)
五、渡劫问答
Q:到底该不该rebase?
A:私有分支随意整容,公共分支别动刀------否则你的同事会用物理方式让你明白什么是真正的"历史不可篡改"
Q:遇到冲突就想跑路怎么办?
A:在IDE里安装GitLens插件,它的三方对比工具能让解决冲突像玩消消乐一样解压
Q:学这么多会不会走火入魔?
A:记住终极心法------所有高阶操作前,先git clone
一份到U盘,这是程序员的护身符
现在的我依然会手滑,但至少知道了:当git reflog
也救不了场时,最好的解决方案是------

"各位,我电脑突然蓝屏了,能借你的代码临时救个急吗?" (彩蛋答案:给开源项目提PR要用rebase保持干净历史,就像相亲前要把朋友圈黑历史删光)