花美男为中国互联网事业而奋斗

git mergetool解决冲突

来源:未知 阅读(0)次 评论(0)

      在实际开发中,我们会遇到一种情况,比如:同一个文件你修改了,另一个人也修改了,这个时候就很容易产生冲突。今天就带领大家到一个真实的开发项目中,一起来学习冲突的产生原因和怎么高效的解决冲突。

      今天要学习的git命令主要有以下几种:git pull --rebasegit mergetoolgit rebase

一、故障重现 - 冲突的产生

  1. 比如,A同事和B同事同时(可理解为他们pull的是相同的代码)pull仓库里的代码

  2. 接着,A同事先修改了readme.md,准备提交到线上仓库,先git pull --rebase(把自己commit合并到线上commit里),接着push到线上仓库;

  3. B同事也修改的readme.md,按照A同事的套路先git pull --rebase,这里尴尬的一幕发生了

$ git pull --rebase
Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.

这就是我们所说的“冲突”,即:同一处代码被你和其它人都修改了。

二、解决问题

解决冲突有两种方法:一种是,手动合并(这么做费时费力,还容易出错);另一种是,借助冲突处理工具,接下来我们着重介绍第二种方法:

$ git mergetool
Merging:
readme.md

Normal merge conflict for 'readme.md':
  {local}: created file
  {remote}: created file
warning: LF will be replaced by CRLF in readme.md.
The file will have its original line endings in your working directory.

在使用git mergetool之前,你先配置好mergetool,这里个人推荐使用 Meld (这货贼拉好用,你会上瘾的)

  1. 首先,到官网下载并安装 Meld

  2. 安装完后,在终端执行 git config --edit --global ,此时会打开一个 .gitconfig 配置文件。增加下面内容

[merge]
    tool = meld
[mergetool "meld"] 
    path = D:/meld/Meld.exe

注意:path请正确配置你的meld安装目录。

20170427235524.jpg

中间是我们最终要保留的内容,处理好后保存。

现在我们再次执行以下命令来看一下,是否所以冲突都解决了

git mergetool
No files need merging

当看到上面信息时,说明所有冲突都解决了呢。

接下来看一下git 状态:

$ git status
rebase in progress; onto 21e77bd
You are currently rebasing branch 'master' on '21e77bd'.
  (all conflicts fixed: run "git rebase --continue")

Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        modified:   readme.md

Untracked files:
  (use "git add ..." to include in what will be committed)

        readme.md.orig

这里我们看到产生了一些以 .orig 为后缀的文件,果断删除这些文件,再次查看git状态:

$ git status
rebase in progress; onto 21e77bd
You are currently rebasing branch 'master' on '21e77bd'.
  (all conflicts fixed: run "git rebase --continue")

Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        modified:   readme.md

提示我们,如果所以冲突后执行 下面命令

$ git rebase --continue
Applying: init repository
Applying: Mod:readme.md
Using index info to reconstruct a base tree...
M       readme.md
Falling back to patching base and 3-way merge...
No changes -- Patch already applied.

接着,我们再来看一下git 状态

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working tree clean

这样就解决了问题了


总结:使用git mergetool快速解决冲突,需要先配置好mergetool,这里推荐使用 meld。解决冲突后,记得查看git状态,并删除不要的文件.


标签:gitmergetoolgitk
上一篇:git tool - gitk 下一篇:git diff

相关推荐