Git版本管理
2025/7/17...大约 5 分钟
Git版本管理
查看提交历史
基本日志查看
# 查看提交历史
git log
# 查看最近n次提交
git log -n 5
# 单行显示提交历史
git log --oneline
# 显示分支图
git log --graph
# 显示每次提交的差异
git log -p
# 显示统计信息
git log --stat
# 按作者筛选
git log --author="用户名"
# 按日期筛选
git log --since="2023-01-01" --until="2023-12-31"
美化日志输出
# 彩色图形化日志
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
# 可以将上面的命令设置为别名
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 然后使用别名
git lg
查看特定文件的历史
# 查看特定文件的提交历史
git log -- 文件路径
# 查看特定文件的每次变更
git log -p -- 文件路径
# 显示文件的每一行是谁在什么时候修改的
git blame 文件路径
# 只查看特定行的修改历史
git blame -L 10,20 文件路径
版本回退
回退到特定版本
# 回退到上一个版本
git reset --hard HEAD^
# 回退到上n个版本
git reset --hard HEAD~n
# 回退到特定提交
git reset --hard 提交哈希
回退的几种模式
# 软回退:保留工作区和暂存区的修改
git reset --soft 提交哈希
# 混合回退(默认):保留工作区的修改,但重置暂存区
git reset --mixed 提交哈希
# 或
git reset 提交哈希
# 硬回退:丢弃所有修改
git reset --hard 提交哈希
回退后推送到远程仓库
# 强制推送(谨慎使用!)
git push --force
# 更安全的强制推送(如果有人在此期间推送了新提交,则会失败)
git push --force-with-lease
查找特定提交
按提交信息查找
# 在提交信息中搜索关键字
git log --grep="关键字"
# 忽略大小写
git log --grep="关键字" -i
按代码内容查找
# 查找添加或删除了特定字符串的提交
git log -S"字符串"
# 使用正则表达式查找
git log -G"正则表达式"
按文件变更查找
# 查找修改了特定文件的提交
git log -- 文件路径
# 查找删除了文件的提交
git log --diff-filter=D -- 文件路径
# 查找添加了文件的提交
git log --diff-filter=A -- 文件路径
标签管理
标签是Git中用来标记特定提交点的引用,通常用于标记发布版本。
创建标签
# 创建轻量标签
git tag 标签名
# 创建带注释的标签
git tag -a 标签名 -m "标签说明"
# 为特定提交创建标签
git tag -a 标签名 提交哈希 -m "标签说明"
查看标签
# 列出所有标签
git tag
# 按模式列出标签
git tag -l "v1.8.*"
# 查看标签详情
git show 标签名
推送和删除标签
# 推送特定标签到远程
git push origin 标签名
# 推送所有标签到远程
git push origin --tags
# 删除本地标签
git tag -d 标签名
# 删除远程标签
git push origin :refs/tags/标签名
# 或
git push origin --delete 标签名
检出标签
# 查看标签对应的代码
git checkout 标签名
# 从标签创建分支
git checkout -b 分支名 标签名
撤销更改
撤销工作区修改
# 撤销单个文件的修改
git checkout -- 文件路径
# Git 2.23版本后的新方式
git restore 文件路径
撤销暂存区修改
# 撤销暂存区的修改到工作区
git reset HEAD 文件路径
# Git 2.23版本后的新方式
git restore --staged 文件路径
撤销提交
# 创建一个新的提交来撤销之前的提交
git revert 提交哈希
# 撤销最近的一次提交
git revert HEAD
# 撤销多个提交
git revert 提交哈希1 提交哈希2
# 只撤销更改,不自动创建提交
git revert -n 提交哈希
查找丢失的提交
有时候,你可能会意外地丢失一些提交,比如执行了错误的重置操作。Git提供了一些命令来帮助你找回这些提交。
使用reflog
# 查看引用日志
git reflog
# 恢复到特定的引用点
git reset --hard HEAD@{n}
查找悬空提交
# 查看所有悬空提交
git fsck --lost-found
# 查看特定悬空提交的内容
git show 提交哈希
维护提交历史整洁
修改最近的提交
# 修改最近的提交信息
git commit --amend -m "新的提交信息"
# 向最近的提交添加更多更改
git add 文件路径
git commit --amend --no-edit
压缩多个提交
# 交互式变基,压缩最近的n个提交
git rebase -i HEAD~n
# 在编辑器中,将除第一个提交外的其他提交前的"pick"改为"squash"或"s"
# 然后保存并关闭编辑器
拆分提交
# 交互式变基
git rebase -i HEAD~n
# 将要拆分的提交前的"pick"改为"edit"
# 保存并关闭编辑器
# Git会停在该提交,然后撤销该提交但保留更改
git reset HEAD^
# 然后分多次提交这些更改
git add 文件1
git commit -m "第一部分提交"
git add 文件2
git commit -m "第二部分提交"
# 完成变基
git rebase --continue
高级历史查询技巧
查看两个提交之间的差异
# 查看两个提交之间的文件差异
git diff 提交哈希1 提交哈希2
# 查看特定文件在两个提交之间的差异
git diff 提交哈希1 提交哈希2 -- 文件路径
# 只显示哪些文件发生了变化
git diff --name-only 提交哈希1 提交哈希2
查找引入特定代码的提交
# 查找引入特定行的提交
git blame -L 行号,行号 文件路径
# 查找引入特定字符串的提交
git log -S"字符串" --patch
统计提交信息
# 查看提交数量统计
git shortlog -sn
# 按作者统计提交
git shortlog -sn --author="用户名"
# 统计每个人的代码量
git log --author="用户名" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "添加行数: %s, 删除行数: %s, 总行数: %s\n", add, subs, loc }'