git merge 用法
怎么 merge
首先更新本地分支和远程分支为最新代码, 分别对要参与 merge 的两个分支做如下两个操作:
切换分支
git checkout <branch_name>
更新分支
git fetch && git pull --rebase
切换到 master 分支
git checkout <master_branch>
merge 远端分支, 比如开发分支 dev-2.6.0
git merge --no-ff dev-2.6.0
参数 --no-ff 意思是不要快进的, 保证总是生成一个 merge commit. 因为默认情况如果是支持快进的 merge 则不会生成一个 merge commit. 生成一个 merge commit 在 push 代码到 gerrit 上后会只有一个 merge 的 patch 提交, 否则会生成所有远程分支相对本地分支新增的 commit patch 提交.
如果没有冲突, 则会直接生成一个 merge commit, 不要修改自动生成的 commit message.
merge 冲突
冲突产生的原因
在不同分支上对同一个文件同一部分代码做了不同修改
冲突的文件主要分为三种类型:
1) 双方修改(both modified)
开启 diff3, 可同时查看 local(本地分支), remote(远端分支), common ancestors(共同祖先) 的差异:
git config --global merge.conflictstyle diff3
比如:
import com.bean.ApiRequest.ListRequest;
<<<<<<< HEAD(本地分支)
import com.base.net.APIService;
||||||| merged common ancestors (公共祖先)
import com.base.BaseActivity;
import com.base.net.APIService;
=======
import com.base.BaseActivity;
>>>>>>> dev-2.6.0(远程分支)
import com.net.rxcompat.SimpleSubscriber;
对比本地分支和远程分支基于共同祖先分别做了哪些修改, 做一个合并.
如果无法区分取舍, 请联系这两个修改的作者. 方法如下.
查看冲突文件不同分支上的差异 commit:
git log --left-right --merge <file>
或者:
git log --left-right HEAD...MERGE_HEAD <file>
上面命令可加上 -p 参数同时显示每个差异 commit 的 diff, 快速查看冲突的行都是哪些 commit 修改的.
可通过下面命令时使冲突文件以本地分支为准
git checkout --ours <file>
可通过下面命令时使冲突文件以远程分支为准
git checkout --theirs <file>
上面两个命令谨慎使用, 因为会丢弃本地/远程分支对这个文件的修改.
解决完成冲突的文件执行:
git add <file>
2) 由我们删除(deleted by us)
未合并的路径:(酌情使用 "git add/rm <文件>..." 标记解决方案)由我们删除:src/main/java/com/android/Main.java
产生的原因: 本地分支的文件被删除了, 远端分支存在 commit 对其仍然做了修改就会产生冲突.
务必同删除这个文件的作者确认下文件是否真的被删除了, 因为可能存在下面的情况:
- 文件重命名了(如 java 转换为了 kt)
- 文件被转移了(转移到其他 project 或其他包名目录下)
- 文件中代码逻辑被整合到另外一个文件中(如删除了 base 类, base 类逻辑放到派生类中了)
- 其他文件非真正被删除的情况
如果是以上情况, 需要把远端分支对这个文件的修改 commit 同步到这个文件的最新的位置, 防止 commit 丢失. 最后, 执行 git rm 删除这个冲突文件即可.
如果文件确定要被删除, 直接执行命令移除该文件:
git rm {file}
3) 由他们删除(deleted by them)
操作方式同"由我们删除(deleted by us)", 产生冲突的区别是, 远程分支删除了文件, 本地分支仍然基于远程分支删除文件之前的祖先版本做了修改.
所有文件冲突解决完成后, 本地确保编译通过后, 执行:
git merge --continue
放弃本次 merge 操作可通过:
git merge --abort
如果已经完成了 merge 后发现 merge 的存在问题, 可以通过丢弃最近一次 commit 再重做 merge:
git reset --hard HEAD~1
merge 注意事项
- 不要修改 merge commit 默认的 message
- 不要在 merge commit 上做除了解决冲突以外的修改
- 谨慎使用 git checkout —ours/theirs 解决冲突
- 提交merge代码时, 不要在本地做 rebase.
- 无法确定的操作一定要寻求有经验的同事帮助.
参考链接
Advanced Merging
git merge 用法相关推荐
- git merge用法_常用命令之git操作(进阶篇)
几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作. 有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系 ...
- git merge用法_Git 基本命令 merge 和 rebase,你真的了解吗?
前言 Git 中的分支合并是一个常见的使用场景. 仓库的 bugfix 分支修复完 bug 之后,要回合到主干分支,这时候两个分支需要合并: 远端仓库的分支 A 有其他小伙伴合入了代码,这时候,你需要 ...
- git rebase和git merge的用法
http://softlab.sdut.edu.cn/blog/subaochen/2016/01/git-rebase%E5%92%8Cgit-merge%E7%9A%84%E7%94%A8%E6% ...
- 20 个最常用的 Git 命令用法说明及示例
作者 | Sahiti Kappagantula 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 在这篇文章中,我将介绍在使用 Git 时最常使用的 20 个命令. 以下 ...
- git merge的用法
现在我们有一个主分支dev,现在有一些feature分支,需要偶尔将dev分支的稳定代码合入feature分支,所以用到git merge 现在整理下git merge的几个概念和用法 Fast fo ...
- git merge最简洁用法
一.开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支 git checkout dev git pull git checkout master git merge dev g ...
- git cherry-pick用法
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求. 这时分两种情况.一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge).另一种情况是,你只需要部分代码变动( ...
- Git复习(十三)之git revert用法及与git reset区别
git revert用法以及与git reset的区别 git revert用法 git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一 ...
- 怎么把好几行弄成一行_我在git merge的时候遇到了冲突,怎么解决?
大家好,今天来和大家聊一个老生常谈的问题,我们在使用git merge的时候遇到了冲突,怎么办? 首先我们来看看为什么会冲突,git冲突的原因很简单,就是两个分支当中对同一处代码进行了不同的改动.于是 ...
最新文章
- ListView和数据适配器SimpleAdapter例子
- 分子排列不同会导致_刘珏文: DNA寡核苷酸的冷冻定向拉伸和排列
- 【转】Windows Phone 8 开发环境的搭建
- 基于mysql的主从复制之Mycat简单配置和高可用
- 从数组到流再到Java 8
- DXOMark公布最新相机综合评分:华为P30 Pro不再是唯一王者
- Intel X86 CPU寄存器学习笔记
- fpga数电基础之--------触发器
- matlab2c使用c++实现matlab函数系列教程-save函数
- 设备信息获取以及唯一标识资料
- ZeroMQ之Request/Response (Java)
- Ceph OSD处理客户端写操作处理流程
- 算法设计与分析基础 (Anany Levitin 著)
- Arduino Nano与SIM800C 通信
- 经历3个失败的游戏创业公司,我所亲历的痛与教训
- C语言实验——拍皮球 1184
- 我和数据类型抗争的血泪史(二十五分钟)
- 程序员的副业,有人做扮鬼演员月入5K,有人接私活年入80万!
- MAC | svn: E175002: DAV request failed: 411 Content length required.
- flume+kafka整合采集数据案例