请教一个开发流程中 GIT 解决冲突的问题

204 天前
 sngxx
基准分支是 master ,开发分支是 feature 。现在准备发布上线了,需要 feature 合入 master ,此时有冲突,我解决冲突有两种方式。

一是:直接把 master 合入 feature 解决冲突,再把 feature 合入 master ;
二是:先从 master 拉出分支 master_1 ,把 feature 合入 master_1 解决冲突,再把 master_1 合入 master ;
这 2 种有区别吗,LD 必须让第二种,不理解。
9124 次点击
所在节点    git
121 条回复
h1298841903
204 天前
我都是用方法一,我们公司合入代码出现冲突时,会有提示教程,用的就是方法 1 ;
030
204 天前
只要不是在 master 上操作就行,local branch 也算是 diff branch
030
204 天前
@whoosy 第一种方式不会有这种问题,有问题的是人不会用,建议直接换人
JLNR
204 天前
@daimon1 你说得对,这两种方式就是等价的,楼上还有人搁那一本正经的分析呢,完全对 git 一无所知
gesse
204 天前
没有人说要用 squash merge 吗?
JLNR
204 天前
方法 1 和 2 是基本等价的,区别就是方法二多创建了一个无用分支

p.s. 比较看不惯不管有没有冲突先把 master 往 feature 分支一顿 merge ,再发 merge request 到 master 的,没冲突的话不应该直接发 mr 嘛?所以还是 merge 前先 rebase 比较好,分支看起来清晰干净
wwwz
204 天前
有没有想过问 deepseek ,说的很清楚。
这是一个决策问题不是对错问题,over
whoosy
204 天前
@030 #23 不是搞 git 领域的确实不用关注这些,我们很长时间才找到的问题被你一句话给否定了
leonshaw
204 天前
说等价的没有理解 commit parents 的顺序
看看 Linux 怎么处理
https://docs.kernel.org/maintainer/rebasing-and-merging.html#merging-from-sibling-or-upstream-trees
virusdefender
204 天前
你直接 git rebase master 不就相当于没有冲突了么,那就没有这个问题了
kapaseker
204 天前
走 Merge Request 的话,都是要先解决完冲突才能和入,在 Master 上拉不拉新分支不影响什么
elron
204 天前
@030 #23 我们之前投产就是用第一种方法,用的是私有化 gitlab ,线上 pr 合不进去 master 分支,只能本地手动去合,很痛苦
xfmaa
204 天前
你们 LD 的想法起点是让 master 一直保持正确可用的版本,git merge 后发现不对在 log 里就会发现错误。所以想先创建一个临时分支用于合并,合并确认无误后在 master 上保存版本。说白了他就是接受草稿本上犯错,卷子上一直整洁。你非要在 master 上搞个潜在的问题出来他不喜欢
sngxx
204 天前
@kapaseker 是的,第一个是 feature 合过 master 后,提一个 feature->master 的 MR ;第二个是解决完冲突提一个 master_1->master 的 MR 。

@all 理由是第二种 MR 的 diff 是以更新的 commit 为基准和 feature 对比,只包含了当前 feature 的改动记录
xfmaa
204 天前
@xfmaa 补充一下,你们 ld 肯定还要求你们确认无误 merge 之后把这个 master_1 分支删掉。这个其实无所谓,就是习惯问题,你的 ld 考虑的是所有人一起用的版本需要整洁,不想万一哪一个往上面抹了一坨然后说擦掉就没事。
GeruzoniAnsasu
204 天前
两者不等价。见 https://ex.noerr.eu.org/t/1101348#r_15733764

不要交叉 merge ,会导致公共父节点难以判断,然后代码会「莫名其妙地在你正常操作情况下丢失」
SayHeya
204 天前
实际用方法一
clovershell
204 天前
两种合并方式的本质区别在于合并方向和对历史记录的影响,LD 要求使用第二种方式的核心原因在于保持 master 分支的稳定性。以下是具体分析:

**1. 第一种方式( master→feature→master )的潜在问题:**
- 污染特性分支历史:feature 分支会引入 master 的合并提交,破坏特性分支的线性开发记录
- 隐藏风险:合并后若发现冲突解决错误,需要回滚会导致 master 和 feature 同时受影响
- 破坏权限模型:若 master 有保护规则,直接合并 feature 可能绕过 CI/CD 流程

**2. 第二种方式( feature→master_1→master )的优势:**
- 隔离风险:所有冲突解决在临时分支完成,不影响原始开发分支和主分支
- 强制代码最新:master_1 基于最新 master 创建,确保冲突解决是基于最新线上代码
- 审计清晰:master_1 的合并请求可独立进行 code review ,保留完整解决记录
- 符合 Git Flow 规范:临时发布分支模式是标准持续交付实践

**技术实现差异对比:**
```bash
# 方式一
git checkout feature
git merge master # 污染 feature 分支
git checkout master
git merge feature # 可能触发二次 CI

# 方式二
git checkout -b master_1 master
git merge feature # 在隔离分支解决
git checkout master
git merge master_1 # 快进合并(无冲突)
```

**企业级开发的最佳实践建议:**
1. 使用 `--no-ff` 合并保证历史可追溯
2. 通过 Merge Request 机制合并 master_1
3. 在 master_1 分支触发完整 CI 流水线
4. 合并后立即删除 master_1 分支

这种方式既能保证主分支稳定性,又符合审计要求,是大型项目协同开发的常规做法。理解这个设计需要跳出个人开发视角,从团队协作和交付安全的角度思考分支策略的价值。


来自 Deepseek 回答
codingbody
204 天前
@leonshaw #13 feature rebase 就行了吧,而不要使用 merge
unco020511
204 天前
你每次合并前 rebase 一下 master 就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1116014

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX