`

svn文件冲突,树冲突详解

 
阅读更多
解决冲突
http://blog.csdn.net/sqk1988/article/details/6926745
偶尔,当你从版本库更新、合并文件时,或者切换工作副本至一个不同的 URL 时你会遇到冲突。有两种冲突:
文件冲突
当两名(或更多)开发人员修改了同一个文件中相邻或相同的行时就会发生文件冲突。
树冲突
当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。
文件冲突
当两名或更多开发人员修改了同一个文件中相邻或相同的行时就会发生文件冲突。由于 Subversion 不知道你的项目的具体情况,它把解决冲突的工作留给了开发人员。一旦出现冲突,你就应该打开有问题的文件,查找以字符串<<<<<<<开头的行。有冲突的区域用如下的方式标记:
<<<<<<< 文件名
  你的修改
=======
  合并自版本库中的代码
>>>>>>> 版本

对于每个冲突的文件 Subversion 在你的目录下放置了三个文件:
文件名.mine
这是你的文件,在你更新你的工作副本之前存在于你的的工作副本中——也就是说,没有冲突标志。这个文件除了你的最新修改外没有别的东西。
文件名.r 版本
这是在你更新你的工作副本之前的基础版本(BASE revision)文件。也就是说,它是在你做最后修改之前所检出的文件。
文件名.r 新版本
这个文件是当你更新你的工作副本时,你的 Subversion 客户端从服务器接收到的。这个文件对应于版本库中的最新版本。
假设冲突的文件名是aa.java
你可以通过右击文件aa.java 打开菜单 TortoiseSVN →编辑冲突 打开后,编辑器会列出与版本库文件的冲突部分,你需要冲定哪些代码是需要的,做一些必要的修改然后保存。
当我们再打开aa.java时,里面的<<<<< 符号便消除了,这标志着冲突已经解决了。
然后,执行菜单 TortoiseSVN →已解决的...,此时便可以提交了。需要注意的是“已解决...”并不是真正的解决了冲突,它只是删除了filename.ext.mine和filename.ext.r*两个文件,允许你提交修改。如果刚开始就执行“已解决的”,文件便可以提交,但是aa.java中的冲突依然没有解决,内容还是
<<<<<<< 文件名
  你的修改
=======
  合并自版本库中的代码
>>>>>>> 版本

所以在这之前一定要 打开菜单 TortoiseSVN →编辑冲突 把冲突解决了再点击 “已解决”
如果你的二进制文件有冲突,Subversion不会试图合并文件。本地文件保持不变(完全是你最后修改时的样子),但你会看到filename.ext.r*文件。如果你要撤消你的修改,保留版本库中的版本,请使用还原(Revert)命令。如果你要保持你的版本覆盖版本库中的版本,使用已解决命令,然后提交你的版本。
你可以右击父文件夹,选择TortoiseSVN → 已解决...,使用“已解决”命令来解决多个文件。这个操作会出现一个对话框,列出文件夹下所有有冲突的文件,你可以选择将哪些标记成已解决。
树冲突
当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。有很多种不同的情形可以导致树冲突,而且不同的情形需要不同的步骤来解决冲突。
当一个文件通过 Subversion 在本机删除后,文件也从本机文件系统中删除。因此即使它是树冲突的一部分,却既不能显示冲突的叠加图标也不能通过右键单击来解决冲突。使用检查修改对话框来获得编辑冲突选项。
TortoiseSVN 能够协助找到合并更改的正确位置,但是需要作一些额外的工作来整理冲突。请牢记: 当进行一次更新操作后,工作副本的基础文件将会包括每一个项目在执行更新操作时版本库中的版本。如果你在进行更新后再撤销更改,工作副本将返回到版本库的状态,而不是你开始进行更改前的状态。
本地删除,当更新时有更改进入
开发人员 A 修改 Foo.c 并将其提交至版本库中
开发人员 B 同时在他的工作副本中将文件 Foo.c 改名为Bar.c,或者仅仅是删除了Foo.c 或它的父文件夹。
更新开发人员 B 的工作副本会导致树冲突:
在工作副本中,Foo.c 被删除了,但是被标记为树冲突。
如果冲突是由于更改文件名引起的而不是删除文件引起的,那么 Bar.c 被标记为添加,但是其中却不包括开发人员 A 修改的内容。
开发人员 B 现在必须做出选择是否保留开发人员 A 的更改。在更改文件名的案例中,他可以将 Foo.c 的更改合并到改名后的文件Bar.c 中去。对于删除文件或文件夹的案例中,他可以选择保留包含开发人员 A 更改内容的项目并放弃删除操作。或什么也不做而直接将冲突标记为已解决,那样他实际上丢弃了开发人员 A 的更改。
如果 TortoiseSVN 能够找到被改名为 Bar.c 的原始文件,冲突编辑对话框将可以合并更改。这取决于在什么地方调用更新操作,它也许不能找到原始文件。
本地更改,当更新时有删除进入
开发人员 A 将文件 Foo.c 改名为Bar.c 并将其提交至版本库中。
开发人员 B 在他的工作副本中修改文件 Foo.c。
或者在一个文件夹改名的案例中...
开发人员 A 将父文件夹 FooFolder 改名为BarFolder 并将其提交至版本库中。
开发人员 B 在他的工作副本中修改文件 Foo.c。
更新开发人员 B 的工作副本会导致树冲突。对于一个简单的文件冲突:
Bar.c 被当作一个正常文件添加到工作副本中。
Foo.c 被标记为添加(包括其历史记录)并且产生树冲突。
对于一个文件夹冲突:
BarFolder 被当作一个正常文件夹添加到工作副本中。
FooFolder 被标记为添加(包括其历史记录)并且产生树冲突。
Foo.c 被标记为已修改。
开发人员 B 现在需要做出决定是否接受开发人员 A 作出的结构改变并且合并她的更改到新结构下适当的文件中,或者直接放弃开发人员 A 的更改并保留本地文件。
要合并她的本机更改到新布局中,开发人员 B 必须先找出冲突的文件 Foo.c 经过改名/移动后在版本库中的新文件名是什么。可以使用日志对话框来完成这个任务。更改必须要手工合并,因为没有办法自动的或者简单的完成此操作。一旦更改移植完毕,冲突的路径就是多余的并且可以删除。在此案例中,使用冲突编辑对话框中的删除按钮进行清理并将冲突标记为已解决。
如果开发人员 B 认为 A 的更改是错误的,那么在冲突编辑对话框中她必须选择保留按钮。这样就会标记冲突的文件/文件夹为已解决,但是需要手工删除开发人员 A 的更改。又是通过日志对话框帮助追踪哪些文件移动了。
本地删除,当更新时有删除进入
开发人员 A 将文件 Foo.c 改名为Bar.c 并将其提交至版本库中。
开发人员 B 将文件 Foo.c 改名为Bix.c
更新开发人员 B 的工作副本会导致树冲突:
Bix.c 被标记为添加(包括其历史记录)。
Bar.c 被添加到工作副本中,其状态为‘正常’。
Foo.c 被标记为删除并且产生一个树冲突。
要解决这个冲突,开发人员 B 必须找出冲突的文件 Foo.c 经过改名/移动后在版本库中的新文件名是什么。可以使用日志对话框来完成这个任务。
然后,开发人员 B 需要决定 Foo.c 的新文件名中的哪一个需要保留 - 开发人员 A 改的那个还是他自己改的那个。
在开发人员 B 手工解决冲突后,使用冲突编辑对话框中的按钮将树冲突标记为已解决。
本地缺少,当合并时有更改进入
开发人员 A 在主干上工作,修改 Foo.c 并将其提交至版本库中
开发人员 B 在分支上工作,将 Foo.c 改名为Bar.c 并将其提交至版本库中
合并开发人员 A 的主干更改到开发人员 B 的分支工作副本会导致树冲突:
Bar.c 已经存在于工作副本中,其状态为‘正常’。
Foo.c 被标记为缺少并产生树冲突。
要解决这个冲突,开发人员 B 要在冲突编辑对话框中标记文件为已解决,这样就会将其从冲突列表中删除。她接下来需要决定是否将缺少的文件 Foo.c 从版本库中复制到工作副本中,是否将开发人员 A 的对 Foo.c 的更改和合并到改名后的 Bar.c 或者是否通过标记冲突为已解决来忽略更改什么事也不做。
注意,如果你将缺少的文件从版本库中复制到工作副本中然后再标记为已解决,你复制下来的文件将被再次删除。你必须先解决冲突。
本地更改,当合并时有删除进入
开发人员 A 在主干上工作,将 Foo.c 改名为Bar.c 并将其提交至版本库中
开发人员 B 在分支上工作,修改 Foo.c 并将其提交至版本库中
当文件夹改名时有类似的案例,但是在 Subversion 1.6 中还未被识别...
开发人员 A 在主干上工作,将父文件夹 FooFolder 改名为BarFolder 并将其提交至版本库中。
开发人员 B 在分支上工作,在她的工作副本中修改 Foo.c 。
合并开发人员 A 的主干更改到开发人员 B 的分支工作副本会导致树冲突:
Bar.c 被标记为添加。
Foo.c 被标记为修改并产生树冲突。
开发人员 B 现在需要做出决定是否接受开发人员 A 作出的结构改变并且合并她的更改到新结构下适当的文件中,或者直接放弃开发人员 A 的更改并保留本地文件。
要合并她的本机更改到新布局中,开发人员 B 必须先找出冲突的文件 Foo.c 经过改名/移动后在版本库中的新文件名是什么。可以通过适用于合并源码的日志对话框来完成这个任务。冲突编辑器仅显示工作副本的日志因为它不知道将哪个路径的更改合并进来,所以你需要自己找到它。更改必须要手工合并,因为没有办法自动的或者简单的完成此操作。一旦更改移植完毕,冲突的路径就是多余的并且可以删除。在此案例中,使用冲突编辑对话框中的删除按钮进行清理并将冲突标记为已解决。
如果开发人员 B 认为 A 的更改是错误的,那么在冲突编辑对话框中她必须选择保留按钮。这样就会标记冲突的文件/文件夹为已解决,但是需要手工删除开发人员 A 的更改。又是通过日志对话框帮助追踪哪些文件移动了。
本地删除,当合并时有删除进入
开发人员 A 在主干上工作,将 Foo.c 改名为Bar.c 并将其提交至版本库中
开发人员 B 工作在分之上,将 Foo.c 改名为Bix.c 并将其提交至版本库中
合并开发人员 A 的主干更改到开发人员 B 的分支工作副本会导致树冲突:
Bix.c 被标记为正常(未修改)状态。
Bar.c 被标记为添加(包括其历史记录)。
Foo.c 被标记为缺少并且产生树冲突。
要解决这个冲突,开发人员 B 必须先找出冲突的文件 Foo.c 经过改名/移动后在版本库中的新文件名是什么。可以通过适用于合并源码的日志对话框来完成这个任务。冲突编辑器仅显示工作副本的日志因为它不知道将哪个路径的更改合并进来,所以你需要自己找到它。
然后,开发人员 B 需要决定 Foo.c 的新文件名中的哪一个需要保留 - 开发人员 A 改的那个还是他自己改的那个。
在开发人员 B 手工解决冲突后,使用冲突编辑对话框中的按钮将树冲突标记为已解决。
关于我的解决方法
本人遇到这个问题,不管怎么样都无法删除。最后只得删除本地的所有文件,重新更新库。然后再删除想要删除的文件,最后提交。不在出现这个问题了。
SVN防止冲突的方法:
①尽量将分成多个类,每个人负责一些类的开发
② 每天都要更新
SVN使用说明:
更新功能:
当前我正在编辑一个java文件,如果此时我更新整个工程,当前编辑的会被覆盖吗?
答案是否定的。
分享到:
评论

相关推荐

    开源版本控制SVN 树冲突、目录丢失问题及解决机制探讨

    **版本控制系统SVN详解与树冲突、目录丢失问题解析** 版本控制系统Subversion(简称SVN)是一种用于管理软件源代码的工具,它允许开发者在不同的时间点保存项目的状态,以便于回溯、合并和协作。当多人同时编辑同一...

    svn 合并、冲突及常用功能详解

    **svn冲突** 1. **冲突产生**: 当两个或更多用户修改了同一份文件的同一部分时,svn无法确定应保留哪个更改,就会产生冲突。 2. **冲突标记**: 有冲突的文件会被svn添加特殊的冲突标记,例如`, `=======`, `&gt;&gt;&gt;&gt;&gt;&gt;...

    SVN版本冲突解决详解

    SVN 版本冲突解决详解 SVN 版本冲突是指在多个用户同时修改同一个文件时,可能会出现的冲突问题。下面将详细解释 SVN 版本冲突的原因、现象、解决方法和降低冲突解决的复杂度。 版本冲突原因: 在 SVN 中,当多个...

    Tortoise SVN 版本冲突处理

    ### Tortoise SVN 版本冲突处理详解 在软件开发项目中,版本控制是不可或缺的一环,它帮助团队成员管理代码的变更,确保项目的稳定性和可追溯性。Tortoise SVN作为一款优秀的图形化Subversion(SVN)客户端,广泛...

    svn ( 解决冲突 )confict

    ### SVN解决冲突详解 #### 一、冲突发生的原因 在版本控制系统中,Subversion(简称SVN)是一种广泛使用的集中式版本控制系统。当多个开发者同时对同一个文件进行修改时,可能会遇到冲突的情况。例如,假设团队中...

    SVN文件解锁

    ### SVN文件解锁详解 在软件开发过程中,使用版本控制系统(如Subversion,简称SVN)进行代码管理是非常常见的。然而,在使用过程中可能会遇到文件被锁定的情况,这将阻止其他开发者对该文件进行修改或提交。本文将...

    MyEclipse SVN配置文件

    【MyEclipse SVN配置文件详解】 在软件开发过程中,版本控制系统是不可或缺的工具,Subversion(SVN)作为其中的一员,被广泛应用于协同开发和代码管理。MyEclipse,一个强大的Java集成开发环境,集成了SVN插件,...

    svn 命令详解

    ### SVN 命令详解 #### 一、将文件checkout到本地目录 - **命令格式**:`svn checkout &lt;path&gt; (path是服务器上的目录)` - **示例**:`svn checkout svn://192.168.1.1/pro/domain` - **简写**:`svn co` **解释*...

    SVN版本控制工具使用详解

    SVN版本控制工具使用详解 SVN(Subversion)是一种自由开源的版本控制系统,可以将代码恢复到早期版本,或者检查数据修改的历史,这些数据可以是源代码,也可以是其他类型的文件。其功能包括根据文件修改的次数自动...

    SVN创建、合并与切换分支操作详解

    Subversion(SVN)是一种广泛使用的版本控制系统,用于管理软件项目的源代码和其他文件。它允许开发者协同工作,跟踪代码的更改历史,并通过分支和标签功能支持灵活的开发流程。以下是对SVN创建、合并和切换分支操作...

    window搭建SVN服务器详解

    在Windows环境下搭建SVN(Subversion)服务器是一个常见的任务,尤其对于软件开发团队而言,它是一种重要的版本控制系统,用于管理代码和其他项目文件的历史版本。本文将深入讲解如何在Windows上设置一个功能齐全的...

    SVN版本管理详解-08210246.pdf

    Subversion(SVN)是一个版本控制系统,它用于管理文件和目录的变化。SVN是CVS(Concurrent Versions System)的后继者,并且它是一个开源的软件版本管理工具,被广泛用于软件开发中以协助代码的版本控制。它在管理...

    SVN 的使用方法详解

    通过SVN,用户可以记录项目的历史版本,便于恢复旧版本、管理多人协作开发时的代码冲突,以及实现团队间的文件同步。 TortoiseSVN是SVN的一个图形化客户端,专为Windows用户设计。它的安装过程包括: 1. 访问...

    SVN 分支与合并详解

    SVN会在冲突文件中插入特殊的冲突标记,如`, `=======`, `&gt;&gt;&gt;&gt;&gt;&gt;&gt;`,用户需根据实际情况手动编辑文件以解决冲突。解决冲突后,使用`svn resolved`标记文件已解决冲突,最后提交更新。 6. 使用标签(Tag): 除了...

    svn修改

    ### SVN用户名及密码修改方法详解 #### 背景介绍 在使用版本控制系统Subversion (SVN) 进行项目管理时,用户可能会遇到需要更改登录凭证的情况,比如更换用户名或更新密码。SVN默认情况下并没有提供直接更换用户名...

    SVN使用SVN使用SVN使用

    当两个或更多用户同时修改同一份文件时,SVN会检测到冲突并标记出来。开发者需要手动解决这些冲突,可以选择保留自己的修改,合并对方的修改,或者完全放弃冲突部分。解决冲突后,再次提交以完成合并。 分支和标签...

    SVN教程PPT详解

    SVN,全称为Subversion,是一...其强大的特性,如无锁编辑、文件属性、自动合并冲突等,使其成为现代软件开发中的重要工具。了解和掌握SVN的使用,对于任何IT专业人士来说,都是提高工作效率和保证项目质量的关键步骤。

Global site tag (gtag.js) - Google Analytics