git 利用meld解决冲突与merge

Git冲突的场景与其他SCM工具一样,我在这边修改了文件a,同事也修改了文件a。同事比我先提交到仓库中,那么我pull代码时就会报错:

$ git pull
remote: Counting objects: 39, done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 39 (delta 13), reused 0 (delta 0)
Unpacking objects: 100% (39/39), done.
From https://code.csdn.net/lincyang/androidwidgetdemo
   d3b2814..5578b8c  master     -> origin/master
Updating d3b2814..5578b8c
error: Your local changes to the following files would be overwritten by merge:
    app/src/main/AndroidManifest.xml
    app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java
Please, commit your changes or stash them before you can merge.
Aborting

而此时我又不顾这个错误,将我的代码add并commit,然后push时报如下错:

To https://code.csdn.net/lincyang/androidwidgetdemo.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://code.csdn.net/lincyang/androidwidgetdemo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
  •  

然后我有执行了git pull:

$ git pull
Auto-merging app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java
CONFLICT (content): Merge conflict in app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java
Auto-merging app/src/main/AndroidManifest.xml
CONFLICT (content): Merge conflict in app/src/main/AndroidManifest.xml
Automatic merge failed; fix conflicts and then commit the result.
  •  

那么既然两个文件冲突,我就可以借助mergetool来搞定它。我安装了meld作为代码比对工具,那么它理所当然也就成为我的mergetool了。

sudo apt-get install meld

修改本地的~/.gitconfig配置文件,加入以下几行配置

[merge]
        tool = meld
	conflictstyle = diff3
[mergetool "meld"]
        cmd = meld $LOCAL $BASE $REMOTE --output=$MERGED --auto-merge

 

$ git mergetool

This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
Merging:
app/src/main/AndroidManifest.xml
app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java

Normal merge conflict for 'app/src/main/AndroidManifest.xml':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (meld): 

Normal merge conflict for 'app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (meld): 
  •  

merge完成后,执行git status发现有些文件做了修改,那么把这些文件提交 吧,就把这次commit作为一次merge操作吧。

$ git commit -m "merge"
[master 978aa1f] merge
$ git push
Counting objects: 64, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (33/33), 3.81 KiB | 0 bytes/s, done.
Total 33 (delta 15), reused 0 (delta 0)
To https://code.csdn.net/lincyang/androidwidgetdemo.git
   5578b8c..978aa1f  master -> master
$ git pull
Already up-to-date.
  •  

至此,本次冲突解决完毕。

如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:

git stash
git pull
git stash pop
  •  

 

这里比较好的方式是借助mergetool,输入
git mergetool
得到
图4,回车
出现kdiff3图形界面,其中A区为修改前,B区为本地(local)版本库修改,C区为远程版本库(remote)信息,在最下方点击右键选择需要使用的版本库,修改后保存退出即可。
这里就完成了conflict的手动合并。
之后:
git commit –m “”
git push origin master
即可。查看提交日志:
图5

可以发现最新提交是前两次提交的合并。

2. 树合并(不同成员对同一文件重命名)

关于树冲突,出现的原因是因为同时对一个文件进行了重命名。也可以使用mergetool修复冲突,但是更直接的方法是直接使用git rm删除想删除的文件,使用git add将需要的文件加到暂存区进而commit。

在文件合并和树合并中还有一个很有用的命令是:
git ls-files –s
可查看暂存区文件。

参考: 
http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html

http://blog.csdn.net/lincyang/article/details/45269491

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000

http://blog.csdn.net/u012150179/article/details/14047183

 

转载于:https://my.oschina.net/quanpower/blog/1503340

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用git merge命令进行合并时,如果发生冲突,需要解决这些冲突以完成合并。解决冲突的过程通常包括以下步骤: 1. 运行git merge命令后,如果发生冲突Git会将冲突的文件标记为未解决状态,并在文件中显示冲突的部分。 2. 打开冲突的文件,你会看到类似于以下的标记: ``` <<<<<<< HEAD 本地修改内容 ======= 远程修改内容 >>>>>>> commit-id ``` 这些标记将冲突的部分分成两个部分,上面是你本地的修改,下面是远程的修改。 3. 根据需要修改冲突的部分。你可以选择保留本地的修改,或者使用远程的修改,也可以自行修改为你想要的结果。 4. 保存文件后,将其标记为已解决状态。可以使用以下命令将已解决的文件添加到暂存区: ``` git add <filename> ``` 5. 解决所有冲突后,运行以下命令完成合并: ``` git commit -m "Merge conflict resolved" ``` 这将创建一个新的合并提交,将解决冲突后的文件保存到版本历史中。 请注意,解决冲突时,可以使用git mergetool命令来打开图形化工具,以更方便地处理冲突。你可以通过配置merge.tool变量来指定使用的图形化工具。 总结起来,要解决git merge冲突,可以按照以下步骤进行操作: 1. 查看冲突的文件并标记冲突部分; 2. 根据需要修改冲突的部分; 3. 将已解决的文件添加到暂存区; 4. 运行git commit命令完成合并。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [git权威指南总结七:git merge冲突解决](https://blog.csdn.net/qq_40999917/article/details/102481781)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值