sourcetree解决代码冲突

更新日期: 2021-07-26阅读: 4.8k标签: 冲突

 虽然在团队协作开发中强调尽量避免操作同一文件,以避免冲突,但是在实际开发中还是会遇到冲突,所以掌握解决冲突的方法必不可少。冲突一般是由于两个人同时修改同一文件而造成的。


构造冲突

A 修改了conflict.file 中第1行内容并且提交到git上

B 这个时候也修改了confilct.file中第一行内容准备提交,这个时候git就会提示

To git@192.168.x.xxx:xxx/server-aggregator.git
! [rejected] develop -> develop (fetch first)
error: failed to push some refs to 'git@192.168.xx.xx:xxx/server-aggregator.git'

hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

提示远程已经有更新了,本地版本太低,让我们先pull拉取最新的代码,我们继续拉取代码pull一下,这个时候由于本地有修改这个文件,就会在本地产生冲突文件。

(当本地有待提交的修改而又有需要拉去的内容时,直接拉取会产生冲突,需要先提交本地修改后再拉去)


配置外部比较工具

可以启动三方比对工具,在sourceTree上绑定一个三方的beyonCompare对比工具,对比修改远程仓库和本地的。采用可视化SourceTree插件beyondCompare更加接近svn冲突比较

下载地址:http://www.scootersoftware.com/download.php

打开sourcetree->工具->选项->比较->外部差异对比合并->选择BeyondCompare


解决冲突

解决冲突的时候,操作已暂存文件,不操作未暂存文件(开始的时候,这两个区域的文件是一样的,并且都带有感叹号提示),解决的几种方式:

1.使用他人版本解决冲突,会自动将当前分支对应文档更改成他人文档内容,此时该文档从未暂存文件中去除,在已暂存文件中的提示由感叹号变成三个点;

2.使用自己版本解决冲突,则对当前分支对应文档不做任何改变,并将该文档从未暂存文件和已暂存文件中去除(因为合并过程中未对该文档做任何改动);

3.对于要自己修改冲突的文档,自行修改文档,并在修改完成后,将该文档标记为已解决,此时该文档从未暂存文件中去除,在已暂存文件中的提示由感叹号变成三个点。

4.在本地副本->右键->解决冲突->打开外部合并工具,和svn一样解决好冲突保存更改,退出即可


另外一种情况

拉取时出现如下提示:

it -c diff.mnemonicprefix=false -c core.quotepath=false pull local-server-aggregator develop
/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell:3: warning: Insecure world writable dir /usr in PATH, mode 040777
From 192.168.0.200:weitoo/server-aggregator
* branch develop -> FETCH_HEAD
Updating b0c5c94..40cef3b
error: Your local changes to the following files would be overwritten by merge:
server/conflict.file
Please, commit your changes or stash them before you can merge.
Aborting

提示需要暂存本地修改,才能拉取服务器上新的代码

点击贮存(英文版:Stash),随便起一个名字,里面存的都是距离上次服务器版本到本地修改之间的差异,千万别删掉了,合并成功无误了再删掉。

pull拉取服务器代码,这个时候,本地的代码变成了服务器上的代码

点击贮藏->应用贮藏区 ,这个时候是把之前的修改合并到本地上,这个时候会提示冲突

git -c diff.mnemonicprefix=false -c core.quotepath=false stash apply stash@{0}
Auto-merging server/conflict.file
CONFLICT (content): Merge conflict in server/conflict.file

可以在sourcetree里看到有感叹号,代表冲突文件,和上面解决冲突方法类似,但是稍微不同,最左边成了远程版本,中间为远程上一个版本,最后才是本地修改。
这个是和我们操作方式有关:我们是先暂存本地修改,先拉取远程代码,这个时候local 就成了远程代码,最后我们用暂存的合并进去,remote就成了本地修改


生成了多余的.orig文件

这个是由于git自身造成的 它会解决冲突后 生成一个原来冲突的备份,我们可以去掉

git config --global mergetool.keepBackup false


退回指定版本

当文件问题无法解决,或者,出现错误的提交操作,可以在日志流中回滚到你的版本,也可以在日志中,选中选定提交版本后,将该分支的文件退回到指定的版本。


当然,在合并是你可以根据你的需要,看是否保留已经修改的文件。


写在最后

为了尽可能的避免出现文件冲突,给自己和他人增加不必要的工作量,建议:

  1. 在你决定编辑文件时,先拉取一次代码,确保服务器与本地文件版本一致
  2. 如果非必要,尽量不在直接在原文件修改,建立一个副本,修改完成后,再拉取一遍,确保该文件没有被修改,再将副本覆盖源文件,提交。
  3. 如果在提交时发现文件被别人修改了,可以利用notepad++文本比较插件,解决冲突后,再覆盖提交


链接: https://fly63.com/article/detial/10333

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!