git merge-file处理外部文件后,git checkout --ours/--theirs不符合预期的问题
问题原因与解决方法:git merge-file后checkout --ours/theirs不生效
原因分析
git checkout --ours/theirs的生效前提是文件处于Git的未合并状态——此时暂存区会同时存储该文件的三个版本:当前分支版本(ours)、基准版本(base)、对方版本(theirs)。
但你当前的情况是:
git merge-file只是直接修改了工作区的README.md,写入了冲突标记,但没有通知Git将该文件标记为未合并状态。git ls-files -s显示文件处于正常跟踪状态,说明暂存区里只有当前分支的版本。- 合并使用的
/tmp下的文件是仓库外部资源,Git没有将这些文件的内容存入自身的对象库,因此暂存区里根本没有"theirs"对应的版本数据。执行git checkout --theirs时,Git找不到对应的blob对象,只能 fallback 到当前已有的版本。
解决方法
方法1:让Git识别文件为未合并状态(推荐)
通过手动将三个版本存入Git对象库,并标记文件为未合并状态,这样checkout --ours/theirs就能正常工作:
- 生成三个版本的blob哈希(将文件内容存入Git对象库):
# 当前工作区版本(before updating)作为ours OURS_HASH=$(git hash-object -w README.md) # 模板旧版本(last update)作为基准base BASE_HASH=$(git hash-object -w /tmp/project_generated_from_previous_template_version/README.md) # 模板新版本(after updating)作为theirs THEIRS_HASH=$(git hash-object -w /tmp/project_generated_from_latest_template_version/README.md) - 更新暂存区,将文件设置为未合并状态:
git update-index --index-info <<EOF 100644 $OURS_HASH 1 README.md 100644 $BASE_HASH 2 README.md 100644 $THEIRS_HASH 3 README.md EOF - 此时执行
git checkout --ours README.md或git checkout --theirs README.md就能得到预期结果,解决冲突后用git add README.md标记完成即可。
方法2:直接替换文件内容(快速解决)
如果不需要Git维护合并状态,直接用目标版本覆盖工作区文件:
- 要获取"after updating"的内容,直接复制模板文件:
cp /tmp/project_generated_from_latest_template_version/README.md README.md - 之后执行
git add README.md提交修改即可。
内容的提问来源于stack exchange,提问作者pawamoy
相关产品推荐
相关产品推荐

