其实最烦的不是Git本身。
是那些你闭着眼睛都会敲、却每天都要敲的命令。
就像你每天刷牙——没人觉得刷牙需要动脑子,但特么的为什么要我刷?
## 子模块?我真的会谢
昨天同事问我:你每次加子模块都要搜一遍URL?
我没回答。
# 项目克隆地址
git clone https://gitcode.com/gh_mirrors/gi/git-scripts.git
cd git-scripts
# 将脚本添加到PATH
export PATH=$PATH:$(pwd)
缘由是我不愿去承认,我竟然在背那个仓库地址时大脑一片混乱,怎么也记不住,哪怕它是我亲自负责且开展的项目。
git submodule add git@github.com:... 等下,是https还是ssh
# 基本用法
git-addsub path/to/submodule
# 批量添加多个子模块
git-addsub module1 module2 module3
网络上的教程都声称git,那种系统能够自动进行格式转换。但是,实事求是来讲,在我安装该系统的第一周,不管怎样都根本没敢去使用它——。
我怕它把我仓库搞炸。
之后有一回加夜班一直到凌晨三点,在进行复制粘贴操作时地址弄错了,运行git status后出现了一堆显示为已修改的数据,那时差点就哭出来了。
# 核心代码片段
repo=$(grep "url = " "$dir/.git/config" |
sed 's/.*url = //' |
sed 's/git@github.com:([^/]*)//git://github.com/1//' )
(cd "$PROJ_DIR" &&
git submodule add "$repo" "$SUBDIR" &&
git commit -m "Added submodule $SUBDIR")
然后装了git-submodule-helper。
现在就是后悔。后悔没早当混蛋。
## 分支落后了吗?懒得查
# 基本用法:显示所有有差异的跟踪分支
git-branch-status
# 显示所有分支(包括同步状态的分支)
git-branch-status -a
# 比较两个特定分支
git-branch-status feature-branch origin/develop
# 显示详细时间戳信息
git-branch-status -v
我有个坏习惯。
切分支前从不看upstream状态。凭感觉。
| collab-branch | (behind 1) | (ahead 2) | origin/collab-branch |
| feature-branch | (even) | (ahead 2) | origin/feature-branch |
* | master | (behind 1) | (even) | origin/master |
有时切换过去发觉落后了20个提交,执行git pull居然还冲突,而后在这条压根并非自己要修改的分支之上,耗费15分钟去解决他人代码引发的冲突。
这种时候你就想:我他妈在干嘛?
“git - branch - status”被我安装了,然而,说实话,直至如今,那个表格我始终都没有完全理解明白。
我只看颜色。
红色?不切。
绿色?切。
像红绿灯一样。够了。
## 真正救我命的是git-fire
不是那种“哇这工具好酷”的救。
是真的着火。
上周五,下午四点五十八分的时候,老板站在了我的身后,然后说道:“线上有个hotfix,要马上处理。”。
当时,工作区里有三份代码没改完,正躺在那儿呢,有两个新文件没被追踪到,还有一个实验性重构进行到一半,结果连编译都无法通过。
搁以前我肯定:git stash。
# 基本用法:创建紧急分支
git-fire
# 带自定义提交信息
git-fire "紧急保存:修复生产环境bug前的状态"
但那天我没。
git fire "老板盯着我快他妈救一下"
就这一句。
当时间来到六点整的时候,我依照准确的时间关闭了电脑。hotfix已然在生产环境中运行着,我那一堆杂乱无章的进度放置在了fire-main-xxx分支上面,其安全程度就如同未曾发生过任何事情一样。
就这才堪称是工具,并非是要令你更为强悍,而是在你失误犯错之际,存在有人来给予兜底保障。
# 分支命名规则
new_branch() {
echo "fire-${1:-$(current_branch)}-$(user_email)-$(current_epoch)"
}
# 核心保存逻辑
git checkout -b "$(new_branch)"
cd "$(git rev-parse --show-toplevel)"
git add -A
git commit -m "$message" --no-verify
for remote in $(git remote); do
git push --set-upstream "${remote}" "$(current_branch)" || true
done
## 但有个问题
这些脚本,你装完会发现——
不是所有的“效率工具”都能提升效率。
有的脚本太聪明了。
聪明到它替你做的决定,你自己都看不懂。
# 1. 检查所有分支状态
git-branch-status -a
# 2. 找出长期未使用的过时分支
git-stale-branches
# 3. 跟踪新的远程分支
git-track-branch origin/feature/new-feature
# 4. 删除已合并到主分支的本地分支
git-already-merged master | xargs git branch -d
我尝试过agf的自动合并,它咔哒咔哒地帮我把基准分支进行同步,随后自动推送,接着又自动切了回去。
然后我愣在命令行前:
“……你刚才干了啥?”
我不知道。它也没告诉我。
# 1. 查看贡献者排名
git-rank-contributors
# 2. 同步所有远程仓库
git-sync
# 3. 交互式变基,保持提交历史清晰
git-rebase-master
# 4. 创建签名标签,标记版本发布
git-signed-tag v1.0.0 "Release version 1.0.0"
## 所以我现在的原则
只用那些让我感觉自己还是主人的脚本。
Contributor Commits Lines Added Lines Removed
------------------------- -------- ------------- ---------------
John Doe 156 8923 3215
Jane Smith 124 6542 2890
Bob Johnson 87 3251 1562
git-submodule-add,仅为我粘贴URL,不为我思索是否要添加此模块。
git分支状态,仅告知我状态,而不为我进行切换。
git - fire,仅当我叫嚷着说出那句“救命”之时才会迅速冲进来,而在平常的时候却安静得就如同那毫无声息的鸡一般。
# 1. 紧急保存当前工作
git-fire "紧急保存:准备修复生产bug"
# 2. 切换到生产分支
git checkout production
# 3. 创建修复分支
git checkout -b hotfix/production-bug
# 4. 修复完成后,回到原开发分支
git checkout feature/original-work
# 5. 恢复之前的工作状态
git-undo # 或 git reset --hard fire-branch-name
其他诸如自动提交,自动生成提交信息,自动推送到远程——。
不了谢谢。
前一回叫AI给我撰写commit讯息,它写成了“Update code to improve functionality and fix bugs”。
废话文学继承人。
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/gi/git-scripts.git
cd git-scripts
# 临时添加到PATH
export PATH=$PATH:$(pwd)
# 永久添加到PATH(bash用户)
echo "export PATH=$PATH:$(pwd)" >> ~/.bashrc
source ~/.bashrc
# 永久添加到PATH(zsh用户)
echo "export PATH=$PATH:$(pwd)" >> ~/.zshrc
source ~/.zshrc
## 最有用的可能不是脚本
是允许自己不用学新东西。
# 复制示例配置文件
cp git-branch-status-subtree/gbs-config.sh.inc.example ~/.gbs-config.sh.inc
# 编辑配置
vim ~/.gbs-config.sh.inc
# 设置环境变量指向配置文件
export GBS_CFG_FILE=~/.gbs-config.sh.inc
真的。
Git 2.53发布了,Rust重构,性能又提升了。
# 自动fetch的周期(分钟),-1表示禁用自动fetch
CFG_FETCH_PERIOD=30
# 是否使用彩色输出
CFG_USE_ANSI_COLOR=1
# 上次fetch时间记录文件路径
CFG_LAST_FETCH_FILE=~/.git-branch-status-last-fetch
但我还在用两年前装的git-。够用。
新的worktrunk听说很火,能让AI并行干活。
关我什么事。我又不开AI工厂,我只是个写代码的。
# 创建自定义版本
cp git-addsub git-addsub-custom
# 编辑自定义版本
vim git-addsub-custom
# 添加到PATH(放在原脚本之前)
export PATH=~/custom-scripts:$PATH
## 所以你问我5分钟能提升什么?
不是装20个脚本。
是删掉那18个你装了从没用过的。
# 一键更新所有子模块并检查状态
git-pulltree && git-submodule update --init --recursive && git-branch-status
# 保存当前状态并创建新分支
git-save "WIP: 功能X开发中" && git checkout -b feature/new-feature
# 清理过时分支并同步远程
git-stale-branches | grep -v "master" | grep -v "develop" | xargs git branch -d && git-sync
是给git-fire加个alias:
git config --global alias.out fire
# .gitlab-ci.yml 示例
stages:
- check
- sync
branch-status-check:
stage: check
script:
- git-branch-status -a
only:
- merge_requests
sync-remotes:
stage: sync
script:
- git-sync
only:
- master
以后紧急时刻,你只需要敲:
git out
# 在~/.bashrc或~/.zshrc中添加
alias git-status-all='git-branch-status -a'
alias git-save-and-switch='function gss(){ git-save "$1"; git checkout "$2"; }; gss'
alias git-clean-branches='git-already-merged master | xargs git branch -d'
三个字母。
然后跑。
# 为所有脚本添加执行权限
chmod +x git-*
# 或只为特定脚本添加
chmod +x git-addsub git-branch-status git-fire
真正的效率,从来不是做更多。
是关键时刻,知道怎么跑得更体面。
# Ubuntu/Debian 系统
sudo apt-get install ruby sed grep
# macOS 系统
brew install ruby gnu-sed

Comments NOTHING