git merge 用法

作者: bangelua | 来源:发表于2019-04-04 20:30 被阅读38次

怎么 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 对其仍然做了修改就会产生冲突.

务必同删除这个文件的作者确认下文件是否真的被删除了, 因为可能存在下面的情况:

  1. 文件重命名了(如 java 转换为了 kt)
  2. 文件被转移了(转移到其他 project 或其他包名目录下)
  3. 文件中代码逻辑被整合到另外一个文件中(如删除了 base 类, base 类逻辑放到派生类中了)
  4. 其他文件非真正被删除的情况

如果是以上情况, 需要把远端分支对这个文件的修改 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 用法

    怎么 merge 首先更新本地分支和远程分支为最新代码, 分别对要参与 merge 的两个分支做如下两个操作: 切...

  • git命令 cherry-pick 的使用简介

    上一篇文章介绍了merge和rebase的用法以及原理。git命令merge和rebase的简单应用 这里简单的介...

  • git 相关命令

    git merge 和 git rebase 小结: git merge是用来合并两个分支的。git merge ...

  • O my zsh - git

    gl = 'git pull'gm = 'git merge'gmom = 'git merge origin/m...

  • 《Git/Gitlab进阶》九:测试merge和rebase分支

    本章主要测试讲解 git merge和git rebase指令的用法和进行分支合并,并做简单比较分析。 测试过程内...

  • git 错误 git error: You have not c

    简单,安全解决办法 $:git merge --abort $:git reset --merge $:git p...

  • git merge 简单用法

    当我们需要开发一个新的功能的时候,创建一个dev分支,完成之后再合入master分支 git checkout d...

  • git merge最简洁用法

    一、开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支 二、当master代码改动了,需要更...

  • git merge简单用法

    git merge 的两种场景以及操作步骤 一、开发分支(dev)上的代码达到上线的标准后,要合并到 master...

  • git merge最简洁用法

    开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支 当master代码改动了,需要更新开发分...

网友评论

    本文标题:git merge 用法

    本文链接:https://www.haomeiwen.com/subject/vktciqtx.html