2026年3月12日
Git 使用技巧大全 - 版本控制最佳实践
Git 是目前最流行的分布式版本控制系统,掌握 Git 是每个开发者的必备技能。本文整理了 Git 的常用技巧和最佳实践。
Git 基础
安装配置
# 安装 Git
apt install git # Debian/Ubuntu
yum install git # CentOS/RHEL
brew install git # macOS
# 配置用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
# 查看配置
git config --list
# 设置默认编辑器
git config --global core.editor vim
# 设置默认分支名
git config --global init.defaultBranch main
基础命令
# 初始化仓库
git init
# 克隆仓库
git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git
# 查看状态
git status
# 添加文件到暂存区
git add file.txt
git add . # 添加所有文件
git add -A # 添加所有文件(包括删除)
# 提交更改
git commit -m "commit message"
git commit -am "message" # 添加并提交(仅限已跟踪文件)
# 查看提交历史
git log
git log --oneline # 简洁模式
git log --graph # 图形化显示
git log -n 5 # 最近5条
分支管理
基础操作
# 查看分支
git branch # 本地分支
git branch -a # 所有分支
git branch -r # 远程分支
# 创建分支
git branch feature-1
# 切换分支
git checkout feature-1
git switch feature-1 # Git 2.23+
# 创建并切换
git checkout -b feature-1
git switch -c feature-1
# 删除分支
git branch -d feature-1 # 安全删除
git branch -D feature-1 # 强制删除
# 删除远程分支
git push origin --delete feature-1
# 重命名分支
git branch -m old-name new-name
分支合并
# 合并分支
git merge feature-1
# 不使用快进模式
git merge --no-ff feature-1
# 取消合并
git merge --abort
# 查看已合并分支
git branch --merged
# 查看未合并分支
git branch --no-merged
变基操作
# 变基
git rebase main
# 交互式变基
git rebase -i HEAD~3
# 继续变基
git rebase --continue
# 跳过当前提交
git rebase --skip
# 取消变基
git rebase --abort
远程操作
远程仓库管理
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 修改远程仓库
git remote set-url origin https://github.com/user/new-repo.git
# 删除远程仓库
git remote remove origin
# 重命名远程仓库
git remote rename old-name new-name
推送与拉取
# 推送到远程
git push origin main
# 推送并设置上游
git push -u origin main
# 推送所有分支
git push --all origin
# 强制推送(慎用)
git push -f origin main
# 拉取更新
git pull origin main
# 拉取并变基
git pull --rebase origin main
# 获取远程更新(不合并)
git fetch origin
远程分支操作
# 拉取远程分支
git checkout -b feature-1 origin/feature-1
# 推送新分支到远程
git push origin feature-1
# 删除远程分支
git push origin --delete feature-1
# 清理已删除的远程分支引用
git fetch -p
git remote prune origin
撤销操作
撤销工作区修改
# 撤销文件修改
git checkout -- file.txt
git restore file.txt # Git 2.23+
# 撤销所有修改
git checkout -- .
git restore .
撤销暂存
# 取消暂存
git reset HEAD file.txt
git restore --staged file.txt # Git 2.23+
# 取消所有暂存
git reset HEAD
撤销提交
# 撤销最近一次提交(保留修改)
git reset --soft HEAD~1
# 撤销最近一次提交(保留工作区修改)
git reset --mixed HEAD~1
git reset HEAD~1
# 撤销最近一次提交(丢弃修改)
git reset --hard HEAD~1
# 撤销到指定提交
git reset --hard commit-hash
修改提交
# 修改最近一次提交信息
git commit --amend -m "new message"
# 修改最近一次提交内容
git add .
git commit --amend --no-edit
# 修改历史提交信息
git rebase -i HEAD~3
# 将 pick 改为 reword
暂存工作
# 暂存当前工作
git stash
# 暂存并添加说明
git stash save "work in progress"
# 查看暂存列表
git stash list
# 恢复暂存
git stash pop # 恢复并删除
git stash apply # 恢复但不删除
git stash apply stash@{1} # 恢复指定暂存
# 删除暂存
git stash drop stash@{0}
git stash clear # 清空所有
标签管理
# 创建标签
git tag v1.0.0
git tag -a v1.0.0 -m "Version 1.0.0"
# 查看标签
git tag
git show v1.0.0
# 推送标签
git push origin v1.0.0
git push origin --tags
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0
# 检出标签
git checkout v1.0.0
冲突解决
查看冲突
# 查看冲突文件
git status
# 查看冲突详情
git diff
# 使用图形化工具
git mergetool
解决冲突
冲突文件格式:
<<<<<<< HEAD
当前分支的内容
=======
合并分支的内容
>>>>>>> feature-1
# 手动编辑解决冲突后
git add .
git commit -m "resolve conflicts"
# 使用某一方的版本
git checkout --ours file.txt # 使用当前分支
git checkout --theirs file.txt # 使用合并分支
Git 忽略
.gitignore 文件
# 忽略特定文件
.DS_Store
Thumbs.db
# 忽略目录
node_modules/
dist/
build/
# 忽略特定扩展名
*.log
*.tmp
# 但不忽略特定文件
!important.log
# 忽略所有目录下的文件
**/temp/
# 忽略根目录文件
/temp
忽略已跟踪文件
# 取消跟踪但保留文件
git rm --cached file.txt
# 取消跟踪目录
git rm -r --cached directory/
# 全局忽略
git config --global core.excludesfile ~/.gitignore_global
日志查看
格式化日志
# 单行显示
git log --oneline
# 图形化显示
git log --graph --oneline --all
# 自定义格式
git log --pretty=format:"%h - %an, %ar : %s"
# 显示文件变更
git log --stat
# 显示具体差异
git log -p
搜索日志
# 按内容搜索
git log -S "function_name"
# 按提交信息搜索
git log --grep="fix"
# 按作者搜索
git log --author="name"
# 按日期搜索
git log --since="2024-01-01"
git log --until="2024-12-31"
git log --after="2 weeks ago"
查看文件历史
# 查看文件修改历史
git log --follow file.txt
# 查看文件每一行的修改
git blame file.txt
# 查看文件历史版本
git show commit-hash:file.txt
Git 别名
设置别名
# 常用别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.lg "log --graph --oneline --all"
使用别名
git st
git co main
git lg
Git Hook
常用 Hook
| Hook | 触发时机 |
|---|---|
| pre-commit | 提交前 |
| commit-msg | 提交信息编辑后 |
| pre-push | 推送前 |
| post-merge | 合并后 |
| pre-rebase | 变基前 |
示例:提交前检查
# .git/hooks/pre-commit
#!/bin/bash
# 检查代码风格
npm run lint
# 运行测试
npm test
if [ $? -ne 0 ]; then
echo "Tests failed, commit aborted"
exit 1
fi
Git 工作流
Git Flow
# 主要分支
main # 生产环境
develop # 开发环境
# 辅助分支
feature/* # 功能分支
release/* # 发布分支
hotfix/* # 热修复分支
GitHub Flow
# 简化流程
main # 主分支
feature/* # 功能分支(从 main 创建,合并回 main)
常见问题
Q: 如何撤销已推送的提交?
# 方法1:创建反向提交
git revert commit-hash
git push
# 方法2:强制回退(不推荐)
git reset --hard HEAD~1
git push -f
Q: 如何合并多个提交?
git rebase -i HEAD~3
# 将后面的 pick 改为 squash
Q: 如何恢复误删的分支?
# 查找提交
git reflog
# 恢复分支
git checkout -b branch-name commit-hash
Q: 如何只合并特定文件?
git checkout source-branch -- path/to/file.txt
Q: 如何清理大文件历史?
# 使用 git filter-branch
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch path/to/large-file' \
--prune-empty --tag-name-filter cat -- --all
# 或使用 BFG Repo-Cleaner
bfg --delete-files large-file
最佳实践
提交信息规范
<type>(<scope>): <subject>
<body>
<footer>
类型:
- feat: 新功能
- fix: 修复
- docs: 文档
- style: 格式
- refactor: 重构
- test: 测试
- chore: 构建/工具
分支命名
feature/user-authentication
bugfix/login-error
hotfix/security-patch
release/v1.2.0
其他建议
- 频繁提交,小步快跑
- 提交前检查代码
- 保持提交历史整洁
- 使用 .gitignore 忽略无关文件
- 定期同步远程分支
总结
Git 是开发者必备的版本控制工具。掌握这些技巧可以:
- 提高开发效率
- 避免代码丢失
- 方便团队协作
- 保持代码历史整洁
建议在实际项目中多加练习,逐步掌握 Git 的高级用法。