介绍
花园下一次指南更新涉及同一行中的两项正确信息。准备好的本地提交将游客入口移至南入口,并更新游客服务台电话。队友已发布的提交改变了开放时间和无障碍通行路线。最终指南需要同时包含两组信息。
本实验从一组独立的仓库开始,不需要上一台 VM 的任何文件。你将看到真实的内容冲突,练习取消未完成的合并,组合正确字段,并将结果交付到一个新的接收克隆。
请先完成上一个引导实验,或确保已经了解远程仓库名称、获取、合并、推送和克隆。基本的终端目录切换、提交和差异查看是前置要求。45 分钟的时长为作者估计。
查看冲突并安全地重新开始
本步骤中,你将比较两项贡献,了解自动合并为何停止,并练习安全返回原来的本地状态。
打开 Terminal,进入为本实验独立准备的仓库:
cd /home/labex/project/guide-team/editor
设置仅适用于当前仓库的身份。--local 避免改变全局设置;引号将姓名作为一个整体。这些合成值只是示例,不要求你提供个人信息:
git config --local user.name "Guide Editor"
git config --local user.email "guide@example.com"
读取准备好的本地指南,然后获取队友的更新:
cat guide.txt
git fetch origin
读取队友的版本。revision:path 选择实际已提交的文件,--no-pager 将它直接打印出来:
git --no-pager show origin/main:guide.txt
你的版本为 South entrance 和 09:00-17:00;队友的版本为 North entrance 和 10:00-18:00。两项业务决定彼此独立:采用你的南入口和队友的新开放时间。保留最晚入园时间的句子。其他页面中,保留你的游客服务台电话,以及队友的河畔坡道。
开始合并。如果合并自动完成,--no-edit 可以避免打开编辑器。这里预期会返回非零状态,并因内容冲突而停止。 单独运行该命令,然后继续:
git merge --no-edit origin/main
预期会看到 CONFLICT (content): Merge conflict in guide.txt 和 Automatic merge failed; fix conflicts and then commit the result.。Git 尚未创建新提交。
读取简洁状态和发生冲突的文件:
git status --short
cat guide.txt
UU guide.txt 表示文件尚未合并。在文件中,<<<<<<< HEAD 是你的版本的起始标记,======= 分隔两个备选版本,>>>>>>> origin/main 是队友版本的结束标记。这些标记描述了分歧;仅删除标记,会留下互相矛盾的行。路线页面可能已显示为暂存的 M access.txt,因为 Git 成功合并了这项独立更改。
解决冲突前,先练习恢复。git merge --abort 只取消未完成的合并,将已跟踪文件和索引返回到合并前的状态。此场景开始时工作区是干净的;在日常工作中,开始合并前应先提交或暂时收起无关编辑。
git merge --abort
git status --short
不应出现任何更改。再次读取指南:原来的南入口和旧开放时间已恢复。
cat guide.txt
现在重新开始同一次合并。预期会再次出现冲突和非零状态。 保持第二次冲突未解决,留待下一步处理:
git merge --no-edit origin/main
git status --short
检查点要求 guide.txt 处于进行中的、未解决的冲突状态。如果路径拼错,请使用 pwd 和 ls 检查,再用上面的完整 cd 命令返回。不要通过删除 .git 或重置 VM 来处理普通的目录切换错误。
解决信息冲突并完成合并
本步骤中,你将把冲突转化为一行可用的指南信息,同时保留 Git 已经合并的页面。
留在 Terminal 中,目录为 /home/labex/project/guide-team/editor,并保持上一步的冲突未解决。你需要自己贡献中的 South entrance 和队友贡献中的 10:00-18:00。直接选择任意一方的整个文件,都会丢失一项已获批准的更改。
以下命令**只替换 guide.txt**,写入完整的三行结果。> 将输出重定向到该文件,替换其内容。<<'GUIDE' 是 here-document:后续各行作为字面输入,直到遇到只包含 GUIDE 的一行。请复制整个代码块,包括最后的标记。为标记加引号可以防止 shell 展开文本中的内容。不需要编程。
cat > guide.txt <<'GUIDE'
RIVERLIGHT GARDEN
Gate: South entrance; Hours: 10:00-18:00
Last entry is 30 minutes before closing.
GUIDE
暂存前,读取全部三个文件。最晚入园时间的句子必须保留;access.txt 必须包含河畔坡道;contacts.txt 必须包含你更新后的电话。
cat guide.txt
cat access.txt
cat contacts.txt
其他两个页面的预期内容:
Step-free route: Use the riverside ramp
Visitor desk: 010-555-0120
git add 将已解决的文件记录到索引,并将它的冲突标记为已解决。该命令本身不会创建提交:
git add guide.txt
查看相对于你原来的本地提交,这次合并将加入什么内容。diff --cached 对比暂存结果与 HEAD;--no-pager 让输出留在当前终端中:
git --no-pager diff --cached
预期会看到 guide.txt 中的开放时间更改和 access.txt 中的坡道更改。你的南入口和游客电话已经在本地父提交中,因此不必在这个对比中显示为新增行。除了差异,还应检查最终文件。
如果看到拼写错误,请重新运行完整的指南代码块并纠正错误,然后再次运行 git add guide.txt。如果希望完全放弃这次未完成的尝试,可使用上一步的 git merge --abort,重新开始合并,并再次解决冲突。完成提交后不要使用 abort。
使用一条有描述性的信息完成合并。-m 直接提供信息,而不打开编辑器;其他有意义的措辞也可以:
git commit -m "Combine gate and opening hours"
检查两条祖先历史线和干净的工作区:
git --no-pager log --oneline --graph --all --decorate
git status --short
预期没有状态输出。原来两项贡献的信息必须仍保留在新合并下方。检查点要求保留这段历史和完整正确的文件,而不只是清除冲突标记。
发布并接收完整指南
本步骤中,你将把合并后的版本交付到共享仓库,再从一个新的接收副本中读取它。仅在本地合并,还没有向其他副本交付任何内容。
留在 Terminal 中,目录为 /home/labex/project/guide-team/editor。push origin main 将本地 main 的历史发送到名为 origin 的仓库。这一次,共享贡献是合并提交的祖先,因此推送能够推进共享 main,而不移除该贡献。
git push origin main
预期会看到 main -> main,且没有拒绝信息。如果被拒绝,请再次获取并检查历史图;不要添加强制选项。准备好的场景中没有后台贡献者,但真实团队可能随时发布新工作。
现在切换到包含这两个仓库的目录:
cd /home/labex/project/guide-team
git clone 根据来源创建一个新仓库和工作文件。这里,shared.git 是现有的本地来源路径,received-guide 是新的目标目录。接收副本必须以共享仓库为来源,这样才能显示合并结果是否真正交付。
git clone shared.git received-guide
预期会看到 Cloning into 'received-guide'... 和 done.。如果你在尝试时已经克隆过,请保留该副本:进入 received-guide,使用之前学过的 git fetch origin,再执行 git merge --no-edit origin/main 来更新它。不要为了重新尝试克隆而删除原来的编辑仓库。
进入接收副本:
cd received-guide
读取每个实际文件。cat 会打印文件,而不改变它:
cat guide.txt
cat access.txt
cat contacts.txt
将这些信息与上一步中合并后的业务要求对照。三个文件的内容都必须完整,包括未更改的行。仅凭克隆成功信息,无法证明内容正确。
最后,读取接收副本的历史。--oneline 简化每条提交的显示,--graph 绘制父提交连接,--decorate 标记分支指针。--no-pager 直接打印,而不打开可滚动的查看器。
git --no-pager log --oneline --graph --decorate
顶端的合并具有两条祖先历史线,包含原来两项贡献的信息和最初的提交。你的具体提交 ID 会有所不同。检查内容是否完整保留,以及接收副本是否位于 main,其已跟踪工作区文件是否干净:
git status --short
没有输出表示不存在已暂存、未暂存或未跟踪的更改。你已通过真实的 Git 仓库交付一组可用文件,所有仓库都运行在这一台教学机器上。
总结
你阅读了真实冲突的两边内容,使用 git merge --abort 安全恢复,然后组合了正确字段,而不是选择某一方的全部内容。你保留了自动合并的路线、自己更新的游客电话,以及指南中未更改的句子。
已发布的合并和独立接收克隆现在都包含完整指南,并保留两项原始贡献。挑战将更换手册内容,并对调各项正确字段来自哪位贡献者。



