1. Git与Bash的黄金组合:开发者必备的版本控制利器
在代码管理的世界里,Git早已成为事实上的标准工具,而Bash则是Linux/Unix环境下最强大的命令行解释器。当这两者结合时,开发者能够获得前所未有的工作效率。不同于图形化客户端,命令行操作提供了更精确的控制和更高效的批量处理能力。我至今记得第一次用git rebase -i整理提交历史时的震撼——原来版本控制可以如此优雅。
对于Windows用户来说,Git Bash提供了原生的Bash体验,而macOS和Linux用户则可以直接使用系统终端。无论哪种环境,掌握这些命令都能让你:
- 摆脱对GUI工具的依赖
- 编写自动化脚本处理复杂工作流
- 深入理解Git的内部机制
- 在服务器环境自如操作
提示:所有命令示例都基于Git 2.37+版本,部分新特性在老版本可能不可用
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 安装与初始化
对于尚未安装Git的环境,推荐使用包管理器安装:
bash复制# Ubuntu/Debian
sudo apt update && sudo apt install git
# CentOS/RHEL
sudo yum install git
# macOS (Homebrew)
brew install git
首次使用需要配置用户信息,这些信息会记录在每次提交中:
bash复制git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"
git config --global core.editor "vim" # 设置默认编辑器
我习惯将配置保存在~/.gitconfig中,包含一些实用别名:
ini复制[alias]
co = checkout
br = branch
ci = commit
st = status
last = log -1 HEAD # 查看最后一次提交
2.2 仓库基础操作
克隆仓库时,有三种协议可选:
bash复制git clone https://github.com/user/repo.git # HTTPS(通用但需频繁验证)
git clone git@github.com:user/repo.git # SSH(推荐,需配置密钥)
git clone git://github.com/user/repo.git # Git协议(只读)
初始化新仓库的完整流程:
bash复制mkdir project && cd project
git init
echo "# Project Title" > README.md
git add .
git commit -m "Initial commit"
3. 日常开发工作流命令
3.1 代码修改与提交
查看工作区状态的几个实用参数:
bash复制git status -s # 简洁模式
git status -uno # 不显示未跟踪文件
添加文件时的精准控制:
bash复制git add -p # 交互式选择修改块
git add -u # 只添加已跟踪文件
提交信息的最佳实践:
bash复制git commit -m "fix: resolve login timeout issue" # 符合Conventional Commits
git commit --amend # 修改最后一次提交
3.2 分支管理策略
创建基于远程分支的本地分支:
bash复制git checkout -b feature/login origin/develop # 从develop创建
分支操作进阶技巧:
bash复制git branch -vv # 查看分支跟踪关系
git branch --merged # 查看已合并分支
git branch --no-merged # 查看未合并分支
遇到紧急bug时的处理流程:
bash复制git stash # 暂存当前修改
git checkout -b hotfix/xxx main
# 修复bug并提交
git checkout main
git merge hotfix/xxx
git branch -d hotfix/xxx
git stash pop # 恢复暂存修改
4. 历史记录与差异比较
4.1 查看提交历史
git log的黄金组合参数:
bash复制git log --graph --oneline --decorate -20 # 图形化简洁显示
git log -p -2 # 显示最近2次提交的差异
git log --since="2023-01-01" --until="2023-12-31"
git log --author="John" --grep="bugfix"
查看文件变更历史:
bash复制git blame README.md # 逐行追溯
git log -L 10,20:src/main.py # 查看指定行范围历史
4.2 差异比较技巧
比较工作区与暂存区:
bash复制git diff --color-words # 单词级差异
比较暂存区与最新提交:
bash复制git diff --cached
比较两个分支的差异:
bash复制git diff main..feature --stat # 统计差异
git diff main...feature # 只显示feature独有的修改
5. 远程协作与高级操作
5.1 远程仓库管理
查看远程仓库详细信息:
bash复制git remote -v
git remote show origin
添加多个远程仓库的典型场景:
bash复制git remote add upstream https://github.com/original/repo.git
git fetch upstream
git merge upstream/main
5.2 变基与合并策略
交互式变基整理提交历史:
bash复制git rebase -i HEAD~3 # 修改最近3次提交
# 常用指令:
# p/pick = 使用提交
# r/reword = 修改提交信息
# e/edit = 修改提交内容
# s/squash = 合并到前一个提交
# f/fixup = 类似squash但丢弃提交信息
处理合并冲突的标准流程:
bash复制git merge feature
# 出现冲突后...
git status # 查看冲突文件
vim conflicted_file.py # 手动解决
git add conflicted_file.py
git commit # 使用自动生成的合并信息
5.3 子模块与工作树
管理包含子模块的项目:
bash复制git clone --recurse-submodules https://github.com/user/repo.git
git submodule update --init --recursive
使用工作树同时切换多个分支:
bash复制git worktree add ../hotfix hotfix/urgent # 创建新工作树
cd ../hotfix
# 修改并提交
git worktree list # 查看所有工作树
git worktree remove ../hotfix
6. 实用脚本与自动化
6.1 常用别名配置
.gitconfig中的高效别名:
ini复制[alias]
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
undo = reset HEAD~1 --mixed
staged = diff --cached
unstage = reset HEAD --
6.2 钩子脚本示例
预提交钩子检查代码风格(.git/hooks/pre-commit):
bash复制#!/bin/sh
flake8 . || exit 1 # Python代码风格检查
npm run lint # JavaScript代码检查
提交后自动部署到测试环境:
bash复制#!/bin/sh
branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$branch" = "main" ]; then
rsync -avz . user@test-server:/var/www/app/
fi
6.3 批量操作脚本
清理已合并分支的脚本:
bash复制#!/bin/bash
git fetch --prune
git branch --merged | grep -v "\*" | grep -v "main" | xargs -n 1 git branch -d
7. 疑难问题解决方案
7.1 常见错误处理
撤销工作区修改:
bash复制git checkout -- file.txt # 单个文件
git reset --hard HEAD # 全部重置
修改最后一次提交:
bash复制git commit --amend --no-edit # 只修改内容不改变信息
恢复误删分支:
bash复制git reflog # 查找删除前的commit hash
git checkout -b recovered-branch <hash>
7.2 高级修复技巧
拆分最后一次提交:
bash复制git reset HEAD~1
git add -p # 交互式选择要提交的部分
git commit -m "First part"
git add .
git commit -m "Second part"
处理.gitignore不生效问题:
bash复制git rm -r --cached . # 清除缓存
git add .
git commit -m "Fixed gitignore"
8. 性能优化与大型仓库管理
8.1 仓库瘦身技巧
查看大文件历史:
bash复制git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
使用filter-branch清理历史:
bash复制git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch path/to/large-file' \
--prune-empty --tag-name-filter cat -- --all
8.2 部分克隆策略
仅克隆最近历史:
bash复制git clone --depth 1 https://github.com/user/repo.git
稀疏检出特定目录:
bash复制git init repo && cd repo
git remote add origin https://github.com/user/repo.git
git config core.sparseCheckout true
echo "src/important/" >> .git/info/sparse-checkout
git pull origin main
9. 安全实践与备份策略
9.1 敏感信息处理
检查历史中的敏感信息:
bash复制git log -p | grep -i "password\|token\|key"
使用git-secrets预防提交敏感信息:
bash复制git secrets --install
git secrets --register-aws
git secrets --scan -r .
9.2 多远程备份
添加备份远程仓库:
bash复制git remote add backup git@backup-server:repo.git
git push --all backup # 推送所有分支
定期镜像同步:
bash复制git push --mirror backup
