5

sourcetree解决代码冲突

 2 years ago
source link: http://www.fly63.com/article/detial/10333
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
时间: 2021-07-26阅读: 1137标签: 冲突分享

扫一扫分享

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

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

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

To [email protected]:xxx/server-aggregator.git
! [rejected] develop -> develop (fetch first)
error: failed to push some refs to '[email protected]: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

退回指定版本

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

60a9c95930027.jpg

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

60a9c95dcca8c.jpg

写在最后

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

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

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/10333


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK