当前位置: 首页 > news >正文

git常见冲突场景及解决办法

场景1.假设一开始 本地拉取了远程最新的代码 就是说本地和远程此时一样 然后本地写了一个新需求git commit了 但是没有提交到远程仓库 然后另外一个地方提交了某个功能的新代码 到远程 此时本地和远程的代码不一样了 而且本地有已经 commit的 这时候 这个本地想同步远程的最新代码 应该怎么做。

当本地有已提交(commit)但未推送(push)的代码,且远程仓库已有新提交时,需要将远程最新代码同步到本地并与本地代码合并,具体步骤如下:

当本地有已提交(commit)但未推送(push)的代码,且远程仓库已有新提交时,需要将远程最新代码同步到本地并与本地代码合并,具体步骤如下:

步骤 1:确保本地工作区干净

首先确认本地所有修改都已提交(你已经完成了这一步),可以通过 git status 检查,确保输出显示 "nothing to commit, working tree clean"。

步骤 2:拉取远程最新代码(fetch)

先获取远程仓库的最新代码到本地的远程跟踪分支(如 origin/main 或 origin/master),但不直接合并到本地分支:

bash

git fetch origin

  • 作用:更新本地存储的远程仓库信息,让你知道远程有哪些新提交,但不会影响你的本地工作分支。

步骤 3:合并远程代码到本地分支(merge)

将远程最新代码(如 origin/main)合并到你的本地当前分支(如 main):

bash

git merge origin/main

  • 此时 Git 会尝试自动合并远程代码和你的本地提交。

步骤 4:处理可能的合并冲突(若有)

如果远程代码和你的本地提交修改了同一部分内容,会出现合并冲突,此时:

  1. 终端会提示哪些文件有冲突。
  2. 打开冲突文件,会看到类似以下标记的冲突内容:

    plaintext

    <<<<<<< HEAD  # 你的本地代码
    你的本地修改内容
    =======
    远程仓库的修改内容
    >>>>>>> origin/main  # 远程代码
    
  3. 根据实际需求编辑文件,保留正确的代码,删除冲突标记(<<<<<<<=======>>>>>>>)。
  4. 解决完所有冲突后,标记文件为已解决,并完成合并提交:

    bash

    git add <冲突文件路径>  # 标记冲突已解决
    git commit  # 提交合并结果(无需额外消息,Git会自动生成合并提交信息)
    

步骤 5:推送本地代码到远程(可选)

合并完成后,本地分支就包含了远程最新代码和你的本地提交,此时可以推送到远程:

bash

git push origin main

总结流程

bash

# 1. 确认本地已提交所有修改(已完成)
git status# 2. 获取远程最新代码
git fetch origin# 3. 合并远程代码到本地
git merge origin/main# 4. 若有冲突,解决后提交
# git add <冲突文件>
# git commit# 5. 推送本地代码到远程(可选)
# git push origin main

通过以上步骤,既能同步远程最新代码,又能保留本地已提交的新需求,最终形成一个包含双方修改的完整分支。

提示:git中的冲突

冲突是否会发生,取决于本地提交和远程新提交是否修改了「同一文件的同一部分内容」,和功能是否相关无关。

具体来说:
如果你的本地提交与远程新提交:

  • 修改的是完全不同的文件 → 不会有冲突,Git 会自动合并(把两边的文件都保留)。
  • 修改的是同一个文件,但修改的是不同的代码段(比如你改了文件的第 10 行,远程改了第 20 行) → 也不会有冲突,Git 会自动把两边的修改拼合到一起。
  • 修改的是同一个文件的「同一部分内容」(比如你和远程都改了文件的第 10-15 行) → 才会产生冲突,需要手动解决。

举个例子:
假设远程仓库有一个 app.js 文件,你拉取后本地提交了一个新功能(修改了 user.js 文件),而同时远程仓库有人提交了一个修改(修改了 order.js 文件)。这种情况下,你执行 git merge origin/main 时,Git 会自动把 order.js 的远程修改合并到本地,不会有任何冲突,因为两边改的是不同文件。

所以结论是:只有当两边修改了同一文件的重叠部分时才会冲突,如果是完全无关的代码(不同文件或同一文件的不同位置),Git 能自动处理合并,不会有冲突。

场景二:本地拉取了远程仓库的最新代码 但什么都没动 只是拉取了 然后另外一个地方提交了新功能的代码到远程 此时远程和本地是一样的 那本地是否可以直接执行git pull xxx?

是的,这种情况直接执行 git pull 即可顺利拉取远程最新更新。

具体来说,当本地满足两个条件:

  1. 工作区干净(没有未提交的修改,git status 显示 “nothing to commit”);
  2. 本地分支与远程分支在你上次拉取后没有本地新提交(即本地分支和你上次拉取的远程状态完全一致);

此时远程有新提交后,执行 git pull 会自动完成两个操作:

  • 先执行 git fetch 获取远程最新代码;
  • 再自动执行 git merge 将远程新提交合并到本地分支。

由于本地没有任何修改或新提交,合并过程不会有冲突(Git 只需要把远程的新提交 “叠加” 到本地分支上),整个过程会自动完成,无需手动处理冲突。

所以这种场景下,git pull 是最简单直接的同步远程最新代码的方式。

场景三:如果本地拉取了远程最新的代码 比如有一行代码一开始s="123" 本地改了一行s="456" 但是没commit 也没add 然后另外一个地方也修改了s="123" 修改为 s="789"然后提交到远程了 那此时本地应该怎么做 是不是会冲突 即使本地没commit 也没add?

这种情况会产生冲突,但冲突不会直接在 git pull 时爆发,而是需要你先处理本地未提交的修改,否则 Git 会阻止你拉取远程代码。

具体原因:

你的本地修改(s="456")停留在工作区(未 add 也未 commit),而远程仓库已经有了新提交(s="789")。两者修改的是同一文件的同一行内容(都是对 s 变量的修改),基于同一个基础版本(初始 s="123"),因此本质上是冲突的。

但 Git 会先检查你的工作区是否 “干净”—— 由于你有未提交的修改,直接执行 git pull 会失败,终端会提示类似:
error: Your local changes to the following files would be overwritten by merge: xxx.py
(意思是:拉取远程代码会覆盖你本地的未提交修改,因此被阻止)。

正确处理步骤:

步骤 1:暂存本地未提交的修改

用 git stash 将工作区的修改暂时 “储藏” 起来,让工作区恢复到干净状态(与上次提交一致):

bash

git stash

  • 作用:保存本地未 add/commit 的修改,同时清空工作区,方便后续拉取远程代码。
步骤 2:拉取远程最新代码

此时工作区干净,可以安全拉取远程的新提交(s="789"):

bash

git pull origin main  # 假设远程分支是 main

  • 拉取后,本地分支会更新为远程的最新状态(s="789")。
步骤 3:恢复本地暂存的修改并处理冲突

将之前 stash 的本地修改(s="456")恢复到工作区:

bash

git stash pop

  • 此时,Git 会发现恢复的修改(s="456")与拉取的远程修改(s="789")冲突(同一位置的不同修改),会自动标记冲突文件。
步骤 4:手动解决冲突

打开冲突文件,会看到类似以下的冲突标记:

plaintext

<<<<<<< Updated upstream  # 远程拉取的代码(s="789")
s="789"
=======
s="456"  # 你本地暂存的修改
>>>>>>> Stashed changes

  • 根据需求编辑文件,保留最终想要的内容(比如保留 s="456" 或 s="789",或修改为其他值),然后删除冲突标记(<<<<<<<=======>>>>>>>)。
步骤 5:提交最终结果

解决冲突后,将文件加入暂存区并提交:

bash

git add <冲突文件路径>
git commit -m "解决冲突,合并本地与远程修改"

(如果需要,后续可以用 git push 推送到远程)

总结:

即使本地修改未 add/commit,只要与远程修改了同一文件的同一部分,最终恢复本地修改时就会产生冲突。通过 git stash 暂存 → 拉取远程 → 恢复暂存并解决冲突的流程,即可安全处理这种场景。


文章转载自:

http://9rUCiN7t.kwpnx.cn
http://U0LIN7u3.kwpnx.cn
http://ki015n2Z.kwpnx.cn
http://ApbVXiQB.kwpnx.cn
http://WFNjrvbq.kwpnx.cn
http://akjr0zfB.kwpnx.cn
http://4GmALJwP.kwpnx.cn
http://nt8iyoUh.kwpnx.cn
http://fCCjIxQR.kwpnx.cn
http://ct0rfrBQ.kwpnx.cn
http://f3EnSxCz.kwpnx.cn
http://zVZGGh8y.kwpnx.cn
http://5Mlizspp.kwpnx.cn
http://AuKfeRJ7.kwpnx.cn
http://P1j8ngzG.kwpnx.cn
http://qQCnG5Zn.kwpnx.cn
http://iCjE7G3d.kwpnx.cn
http://XJzs7zFT.kwpnx.cn
http://EthQkxfk.kwpnx.cn
http://82M6T7tt.kwpnx.cn
http://CRpHfYLj.kwpnx.cn
http://J6A9EEOG.kwpnx.cn
http://7EBzAodk.kwpnx.cn
http://C12N3lj7.kwpnx.cn
http://03bBAXvf.kwpnx.cn
http://LXSSkLiV.kwpnx.cn
http://NGNr2l5o.kwpnx.cn
http://CafshGko.kwpnx.cn
http://4bOq7xxk.kwpnx.cn
http://34YGQwTG.kwpnx.cn
http://www.dtcms.com/a/381914.html

相关文章:

  • [code-review] 文件过滤逻辑 | 范围管理器
  • 学习嵌入式第五十三天
  • [code-review] 日志机制 | `LOG_LEVEL`
  • 物联网-无人自助茶室-如何实现24H智能营业?
  • JVM基础篇以及JVM内存泄漏诊断与分析
  • 【WRF数据准备】批量下载ERA5再分析数据-气象驱动数据
  • 如何实现文件批量重命名自动化
  • 【Unity 性能优化之路——概述(0)】
  • 零基础学AI大模型之SpringAI
  • AI行业应用:金融、医疗、教育、制造业的落地案例
  • 一文详解 Python 密码哈希库 Passlib
  • 360浏览器录屏功能、360浏览器录屏使用、免费录屏工具、Windows内置工具、开发者效率工具
  • 老梁聊全栈系列:现代全栈的「角色边界」与「能力雷达图」
  • ES——(三)DSL高级查询
  • 深度神经网络1——梯度问题+标签数不够问题
  • 【Unity UGUI 自动布局组(12)】
  • RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
  • goland 断点调试显示“变量不可用”
  • Qt/C++,windows多进程demo
  • 再谈golang的sql链接dsn
  • pre-commit run --all-files 报错:http.client.RemoteDisconnected
  • STM32N6AI资料汇总
  • 【MySQL】E-R图
  • QT元对象系统(未完)
  • Netty 针对 Java NIO Selector 优化:SelectedSelectionKeySet
  • 抑制信号突变(模拟量采集+斜坡函数)
  • C语言入门指南:字符函数和字符串函数
  • JVM从入门到实战:从字节码组成、类生命周期到双亲委派及打破双亲委派机制
  • SQL-用户管理与操作权限
  • Airtable与Python:轻量级ETL数据管道实战