土法炼钢兴趣小组的算法知识备份

【Git 内部】merge/rebase 的临时文件与 index stage

文章导航

分类入口
opensource
标签入口
#git#git-internals#merge#rebase#MERGE_HEAD#conflict

目录

合并与变基在进行中和冲突时,除了改 index,还会在 .git 根目录留下一批临时指针文件。它们不参与长期历史,但标记「当前操作状态」;残留会导致「无法切换分支」或重复合并。读懂这些文件名,是排查怪异 git status 的第一步。

index 的 stage 格式见 第 06 篇


一、merge 进行中

git merge <branch> 启动后,成功前可能出现:

文件 内容
MERGE_HEAD 被并入分支 tip 的 commit SHA
MERGE_MSG 默认合并提交说明
MERGE_MODE 有时为空,标记合并模式
ORIG_HEAD 合并前 HEAD,供 abort 恢复
merge 进行中 .git 根目录的 MERGE_* 与 ORIG_HEAD 临时文件

快进合并:可能只移动 ref,不写 MERGE_HEAD(无合并提交)。

冲突时 index 含 stage 1/2/3;git ls-files -u 实测:

100644 df967b96… 1  shared.txt
100644 c354fa8c… 2  shared.txt
100644 1de5a387… 3  shared.txt

git merge --abort 删除 MERGE_*ORIG_HEAD,恢复 index 与 HEAD。


二、rebase 进行中

git rebase 类似地在每步使用:

文件 作用
ORIG_HEAD rebase 开始前 HEAD
rebase-merge/rebase-apply/ 目录,存补丁序列、当前进度
CHERRY_PICK_HEAD cherry-pick 单提交时
rebase 状态目录 rebase-merge/ 与 ORIG_HEAD、CHERRY_PICK_HEAD

冲突时同样出现多 stage index;git rebase --abort 清理目录并恢复 ORIG_HEAD。


三、cherry-pick

git cherry-pick <commit> 设置 CHERRY_PICK_HEAD 为被拣选 commit;冲突解决后提交完成则删除。与 merge 共享 index stage 机制。


四、rerere(可选)

启用 rerere.enabled 后,解决过的冲突解法缓存在 objects/ 与配置中(rr-cache),再次合并同冲突时自动应用。属于对象库扩展用法,非每次 merge 必有。


五、操作完成后的清理

成功 git commit(合并提交)后:MERGE_HEAD 等删除;新 commit 写入 objects;refs/heads/* 与 reflog 更新。失败 abort 则回滚 index/HEAD,应留下 MERGE_HEAD

若手工删文件导致状态不一致,用 git merge --abort / git rebase --abort 比直接删 .git 文件安全。


六、本文边界

复现冲突:

# 两分支改同一文件不同内容后 git merge
git ls-files -u
ls -la .git/MERGE_*

参考资料

系列索引Git 内部结构 · 上篇porcelain 副作用 · 下篇fetch/push

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。


By .