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

其他建议

  1. 频繁提交,小步快跑
  2. 提交前检查代码
  3. 保持提交历史整洁
  4. 使用 .gitignore 忽略无关文件
  5. 定期同步远程分支

总结

Git 是开发者必备的版本控制工具。掌握这些技巧可以:

  • 提高开发效率
  • 避免代码丢失
  • 方便团队协作
  • 保持代码历史整洁

建议在实际项目中多加练习,逐步掌握 Git 的高级用法。