【git】进阶使用,自存档
可以用来清理提交历史之后会打开编辑器第一个pick不能改aquash,因为第一个是要合并到的commit,如果不确定更改是否正确,可以中止当前 rebase 并重新开始如果edit-to更改有问题,那就重新更改squashdrop或者直接删同步分支代码将 feature-branch 的本地提交基于 远方仓库origin/main 最新提交重新排列这里git rebase origin/main可
Git 高级技巧:从日常使用到历史重写
Git 是现代开发不可或缺的工具,本文整理了一些进阶用法,帮助你更好地控制提交历史、解决冲突、清理仓库,并新增了标签(tag)的常用操作及规范建议。
1. git rebase -i:交互式变基,清理提交历史
git rebase -i 是 Git 最强大的历史整理工具之一,能合并、修改、删除、重新排序提交。
核心逻辑
git rebase -i HEAD~n:对最近 n 个提交(包含 HEAD)进行交互式处理。
编辑器中提交顺序为从旧到新(最旧的在最上面)。
示例:合并最近 3 个提交
git rebase -i HEAD~3
编辑器内容示例(从旧到新):
pick abc123 Initial commit # 基准提交,不能改成 squash
pick def456 Add feature
pick ghi789 Fix bug
常见操作:
pick→ 保留(默认)squash/s→ 合并到上一个提交(内容合并,需编辑消息)fixup/f→ 类似 squash,但直接丢弃这条提交的消息drop/d或直接删除该行 → 删除提交edit/e→ 暂停在此提交,允许修改文件后再继续reword/r→ 只修改提交消息
保存退出后:
- 若有冲突 → 解决后
git rebase --continue - 想放弃 →
git rebase --abort - 中途想改 todo 列表 →
git rebase --edit-todo
同步上游主分支(推荐方式)
git checkout feature-branch
git fetch origin
git rebase origin/main
# 或简写:git pull --rebase origin main
优点:保持线性历史,避免无意义的 merge commit。
不推荐直接 git pull(会产生 merge commit,历史变臃肿)。
处理 merge 提交时的注意
如果最近提交包含 merge commit,HEAD~n 可能显示数量不对或顺序异常。推荐用哈希指定起点或 --rebase-merges。
2. git cherry-pick:精准挑选提交
git cherry-pick abc123
git cherry-pick abc123 def456 ghi789 # 多个
冲突处理:--continue / --skip / --abort
3. git fetch 与远程同步
git fetch origin
git diff origin/main
git rebase origin/main # 或 git merge origin/main
4. 常见问题解决方案
4.1 已 commit 并 push 的文件如何加入 .gitignore 并从远端移除
(典型场景:.idea/、.env 等)
echo '/.idea/' >> .gitignore
git add .gitignore
git rm -r --cached .idea
git commit -m "chore: ignore and remove .idea folder from tracking"
git push origin feature-branch
想合并到上一个 commit:
git commit --amend --no-edit
git push --force-with-lease origin feature-branch
验证:
git ls-files | grep idea
4.2 已 push 的 commit 如何安全 amend 并同步远端
# 修改文件并暂存
git add .
# amend(不改消息)
git commit --amend --no-edit
# 验证
git log --oneline -5
# 安全推送
git push --force-with-lease origin feature-branch
优先用 --force-with-lease,多人协作分支需提前沟通。
5. Git Tag:版本标记的常用命令与规范
Tag 用于标记特定提交,通常代表一个稳定版本(如发布版本 v1.0.0)。
5.1 创建 tag(最常用两种)
-
轻量 tag(只记录提交,不带额外信息)
git tag v1.2.3 -
带注释 tag(推荐,包含作者、日期、说明)
git tag -a v1.2.3 -m "Release v1.2.3: 添加用户认证模块,修复登录超时问题" -
给不是最新提交打 tag
git tag -a v1.0.0 abc123 -m "Initial stable release"
5.2 查看 tag
git tag # 列出所有 tag(按字母排序)
git tag -l "v1.*" # 筛选(支持通配符)
git show v1.2.3 # 查看 tag 详细信息(含 commit 信息)
git tag --sort=-v:refname # 按版本号倒序(最新在最上面)
5.3 推送 tag 到远程
git push origin v1.2.3 # 推送单个 tag
git push origin --tags # 推送所有本地 tag(常用)
5.4 删除 tag
-
删除本地 tag
git tag -d v1.2.3 -
删除远程 tag
git push origin --delete v1.2.3 # 或旧写法: git push origin :refs/tags/v1.2.3
5.5 修改/替换已存在的 tag(谨慎操作!)
如果 tag 已经 push 到远端,修改会重写历史,需强制推送。
# 1. 先删除旧 tag(本地 + 远程)
git tag -d v1.2.3
git push origin --delete v1.2.3
# 2. 在正确 commit 上重新打 tag
git tag -a v1.2.3 abc123 -m "修正版本说明:修复了关键 bug"
# 3. 强制推送新 tag
git push origin v1.2.3 --force
# 或推送所有 tag
git push origin --tags --force
警告:强制推送 tag 会导致其他人拉取时出现问题,建议只在尚未被广泛使用的 tag 上操作,或提前通知团队。
5.6 Tag 命名规范推荐(语义化版本 SemVer)
最流行的规范:vX.Y.Z(或不带 v 前缀)
- X:主版本号(重大不兼容变更)
- Y:次版本号(新增功能,向后兼容)
- Z:补丁版本号(修复 bug,向后兼容)
常见前缀/后缀示例:
v1.0.0→ 正式发布 1.0v1.2.3-rc.1→ Release Candidate 预发布版v1.2.3-beta.2→ Beta 测试版v1.2.3-hotfix→ 紧急修复版(非 SemVer 严格用法)2025-01-22→ 日期标记(适用于 daily build)
推荐:
- 生产环境只推送带注释的 annotated tag
- 使用 SemVer:https://semver.org/
- 保持 tag 不可变:一旦 push,尽量不删除或替换
6. 快速备份与恢复(强烈建议)
任何历史重写前先备份:
git branch backup-feature # 分支备份
git tag backup-20250122 # 或用 tag 标记当前状态
恢复:
git reset --hard backup-feature
更多推荐

所有评论(0)