Git 冲突解决记录

📂 运维学习

Git 冲突解决记录

背景

  • 本地:Windows Obsidian Vault,使用HTTP+Socks5代理推送到GitHub仓库 timozhuai/md_obsidian
  • 报错:git push 被拒绝,远程main分支存在本地没有的提交,提示 fetch first
  • 执行 git pull origin main,发生文件内容合并冲突,Git进入合并中状态,此时不能直接push。
  • 冲突文件:论文/Welcome‑to‑Better‑Notes‑LL6PXVMX.md,冲突内容是Obsidian内部元数据(tags(version、)parent(version、)$version(version、)$libraryID(version、)$itemKey)。
  • 决策:舍弃本地版本,完整保留远程版本的元数据

完整流程

  1. git pull origin main → 自动合并失败,进入MERGING状态,产生冲突文件。

  2. 打开冲突md文件,识别冲突标记:

    <<<<<<< HEAD
    # 你的本地内容
    =======
    # GitHub远程内容
    >>>>>>> 远程commit哈希
    
  3. 编辑文件:全部删除三组冲突标记 <<<<<<< / ======= / >>>>>>>,只保留分割线下方远程的元数据内容。

  4. 将修复完毕的文件加入暂存区

git add "论文/Welcome-to-Better-Notes-LL6PXVMX.md"
  1. 完成合并提交(不要再执行 git pull
git commit -m "resolve merge conflict: keep remote version"
  1. 携带代理参数推送远程
git -c http.proxy=socks5://127.0.0.1:10808 -c https.proxy=socks5://127.0.0.1:10808 push origin main

两个关键备选方案(本次没有使用)

  1. 如果不想处理冲突(version、)放弃远程改动:终止合并,回退pull之前状态,强制覆盖远端
git merge --abort
git -c http.proxy=socks5://127.0.0.1:10808 -c https.proxy=socks5://127.0.0.1:10808 push -f origin main

⚠️ -f强制推送会丢失远程独有提交,本地文件不变。

  1. 如果想保留本地版本:删除标记,只保留HEAD块内本地内容,再add/commit/push

Obsidian场景特别注意点

  1. 本次冲突不是正文笔记,是Obsidian内部元数据($libraryID(version、)itemKey等),元数据不一致会导致内部链接(version、)画布关系异常。
  2. 冲突标记绝对不能留在md文件里提交
  3. Git处于MERGING状态时,不能直接push,必须解决冲突并commit完成合并流程。
  4. 当前仓库使用HTTPS协议,SSH密钥不生效;代理只对http/https协议生效。

快速状态排查命令

git status   # 看是否处于合并中\(version、\)哪些文件冲突
git log --oneline -3  # 看本地提交记录

踩坑回顾你刚才遇到的错误顺序

  1. push → rejected(fetch first):远程有新提交
  2. pull → merge conflict:自动合并失败进入MERGING
  3. 未解决冲突直接再次push → rejected(non‑fast‑forward):合并流程没走完。

本质:pull不等于自动完成,出现conflict,人必须介入修复,commit之后才算pull真正完成