如何从某个历史提交创建 Git 分支

从旧提交建分支:git log 找到目标提交哈希,然后 git checkout -b <新分支名> <commit哈希>;新写法是 git switch -c <分支名> <哈希>。常用于找回旧代码、从历史点修复 bug。

最佳实践
Git 提交历史与版本恢复示意

先用 git log 找到目标提交的哈希,然后执行 git checkout -b 新分支名 提交哈希(或新语法 git switch -c 新分支名 哈希)。新分支会以该提交为起点,包含沿提交图可到达的祖先历史。这是从旧版本拉修复分支、找回被覆盖代码的标准做法。

操作步骤

git log --oneline        # 找到目标提交,假设是 a1b2c3d

git checkout -b hotfix-from-old a1b2c3d   # 建分支并切过去
# 或新语法
git switch -c hotfix-from-old a1b2c3d

也可以用相对引用代替哈希:git switch -c bugfix HEAD~5(沿第一父提交链回退 5 步建分支)。

切换前用 git status 检查未提交改动;若切换会覆盖这些改动,Git 会拒绝,需要先提交或用 stash 保存改动;仅 git add 暂存不一定能解决覆盖冲突。

只建分支不切换

git branch hotfix-from-old a1b2c3d

分支建好但仍停留在当前分支,适合先创建稍后处理。

典型场景

  • 热修复:线上跑的是 v1.2 的标签,直接在 tag 上建分支:git switch -c hotfix v1.2;
  • 找回误删内容:git reflog 找到丢失提交的哈希,从那里建分支恢复;
  • 二分定位后的修复:git bisect 找到引入 bug 的提交,从其父提交建分支验证。

推送到远程

git push -u origin hotfix-from-old

常见问题(FAQ)

Q:忘了哈希怎么办?

git log --oneline --graph 看历史;分支已删的话可尝试用 git reflog 找,但 reflog 会过期,已被清理的对象无法据此恢复;知道大概时间可以 git log --since="2026-09-01" --oneline 过滤。

Q:从旧提交建的分支,合并回 main 会怎样?

可按目标历史选择 merge 或 rebase。Git 按提交图和共同祖先合并,分支起点会影响共同祖先及最终结果。注意如果旧点之后的提交改动很大,合并冲突可能较多。

Q:detached HEAD 状态干了活怎么救?

在游离 HEAD 上做的提交不在任何分支上,立即 git switch -c 分支名 把这些提交固定到新分支,就不会丢。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台