如何修复跨平台Git本地仓库与GitHub主分支的版本冲突?
问题场景名称及解决方法
专业术语
- 分支分叉(Divergent Branches):你的本地
main分支与远程origin/main分支出现提交历史分叉——本地有1个未推送的独立提交,远程有8个本地没有的新提交,两者提交历史不再线性统一。 - 合并冲突(Merge Conflicts):拉取远程分支时Git无法自动合并两端对同一文件的修改,具体分为两种类型:
CONFLICT (add/add):两端都添加了同一文件(或同一文件的同一区块),Git无法自动判断保留哪一方内容CONFLICT (content):同一文件的内容被两端修改且修改范围重叠,Git无法自动合并
解决方法
不推荐的简单方法:删除本地仓库重新克隆
这确实是操作最简便的方式,但缺点明显:会丢失本地未提交的工作区变更、仓库自定义配置,以及未推送的本地提交(若这些内容有价值)。仅适用于本地无重要内容的场景。
更优的保留本地变更方法(推荐)
方法1:合并方式(保留分叉历史)
若不介意提交历史出现合并节点,可按以下步骤操作:
- 手动解决冲突文件:
打开.gitignore和assertions/assertions.v,找到冲突标记<<<<<<<(本地内容)、=======(远程内容)、>>>>>>>,编辑保留需要的内容后删除标记 - 标记冲突已解决:
git add .gitignore assertions/assertions.v - 完成合并提交:
Git会自动生成合并提交信息,确认后即可完成,之后执行git commitgit push同步本地变更到远程。
方法2:变基方式(保持线性提交历史)
若希望提交历史保持线性,推荐用变基代替合并:
- 取消当前合并状态(若处于冲突未解决状态):
git merge --abort - 执行变基拉取:
Git会将本地的1个提交“移动”到远程8个提交之后,若出现冲突:git pull --rebase- 手动解决冲突文件(同方法1)
- 标记冲突已解决:
git add .gitignore assertions/assertions.v - 继续变基:
git rebase --continue
- 变基完成后推送本地变更:
git push
额外说明
执行git mergetool --tool=vimdiff提示“No files need merging”,是因为当时处于分支分叉但未触发合并操作的状态,无待合并的冲突文件。后续配置pull.rebase false触发合并后,才出现了实际冲突内容。
内容的提问来源于stack exchange,提问作者Scooter
相关产品推荐
相关产品推荐

