合并与变基在进行中和冲突时,除了改 index,还会在
.git
根目录留下一批临时指针文件。它们不参与长期历史,但标记「当前操作状态」;残留会导致「无法切换分支」或重复合并。读懂这些文件名,是排查怪异
git status 的第一步。
index 的 stage 格式见 第 06 篇。
一、merge 进行中
git merge <branch>
启动后,成功前可能出现:
| 文件 | 内容 |
|---|---|
MERGE_HEAD |
被并入分支 tip 的 commit SHA |
MERGE_MSG |
默认合并提交说明 |
MERGE_MODE |
有时为空,标记合并模式 |
ORIG_HEAD |
合并前 HEAD,供 abort 恢复 |
快进合并:可能只移动 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 单提交时 |
冲突时同样出现多 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
文件安全。
六、本文边界
- 不教三方合并算法与冲突标记语法。
- 不列
rebase-merge/内每个文件名(可查 gitrepository-layout)。
复现冲突:
# 两分支改同一文件不同内容后 git merge
git ls-files -u
ls -la .git/MERGE_*参考资料
- Git documentation, gitrepository-layout
- 实验环境:Git 2.54.0
系列索引:Git 内部结构 · 上篇:porcelain 副作用 · 下篇:fetch/push
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Git 内部】.git 目录全景:三棵树与仓库布局
git init 之后 .git 里每个路径干什么?对照 gitrepository-layout 与本地 find 清单,建立 bare/non-bare、三棵树、objects/refs/index 的磁盘级地图。
【Git 内部】松散对象:zlib 载荷与 SHA-1 路径
blob/tree/commit 在磁盘上如何编码?对象头 type size、zlib 压缩、objects/ab/cdef 路径命名,对照 git hash-object 与手工 SHA-1 验证。
【Git 内部】对象图:tree、commit、tag 的链式结构
一次提交在对象库里如何连成链?tree 条目 mode/name/hash、commit 的 tree/parent 字段、annotated tag,用 git cat-file -p 展开并画对象图。
【Git 内部】refs、HEAD 与 packed-refs
分支和标签在磁盘上只是一行 SHA?refs/heads、符号引用 HEAD、packed-refs 文件头与 peeled tag 的格式与生成时机。