Administrator
发布于 2024-04-01 / 1 阅读
0
0

GitAdvance

高级合并与冲突处理

refer to : https://wklchris.github.io/blog/Git/Conflict.html

https://blog.csdn.net/qq_41603165/article/details/104922336

https://deepinout.com/git/git-questions/50_git_git_merging_when_to_use_ours_strategy_ours_option_and_theirs_option.html#google_vignette

中断合并

当一次合并操作出现问题,你可以使用 --abort 选项中断合并:

$ git merge --abort

该操作会恢复到你合并前的状态——如果你合并前的目录没有未提交、未提交的修改,它可能出现问题;此外的情形它总是可靠的。

检出冲突

当 merge 命令检查到冲突时,文件中会有类似这样的片段(摘自官方手册):

// 当前处于dev分支,需要将test分支代码,合并到dev分支中

$ git merge origin/test
Auto-merging iot2-module-alarm/iot2-module-alarm-biz/src/main/java/com/jshxhb/module/alarm/biz/controller/devicealarm/DeviceAlarmRecordController.java
CONFLICT (content): Merge conflict in iot2-module-alarm/iot2-module-alarm-biz/src/main/java/com/jshxhb/module/alarm/biz/controller/devicealarm/DeviceAlarmRecordController.java
Auto-merging iot2-module-alarm/iot2-module-alarm-backend/src/main/java/com/jshxhb/module/alarm/backend/service/devicealarm/DeviceAlarmRecordBackendServiceImpl.java
CONFLICT (content): Merge conflict in iot2-module-alarm/iot2-module-alarm-backend/src/main/java/com/jshxhb/module/alarm/backend/service/devicealarm/DeviceAlarmRecordBackendServiceImpl.java
Auto-merging iot2-module-alarm/iot2-module-alarm-backend/src/main/java/com/jshxhb/module/alarm/backend/service/devicealarm/DeviceAlarmRecordBackendService.java
CONFLICT (content): Merge conflict in iot2-module-alarm/iot2-module-alarm-backend/src/main/java/com/jshxhb/module/alarm/backend/service/devicealarm/DeviceAlarmRecordBackendService.java
Auto-merging iot2-dependencies/pom.xml
CONFLICT (content): Merge conflict in iot2-dependencies/pom.xml
Automatic merge failed; fix conflicts and then commit the result.

checkout 命令有 --ours 与 --theirs 选项,用以选择对应提交的版本而抛弃另一个提交的版本。这是一种无需合并的快速方式,尤其是对二进制文件的版本控制而言。

“ours” 指代当前分支,“theirs” 指代待合并分支。

git checkout --theirs iot2-dependencies/pom.xml

git checkout --theirs  iot2-module-alarm/iot2-module-alarm-biz/src/main/java/com/jshxhb/module/alarm/biz/controller/devicealarm/DeviceAlarmRecordController.java


git checkout --theirs iot2-module-alarm/iot2-module-alarm-backend/src/main/java/com/jshxhb/module/alarm/backend/service/devicealarm/DeviceAlarmRecordBackendService.java


git checkout --theirs iot2-module-alarm/iot2-module-alarm-backend/src/main/java/com/jshxhb/module/alarm/backend/service/devicealarm/DeviceAlarmRecordBackendServiceImpl.java

压缩合并

有时你的开发分支 dev 可能会充满无意义的提交与不清晰的历史(虽然我建议你尽量避免这种情形),因此向主分支 master 合并时可能会不想保留这些记录。那么压缩合并 --squash 正是你的救星。

压缩合并并不是真的合并了分支,它只是将待合并分支的改动复制到了当前分支,从而允许用户将待合并分支的众多提交“压缩”成当前分支的单个提交。

$ git merge --squash dev
$ git commit -m "Update ..."

注意到在上述操作之后,dev 分支并没有真的被合并到 master 分支。如果 dev 分支仍在将来会被合并,不可避免地,你将把它之上的提交历史也合并到 master 分支。因此,我建议只对临时本地分支使用压缩合并,并在压缩合并后删除该分支。

偏好合并

如果你预计合并中会出现冲突,但你只要求 master 分支的内容覆盖 dev 分支的内容,你可以使用 -Xours 选项:

// 当前处于matser分支,需要将dev分支的代码,合并到master分支中
$ git merge -Xours dev

上面的命令,含义是:

将dev分支的代码,合并到master分支中,如果遇到了冲突,那么直接选择使用当前master分支的代码,忽略dev分支的代码

如果我们想反过来,遇到冲突后,选择使用dev分支的代码。忽略master分支的代码,那么使用 -Xtheirs 选项

$ git merge -Xtheirs dev

正如上文提及的,“ours” 指代当前分支,“theirs” 指代待合并分支。因此你也可以类似地使用 -Xtheirs 选项。多说一句,这两个选项对于较少用到的 merge-file 命令也生效。


评论