在日常开发中,我们经常需要提交代码到Git仓库。为了规范提交信息格式,提高提交效率,同时避免提交过程中的错误,我们开发了这个Git提交脚本。
- 一键添加所有更改(
git add .
) - 交互式选择更改(
git add -p
) - 选择已更改的文件(交互式列表选择)
- 显示所有已更改文件的编号列表
- 支持选择多个文件(用空格分隔文件编号)
- 支持一键选择所有文件(输入 'a')
- 自动处理未暂存更改
- 检测到未暂存更改时自动暂存
- 支持选择提交类型和表情
- 自动生成包含更改文件列表的提交信息
- 自动检测本地和远程分支的分叉状态
- 显示具体的领先/落后提交数量
- 提供多种同步选项:
- 合并远程更改(
git merge
) - 变基到远程更改(
git rebase
) - 强制推送本地更改(
git push --force
)
- 合并远程更改(
- 智能建议:当本地落后较多时,自动建议使用变基
- 冲突处理指导:遇到冲突时提供清晰的后续步骤说明
提供预定义的提交类型:
选项 | 类型 | 说明 | 使用场景 |
---|---|---|---|
1 | ✨ feat | 新功能 | 添加新的功能或特性 |
2 | 🐛 fix | 修复问题 | 修复 bug 或问题 |
3 | 📝 docs | 文档更新 | 更新文档或注释 |
4 | 🎨 style | 代码格式 | 不影响代码逻辑的格式修改 |
5 | ♻️ refactor | 代码重构 | 既不修复错误也不添加功能的代码更改 |
6 | ⚡️ perf | 性能优化 | 提高性能的代码更改 |
7 | ✅ test | 测试相关 | 添加或修改测试用例 |
8 | 🔧 chore | 构建相关 | 修改构建过程或辅助工具 |
9 | 🚀 ci | CI/CD相关 | 持续集成和部署相关更改 |
10 | 🔒 security | 安全更新 | 安全相关的改进或修复 |
11 | 📌 deps | 依赖更新 | 更新项目依赖 |
12 | 🌐 i18n | 国际化 | 国际化和本地化相关更改 |
13 | ✍️ typo | 拼写修正 | 修正拼写错误 |
14 | ⏪️ revert | 回退更改 | 回退之前的提交 |
15 | 🔀 merge | 合并分支 | 合并分支的提交 |
16 | 🏷️ release | 发布版本 | 发布新版本相关更改 |
17 | 🚀 deploy | 部署相关 | 部署相关的更改 |
18 | 🎨 ui | 界面相关 | 用户界面相关更改 |
0 | 💾 custom | 自定义格式 | 用户自定义提交类型 |
当选择自定义格式时,可以选择以下表情:
- 🎨 改进代码结构/格式
- ⚡️ 提升性能
- 🔥 删除代码/文件
- 🐛 修复 bug
- 🚑️ 重要补丁
- ✨ 引入新功能
- 📝 撰写文档
- 🚀 部署功能
- 💄 UI/样式更新
- 🎉 初次提交
- ✅ 增加测试
- 🔒️ 修复安全问题
- 🔐 添加或更新密钥
- 🔖 发布/版本标签
- 🚨 修复编译器/linter警告
- 🚧 工作进行中
- 💚 修复CI构建问题
- ⬇️ 降级依赖
- ⬆️ 升级依赖
- 📌 固定依赖版本
- 👷 添加CI构建系统
- 📈 添加分析或跟踪代码
- ♻️ 重构代码
- ➕ 添加依赖
- ➖ 删除依赖
- 🔧 修改配置文件
- 🔨 重大重构
- 🌐 国际化与本地化
- ✏️ 修复拼写错误
- 💩 需要改进的代码
- ⏪️ 回退更改
- 🔀 合并分支
- 📦️ 更新编译文件
- 👽️ 更新外部API
- 🚚 移动/重命名文件
- 📄 添加许可证
- 💥 重大更改
- 🍱 添加资源
- ♿️ 提高可访问性
- 🔊 添加日志
- 🔇 删除日志
- 检查Git仓库有效性
- 自动检查并同步远程仓库更新:
- 检测本地与远程仓库的差异
- 如果远程有更新,自动拉取更新
- 如果发生分支分叉,提示手动解决冲突
- 记录操作状态:
- 文件暂存状态
- 提交状态
- 提交哈希
- 目标分支
- 提交信息
- 网络问题时提供恢复建议
为了更好地管理Git提交历史,脚本新增了以下功能:
-
查看提交历史
- 可以查看最近的提交记录(默认显示最近10条)
- 提供格式化的输出,包含提交哈希、分支信息、提交信息、提交时间和作者
- 支持自定义显示条数
-
搜索提交
- 根据关键词搜索提交记录
- 支持在提交信息中进行全文搜索
- 显示匹配的提交记录(最多50条)
-
查看提交详情
- 输入提交哈希查看详细信息
- 显示完整的提交信息、作者信息、提交时间
- 显示具体的文件变更
-
撤销提交
- 支持撤销指定的提交
- 提供确认机制防止误操作
- 使用
git revert
确保安全的撤销操作
在运行脚本后,会显示主菜单,包含以下选项:
- 提交更改(原有功能)
- 查看提交历史
- 搜索提交
- 查看提交详情
- 撤销提交
- 退出
选择相应的功能后,按照提示进行操作即可。
-
查看最近提交
# 选择选项2后,可以指定要查看的提交数量 请选择操作 (1-6): 2 查看最近几条记录 (默认10): 5
-
搜索提交
# 选择选项3后,输入搜索关键词 请选择操作 (1-6): 3 请输入搜索关键词: feat
-
查看提交详情
# 选择选项4后,输入提交哈希 请选择操作 (1-6): 4 请输入提交哈希: abc123
-
撤销提交
# 选择选项5后,输入要撤销的提交哈希 请选择操作 (1-6): 5 请输入要撤销的提交哈希: abc123 确认撤销? (y/n): y
- 撤销提交时请谨慎操作,确保了解要撤销的内容
- 建议在撤销提交前先查看提交详情
- 搜索功能支持多个关键词,但要注意搜索范围限制
提交时间 | 提交说明 | 提交者 | 提交哈希 |
---|---|---|---|
7分钟前 | feat: ✨ 添加Windows下的提交历史和管理功能 | Zengwenliang0416 | b65e681 |
11分钟前 | feat: ✨ 添加Linux/mac下的提交历史和管理功能 | Zengwenliang0416 | 331fca0 |
10小时前 | fix: 🐛 终端中文显示问题 | Zengwenliang0416 | 8f838ba |
10小时前 | fix: 🐛 git status下中文显示为数字的修改方案和修改措施 | Zengwenliang0416 | 1717821 |
10小时前 | docs: 📝 优化脚本并且添加操作教程 | Zengwenliang0416 | 2ea4ddb |
11小时前 | docs: 📝 优化windows下的push脚本 | Zengwenliang0416 | 492cb13 |
11小时前 | doc: 📝 push脚本优化 | Zengwenliang0416 | 09c492d |
11小时前 | docs: 📝 添加表情信息在message中 | Zengwenliang0416 | 9dbf2eb |
11小时前 | refactor(git脚本): ♻️ 优化push操作 | Zengwenliang0416 | 9ef0b0c |
11个月前 | 初始化JVM文档以及测试Linux下的push脚本 | Zengwenliang0416 | 44edb13 |
11个月前 | 添加一键实现add、commit、push脚本 | Zengwenliang0416 | 32c9ac0 |
-
功能增强
- 添加Windows和Linux/Mac下的提交历史管理功能
- 实现提交历史查看、搜索和撤销功能
- 添加交互式文件选择功能
-
问题修复
- 解决终端中文显示问题
- 修复git status下中文显示为数字的问题
- 优化字符编码处理
-
文档改进
- 添加详细的操作教程
- 优化提交信息格式
- 添加表情符号支持
-
代码重构
- 优化push操作流程
- 改进代码结构和组织
- 提升代码可维护性
-
在Git仓库目录下运行脚本:
- Windows:
push.bat
- Linux/macOS:
./push.sh
- Windows:
-
选择文件暂存方式:
请选择提交方式: 1. 提交所有更改 (git add .) 2. 交互式选择文件 (git add -p) 3. 手动输入文件路径
-
选择提交类型:
请选择提交类型: 1. feat: ✨ 新功能 2. fix: 🐛 修复bug ... 21. custom: 🎯 自定义格式
-
如果选择自定义格式,可以选择表情:
请选择emoji: 1. 🎨 艺术 2. 🌟 闪耀 3. 🚀 火箭 4. 🎯 目标 5. 🎬 电影 6. 🎮 游戏 7. 📱 手机 8. 💻 电脑 9. 🌈 彩虹
-
输入提交描述和分支名称
-
当检测到未暂存的更改时,脚本会:
- 自动暂存所有更改
- 提示选择提交类型(包含表情)
- 自动生成包含时间戳和更改文件列表的提交信息
-
当检测到分支分叉时,脚本会:
- 显示本地和远程的提交差异数量
- 根据情况推荐最佳同步方式
- 提供多个同步选项供选择
- 在执行危险操作(如强制推送)时提供警告和确认
当遇到网络问题时,脚本会显示:
-
当前操作状态
=== 操作状态 === 1. 文件暂存: true/false 2. 更改提交: true/false 3. 提交哈希: [如果有] 4. 目标分支: [分支名] 5. 提交信息: [提交信息]
-
恢复建议
- 如果已经提交:
您的更改已经提交到本地仓库。要重新推送,请执行: git push origin [分支名] 如果想要撤销提交,请执行: git reset --soft HEAD^
- 如果只是暂存:
文件已暂存但未提交。要继续,请执行: git commit -m "[提交信息]" git push origin [分支名] 如果想要撤销暂存,请执行: git reset
- 如果已经提交:
为了能够在任何目录下使用这些脚本,我们需要将脚本添加到系统的环境变量中。以下是不同操作系统的配置方法:
-
准备工作
- 将
push.bat
脚本放在一个固定的目录中,建议放在:C:\Tools\Git-Scripts\
- 确保脚本具有可执行权限
- 将
-
添加到系统环境变量
- 右键点击"此电脑",选择"属性"
- 点击"高级系统设置"
- 点击"环境变量"按钮
- 在"系统变量"区域找到"Path"
- 点击"编辑",然后点击"新建"
- 添加脚本所在的目录路径:
C:\Tools\Git-Scripts
- 点击"确定"保存所有更改
-
创建命令别名(可选)
- 创建一个新文件
C:\Tools\Git-Scripts\git-push.bat
:
@echo off push.bat %*
- 这样可以通过
git push
命令调用脚本
- 创建一个新文件
-
验证配置
- 打开新的命令提示符窗口
- 输入
push
或git push
- 如果配置正确,脚本应该能够正常执行
-
准备工作
- 将
push.sh
脚本放在一个固定的目录中,建议放在:~/bin/
或/usr/local/bin/
- 给脚本添加执行权限:
chmod +x ~/bin/push.sh
- 将
-
配置方法(推荐:使用软链接)
这是最推荐的配置方法,可以保持脚本的单一性和易更新性:
# 创建个人bin目录(如果不存在) mkdir -p ~/bin # 创建软链接 ln -s /path/to/your/push.sh ~/bin/push.sh
然后在
~/.zshrc
(如果使用zsh)或~/.bashrc
(如果使用bash)中添加:# 添加个人脚本目录到 PATH export PATH="$HOME/bin:$PATH" # 可选:创建别名使命令更简短 alias git-push="push.sh"
使配置生效:
source ~/.zshrc # 如果使用zsh # 或 source ~/.bashrc # 如果使用bash
为什么推荐使用软链接?
- 源文件可以保持在原始位置(如项目目录中)
- 当更新原始脚本时,软链接会自动指向最新版本
- 不需要手动同步或更新其他位置的副本
- 避免了文件版本不一致的问题
- 方便进行版本控制
-
其他配置方法(不推荐)
a. 直接添加脚本目录到 PATH:
export PATH="/path/to/your/script/directory:$PATH"
缺点:
- PATH 可能会变得过长
- 不够灵活,如果脚本位置改变需要更新配置
b. 复制到系统目录(不推荐):
sudo cp push.sh /usr/local/bin/
缺点:
- 需要手动同步更新
- 可能引起版本不一致问题
- 需要管理员权限
-
验证配置
# 检查软链接是否创建成功 ls -l ~/bin/push.sh # 检查命令是否可用 which push.sh # 测试脚本执行 push.sh --version # 或其他测试命令
-
故障排除
- 如果命令未找到,检查 PATH 配置:
echo $PATH | grep ~/bin
- 检查软链接是否正确:
ls -l ~/bin/push.sh
- 检查脚本权限:
ls -l /path/to/your/push.sh
- 如果使用别名,检查别名是否正确设置:
alias | grep git-push
- 如果命令未找到,检查 PATH 配置:
-
维护建议
- 定期检查软链接是否完好
- 在更新脚本后测试功能
- 保持原始脚本和软链接的权限正确
- 在项目文档中记录配置方法
-
Windows 常见问题
- 如果提示"不是内部或外部命令",检查环境变量路径是否正确
- 确保脚本文件扩展名
.bat
已添加到 PATHEXT 环境变量中 - 重启命令提示符或PowerShell以使更改生效
-
macOS/Linux 常见问题
- 如果提示"权限拒绝",检查脚本的执行权限
- 如果找不到命令,确认 PATH 中包含脚本所在目录
- 检查文件换行符格式(Windows 下编辑的文件可能需要转换):
dos2unix push.sh
-
通用问题
- 确保 Git 已正确安装并可在命令行中使用
- 检查脚本文件的编码(建议使用 UTF-8)
- 验证脚本所在目录的权限设置
-
目录组织
- 建议将所有 Git 相关的自定义脚本放在同一个目录下
- 保持脚本文件名简短但具有描述性
- 为不同功能的脚本创建子目录
-
权限管理
- Windows:确保用户对脚本目录有读取和执行权限
- macOS/Linux:建议将脚本权限设置为 755(
chmod 755 script.sh
)
-
备份建议
- 定期备份脚本文件
- 将脚本纳入版本控制
- 记录配置更改
在显示Git状态时,中文文件名会显示为转义字符(如 \345\255\246\344\271\240
)。这是因为Git默认会对非ASCII字符进行转义。
解决方法:
# 设置Git不对中文文件名转义
git config --global core.quotepath false
这个设置已经添加到 push.sh
和 push.bat
脚本的开头,确保中文文件名能够正确显示。
在脚本交互过程中,输入中文字符时可能会遇到以下问题:
- 删除中文字符时显示异常
- 删除操作可能会影响到提示文字
- Windows下中文输入显示乱码
解决方法:
-
Linux/macOS (
push.sh
):# 使用 read 命令的 -e 选项启用 readline 功能 # 使用 -p 选项显示提示符 read -e -p "请输入: " input
-e
选项启用 readline 功能,支持命令行编辑-p
选项显示提示符,且提示符不会被删除操作影响
-
Windows (
push.bat
)::: 使用 PowerShell 处理输入,支持更好的中文处理 powershell -Command "$input = Read-Host '请输入'; $input" > "%TEMP%\input.txt" set /p input=<"%TEMP%\input.txt" del "%TEMP%\input.txt"
- 使用 PowerShell 的
Read-Host
命令处理输入 - 通过临时文件传递输入内容
- 支持完整的中文字符处理
- 使用 PowerShell 的
在不同的 Shell 环境中,某些字符串操作的语法可能不兼容。例如,将字符串转换为小写的 ${variable,,}
语法只在 Bash 4.0+ 版本中支持。
问题表现:
./push.sh: line 252: ${confirm,,}: bad substitution
解决方法:
使用更通用的 tr
命令进行大小写转换:
# 不兼容的写法
if [ "${confirm,,}" != "y" ]; then
# 兼容的写法
if [ "$(echo "$confirm" | tr '[:upper:]' '[:lower:]')" != "y" ]; then
这个修改确保脚本能在各种 Shell 环境(如 bash、sh、zsh 等)下正常运行。
- 确保脚本具有执行权限(Linux/macOS):
chmod +x push.sh
- Windows用户需要安装Git Bash或在命令提示符中运行
- 脚本必须在Git仓库目录下运行
- 建议定期更新脚本以获取最新功能
A1: 交互式添加可以精确控制要提交的更改,避免提交不必要的文件。
A2: 脚本会显示当前状态和恢复建议,按照提示执行相应命令即可。
A3: 可以编辑脚本中的提交类型数组来自定义默认选项。
-
功能增强
- 配置文件支持
- 可自定义提交类型和表情
- 可配置默认分支和远程仓库
- 支持项目级别的配置文件
- 提交模板系统
- 支持自定义提交模板
- 支持不同项目使用不同模板
- 模板变量替换功能
- 批量操作支持
- 批量提交管理
- 批量撤销功能
- 批量查看历史
- 配置文件支持
-
用户体验优化
- 图形界面支持
- 简单的GUI界面
- 文件树形显示
- 可视化的提交历史
- 智能提示
- 自动补全功能
- 智能提交信息建议
- 错误预防提示
- 多语言支持
- 完整的国际化支持
- 可切换的界面语言
- 提交信息的多语言模板
- 图形界面支持
-
集成增强
- CI/CD集成
- 与常见CI系统集成
- 自动化测试集成
- 发布流程集成
- IDE插件支持
- VS Code插件
- IntelliJ插件
- 其他主流IDE支持
- 项目管理工具集成
- Jira集成
- Trello集成
- GitHub/GitLab集成
- CI/CD集成
-
性能优化
- 大型仓库支持
- 优化大文件处理
- 提高历史查询速度
- 减少内存占用
- 并行处理
- 并行提交处理
- 异步历史查询
- 后台任务处理
- 缓存机制
- 提交历史缓存
- 配置信息缓存
- 智能缓存清理
- 大型仓库支持
-
安全性增强
- 提交验证
- 敏感信息检查
- 提交规范验证
- 自动化代码审查
- 权限管理
- 用户权限控制
- 分支权限管理
- 操作审计日志
- 备份机制
- 自动本地备份
- 远程备份支持
- 恢复机制
- 提交验证
这是一个用于自动化 Git 操作的 Bash 脚本,它可以智能处理各种常见的 Git 场景,让你的工作流程更加顺畅。
-
智能提交管理
- 自动检测未暂存的更改
- 提供标准化的提交类型选择(带表情符号)
- 自动暂存和提交更改
-
远程仓库同步
- 自动检测远程仓库更新
- 智能处理分支分叉情况
- 支持多种同步策略(合并、变基、强制推送)
-
错误处理
- 自动处理常见的 Git 错误
- 提供清晰的错误提示和恢复建议
- 防止意外的数据丢失
- 将脚本添加到你的 PATH 中
- 在任何 Git 仓库中运行
git-push
命令 - 脚本会自动检测并处理当前状态
-
检测到未暂存的更改时:
- 显示更改的文件列表
- 提供提交类型选择菜单
- 要求输入提交描述
- 自动暂存和提交更改
-
提交类型选项:
1) ✨ feat: 新功能 2) 🐛 fix: 修复 ... 21) custom: 🎯 自定义格式
-
分支同步处理
当本地分支与远程分支分叉时,脚本提供以下选项:
-
合并远程更改 (git merge)
- 适用于希望保留完整历史记录的情况
- 可能会产生额外的合并提交
-
变基到远程更改 (git rebase)
- 创建更清晰的提交历史
- 适合在个人分支上使用
-
强制推送本地更改 (git push --force-with-lease)
- 使用 --force-with-lease 确保安全
- 适用于确定要覆盖远程更改的情况
-
退出并手动处理
- 当需要更复杂的处理时使用
- 可以手动解决后再次运行脚本
问题:提交信息中包含了菜单和提示内容 解决方案:
- 将所有菜单和提示输出重定向到 stderr
- 使用 printf 代替 echo 输出选择的前缀
- 简化提交信息的格式
问题:在有未暂存更改时尝试变基导致错误 解决方案:
- 先检测并处理未暂存的更改
- 然后再处理分支分叉情况
- 使用 --force-with-lease 代替 --force 确保安全
问题:用户输入和脚本输出混杂在一起 解决方案:
- 使用 /dev/tty 确保正确读取用户输入
- 将提示信息重定向到 stderr
- 只让实际的提交信息输出到 stdout
-
提交前检查
- 查看更改的文件列表
- 确保提交描述准确反映更改内容
- 选择合适的提交类型
-
分支同步策略
- 个人分支优先使用变基
- 共享分支优先使用合并
- 谨慎使用强制推送
-
冲突处理
- 遇到冲突时先退出脚本
- 手动解决冲突
- 解决后重新运行脚本
欢迎提交 Issue 和 Pull Request 来改进这个脚本。
MIT License