怎么修改别人网站内容(冲突的类型逻辑(合并/应用补丁)时产生冲突)
优采云 发布时间: 2021-12-18 19:06怎么修改别人网站内容(冲突的类型逻辑(合并/应用补丁)时产生冲突)
冲突
很多命令可能会冲突,但从根本上说,merge 和 patch(应用补丁)冲突。
而rebase是重置baseline然后应用patch的过程,所以会有冲突。
git pull会自动合并,repo sync会自动rebase,所以git pull和repo sync也会冲突。当然 git rebase 更不用说了。
冲突类型
逻辑冲突
Git 的自动处理(合并/应用补丁)是成功的,但在逻辑上是有问题的。
比如别人修改了文件名,我还是用了旧的文件名。在这种情况下,自动处理可以成功,但实际上存在问题。
再比如,函数返回值的含义发生了变化,但我仍然使用旧的含义。这种情况自动处理成功,但可能隐藏了重大bug。这类问题主要是通过自动化测试来保证的。所以最好能写出更完整的自动化测试用例。
这个冲突的解决方法是做一个BUG修正。没有真正解决 git 报告的冲突。
内容冲突
如果两个用户修改同一个文件的同一个区域,git会报内容冲突。这是我们经常做的,下面的解决方案主要针对这种冲突。
树冲突
由文件名修改引起的冲突称为树冲突。
比如用户a将文件重命名为ac,用户b将同一个文件重命名为bc,那么b合并两次提交时就会发生冲突。
$ git 状态
我们添加: bc
都删除了:origin-name.c
由他们添加: ac
如果最后决定使用bc,那么解决方法如下:
git rm ac
git rm origin-name.c
git 添加 bc
提交
执行前两个git rms时,会提示“文件名:需要合并”,可以忽略。
树冲突也可以用 git mergetool 解决,但整个解决过程是在交互式问答中完成的。使用 d 删除不需要的文件,使用 c 保留需要的文件。
最后执行 git commit 提交。
内容冲突解决
发现冲突
一般来说,发生冲突时会出现“CONFLICT”:
$ git pull
自动合并测试.txt
CONFLICT(内容):合并 test.txt 中的冲突
自动合并失败;修复冲突,然后提交结果。
但是,也有例外。repo 同步错误可能不直接表示冲突,而是以下内容:
错误:项目迷你/样本
注意:不管有没有冲突,只要本地修改不是基于最新的服务器都可能报这个错误,解决方法是一样的。
这时候需要进入报错的项目目录(git库),然后执行git rebase解决:
git rebase 远程分支名称
解决冲突的一般过程
合并/补丁的冲突解决
先编辑冲突,然后git commit提交。
注意:对于 git 来说,编辑冲突与通常的修改代码没有区别。修改完成后,需要将修改添加到缓存中,然后提交。
变基冲突解决
rebase的冲突解决过程就是解决每个应用补丁冲突的过程。
解决补丁应用冲突后,执行以下命令标记冲突已解决(即将修改后的内容添加到缓存中):
git add -u
注意:-u 表示将所有跟踪文件的新修改添加到缓存中,但不添加新文件。
然后执行以下命令继续rebase:
git rebase --continue
如果继续解决冲突,请重复这些步骤,直到完成变基。
如果遇到不需要应用的补丁,可以使用以下命令忽略:
git rebase --skip
如果想回到rebase执行前的状态,可以执行:
git rebase --abort
注意:rebase后不需要执行commit,也没有新的修改需要提交,都是git自动完成的。
编辑冲突方法
直接编辑冲突文件
发生冲突后,文件系统中冲突文件(这里是test.txt)的内容会显示类似如下:
a123
> 6853e5ff961e684d3a6c02d4d06183b5ff330dcc
C
其中:冲突标签之间的内容是他人的修改。
此时,还没有产生其他垃圾文件。
编辑冲突最简单的方法是直接编辑冲突文件(test.txt),删除冲突标记,正确解决冲突。