原文链接:https://gist.github.com/karenyyng/f19ff75c60f18b4b8149#table-of-content

Table Of Content

Skip to the relevant sections if needed.

Concepts for resolving Git conflicts

For using mergetool in git, we need to understand the following terminology to understand what is being merged:

  • LOCAL - the head for the file(s) from the current branch on the machine that you are using.
  • REMOTE - the head for files(s) from a remote location that you are trying to merge into your LOCAL branch.
  • BASE - the common ancestor(s) of LOCAL and BASE.
  • MERGED - the tag / HEAD object after the merge - this is saved as a new commit.

Common mergetool from editors will display both LOCAL and REMOTE so you can decide which changes to keep. Please read this tutorial explaining the HEAD objects if you do not know what it is. It will help your understanding of Git tremendously.

Setting up different editors / tool for using git mergetool

We have to change the git config to set a default mergetool. In this example, we will use vimdiff:

$ git config merge.tool vimdiff      

We can also set the editor to display the common ancestor BASE while we examine what changes are in LOCAL and REMOTE with the following setting:

$ git config merge.conflictstyle diff3

back to top

Finding out what mergetool editors are supported

$ git mergetool --tool-help

And we list a few of them:

Command line mergetool editors

  • Emacs based diff tools: emerge, or Ediff
  • Vim based diff tool: vimdiff

GUI mergetool editors

  • gvimdiff - almost identical to vimdiff but uses the Linux GUI for Vim, please refer to vimdiff if you still use the keyboard commands for GVim.
  • kdiff3
  • meld
  • tortoisemerge

Or consult the community of your favorite editor to see how to do the equivalent operations for your editor.

Other useful mergetool settings

Do not prompt before launching the merge resolution tool

$ git config mergetool.prompt false

back to top

mergetool simple code example

Ref1 for the example
Ref2

creating the git repo

$ mkdir galaxyZoo
$ cd galaxyZoo
$ git init
$ vim astrophy_obj.txt

Add some galaxy types into astrophy_obj.txt then save the file.

# content of astrophy_obj.txt
spiral
ellipitcal
bar
irregular

save then commit the file.

$ git add astrophy_obj.txt
$ git commit -m 'Initial commit'
$ git branch astrophy_objects # create a new branch
$ git checkout astrophy_objects # change to new branch
$ vim astrophy_obj.txt # make changes to file

Change bar to barred in the file.

$ git commit -am 'changed bar to barred'
$ git checkout master # change back to master branch
$ vim astrophy_obj.txt
# add the word `galaxy` to the end of each line using Vim REGEX
# type `:%s/$/ galaxy/g` in Vim then press enter and save `:wq` $ git commit -am 'added galaxy to each line'
# merge from the astrophy_objects branch to current branch, i.e. master
$ git merge astrophy_objects

Then you will see some error messages:

Auto-merging astrophy_obj.txt
CONFLICT (content): Merge conflict in astrophy_obj.txt
Automatic merge failed; fix conflicts and then commit the result.

We can bring up the mergetool:

$ git mergetool

Then it will bring up the different versions of the file in different Vim splits panels.

+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+

The top left split panel is the LOCAL, top middle split is BASE and top right split is REMOTE. The bottom split refers to the MERGED version. You can find this info in the bottom bar of each split (I have put 3 yellow rectangles to highlight that info).

As you can see form the below image, my Vim has highlighted the differences in red for me. 

Now if your terminal has any GUI capability and you have compiled Vim correctly with GUI support, you can use your mouse to click on the bottom split to edit it. Or if you are a Vim ninja, you can use the keyboard shortcut to move to different splits.

Ctrl w + h   # move to the split on the left
Ctrl w + j # move to the split below
Ctrl w + k # move to the split on top
Ctrl w + l # move to the split on the right

You can either incorporate the changes by manually editing the MERGED split, or use Vim shortcuts pull from one of the LOCALBASE ad REMOTE versions.

:diffg RE  # get from REMOTE
:diffg BA # get from BASE
:diffg LO # get from LOCAL

save the changes then quit with :wqa to close all the splits. Remember to commit the merge.

$ git commit -am 'merged from several branches'

Resolving conflict from a git pull

If you were trying to do a git pull when you ran into merge conflicts, follow all steps in the previous section for using the mergetool, then do:

$ git rebase –continue

This command will

Forward-port local commits to the updated upstream HEAD.

according to the documentation, meaning your local commits will be pushed to the upstream remote branch as a new forward commit that doesn't interfere with previous commits. Hooray now you can claim that you can collaborate with others with Git without messing up with your collaborators' commits.

back to top

Other vimdiff keyboard shortcuts

]c - Jump to the next change.
[c - Jump to the previous change.

ref

Other great references and tutorials

back to top

Git_mergetool_tutorial(转载)的更多相关文章

  1. Crystal Clear Applied: The Seven Properties of Running an Agile Project (转载)

    作者Alistair Cockburn, Crystal Clear的7个成功要素,写得挺好. 敏捷方法的关注点,大家可以参考,太激动所以转载了. 原文:http://www.informit.com ...

  2. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

  3. 《Walking the callstack(转载)》

    本文转载自:https://www.codeproject.com/articles/11132/walking-the-callstack Download demo project with so ...

  4. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

  5. [转载]:STM32为什么必须先配置时钟再配置GPIO

    转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...

  6. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作

    从MyEclipse转战到IntelliJ IDEA的经历 注转载址:http://blog.csdn.net/luoweifu/article/details/13985835 我一个朋友写了一篇“ ...

  7. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

  8. 在CentOS 7/6.5/6.4 中安装Java JDK 8(转载)

    转载在CentOS 7/6.5/6.4 中安装Java JDK 8 首先,在你的服务器上运行一下更新. yum update 然后,在您的系统上搜索,任何版本的已安装的JDK组件. rpm -qa | ...

  9. 用C#实现MD5的加密(转载)

    方法一 首先,先简单介绍一下MD5 MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer scien ...

随机推荐

  1. robotframework 获取坐标

    Get Horizontal Position  获取X轴坐标 Get Vertical Position      获取Y轴坐标 Get Element Size          获取整个图表的高 ...

  2. nodejs基础一

    Node.js是一个基于Chrome V8引擎的JavaScript运行. js的运行环境 运行js有两种: .js文件方式 交互(REPL): node  回车进入交互模式 .exit 退出交互模式 ...

  3. css-滚动条常用的样式修改

    // ::-webkit-scrollbar { /*滚动条整体样式*/// width: 10px; /*宽分别对应竖滚动条的尺寸*/// height: 5px; /*高分别对应横滚动条的尺寸*/ ...

  4. 【Python之路】特别篇--Redis

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库 随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发 ...

  5. Hibernate 5 Maven 仓库的 Artifacts

    Hibernate artifacts 官方发布的仓库在 JBoss Maven repository 中.Hibernate 发布的 artifacts 也会同时同步到 Maven Central ...

  6. 一篇不错的BIO, NIO文章

    菜菜的我硬是读了2个小时, 哭了 BIO到NIO源码的一些事儿之BIO https://juejin.im/post/5c2cc075f265da611037298e#heading-3 整体上 BI ...

  7. sh_16_字符串判断方法

    sh_16_字符串判断方法 # 1. 判断空白字符 space_str = " \t\n\r" print(space_str.isspace()) # 2. 判断字符串中是否只包 ...

  8. 推荐系统系列(四):PNN理论与实践

    背景 上一篇文章介绍了FNN [2],在FM的基础上引入了DNN对特征进行高阶组合提高模型表现.但FNN并不是完美的,针对FNN的缺点上交与UCL于2016年联合提出一种新的改进模型PNN(Produ ...

  9. nagios监控部署

    nagios监控部署. 在部署之前把依赖包安装了. [root@tiandong63 ~]# yum install -y gcc glibc glibc-common php gd gd-devel ...

  10. sublime tab转4个空格配置

    打开Sublime Text3,选择菜单Preferences->Settings-User,打开用户配置文件 然后在大括号里加上下面两行代码: "tab_size": 4, ...