背景:

我在一个三人的团队里进行项目开发,错误发生的场景是这样的:我在旧的分支修改文档,然后想在新的分支里进行提交,当时我直接使用了AI生成的一系列git 命令进行推送,

git checkout develop
git pull origin develop
git checkout -b docs/hsh/update-milestones-and-guide

git add README.md rag/RAG_DEVELOPMENT_GUIDE.md
git commit -m "docs: 将里程碑压缩至 2 周,并同步 RAG 开发状态"

git push -u origin docs/hsh/update-milestones-and-guide

此时有旧的分支A和新的分支B,执行完这一系列的代码后,我在github上进行和并时出现了合并冲突。

此时,

分支A:我对文档的修改消失不见

分支B:存在对文档的修改

为什么分支A的代码会消失不见?见文章的最后

冲突出现的原因:

在不同的分支对对同一个代码文件进行了修改。

以下是详细的解释:

 1. 根源:改动的“非法移民”
冲突的第一步,始于你带着“未提交”的改动跨越了分支边界。

 现象 :你在旧分支(Branch A)改了 .md 文件,但没签收。
 本质 :此时的改动是“无主”的。当你执行 git checkout b Branch B 时,Git 默认允许这些改动“偷渡”到了新分支。
 冲突埋点 :这就导致了 同一份改动,在物理上出现在了 Branch B,但在逻辑上它本该属于 Branch A 。这种“身份错位”是后续所有混乱的源头。
 2. 锚定:时空节点的“错误落户”
当你使用 AI 命令在新分支(Branch B)执行了 commit ,冲突正式成型。

 现象 :旧分支里的改动不见了,因为它们已经在新分支“落户”了。
 本质 :Git 的每个提交都是基于一个 Parent Commit 。
   新分支的基准 :可能是你刚刚 pull 过的、最新的 develop 。
   旧分支的基准 :可能是几天前的、较旧的 develop 。
 冲突逻辑 :当你提交时,Git 为这段改动贴上了“新分支”的标签,并关联到了最新的时空节点。而旧分支由于没有任何提交,依然停留在过去。
 3. 爆发:当“两个世界”尝试交汇
最关键的冲突发生在你尝试合并(Merge)或发起 PR 时。

 现象 :GitHub 提示你无法自动合并,文件里出现了大量的 <<<<<<< HEAD 。
 深度原因 :
   逻辑重叠 :Git 发现 Branch B 提交了一个修改。与此同时,由于你可能为了“找回”消失的代码,在 Branch A 里又手动改了一遍(或者 Branch A 本身就带有旧的逻辑)。
   基准断裂 :Git 尝试对比两个分支的 共同祖先 。它发现从祖先节点出发,Branch A 往左走了一步,Branch B 往右走了一步,且它们都动了 .md 文件的同一行。
   Git 的困惑 :Git 无法判断你是想保留 Branch B 那个“新基准”上的修改,还是想保留 Branch A 那个“旧背景”下的逻辑。 由于历史路径完全断开,Git 拒绝猜测,只能把决定权交还给你

解决:

使用git merge 在旧分支里合并新分支,这时文档里会有冲突,我们手动修改,只保留正确的内容。以下是具体的步骤:

1 将修改合并回你的旧分支

1.1 切回旧分支

git checkout 旧分支名称

1.2 合并本地的 新分支

git merge 新分支名称

如果提示冲突 :打开 冲突 文件,手动处理 <<<<<<<和======= 标记,保留最新的内容。

1.3 同步远程最新的 develop

2 同步远程最新的 develop

为了确保我的 PR 不会再报错,需要把 develop 分支上的最新变动(可能是队友交的代码)也拿过来:

2.1 拉取最新 develop :

git fetch origin
git merge origin/develop

如果出现冲突,见上文1.2

2.2 暂存提交

git add .
git commit -m "fix: 整合所有分支修改并解决冲突"

3 重新推送到 GitHub

git push origin 旧分支

为什么分支A的代码会消失不见?

 现象还原:代码是如何“弄丢”的?

1. 第一步(旧分支) :我在 旧 分支修改了 .md 文件,但 没有 commit 。此时,这些修改只是“浮”在你的硬盘上,并不属于任何分支。

2. 第二步(切换) :我运行了 git checkout b 新分支名称。Git 把这些“浮”着的修改一起带到了新分支。

3. 第三步(提交) :我在新分支里运行了 git add 和 git commit 。 关键点: 这一步就像是把原本在外面飘着的行李,正式搬进了“新分支”这个房间里。

4. 第四步(切回) :当我执行 git checkout 旧分支名称 回到旧分支时,Git 会根据旧分支的最后一次提交记录来“还原”你的文件夹。

    因为我从没在旧分支提交过那些修改,旧分支的记录里根本没有它们。

    结果 :Git 把文件恢复成了改动之前的样子,你看到的修改就“不见了”。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐