### NOTE: ### This file covers the state of Subversion trunk as of about r34285. ### It may not be 100% applicable to future versions if not updated. Resolution recipes for tree conflict use cases 1 to 6 (see use-cases.txt and detection.txt), for files and directories. In practice, users will likely run into more complex scenarios than presented here (e.g. moved files and directories are not considered below). However, the examples below show that all these use cases are principally resolvable. === Use case 1, files Conflict reported: $ svn status D C alpha $ svn info alpha [...] Tree conflict: The update attempted to edit 'alpha'. You have deleted 'alpha' locally. Maybe you renamed it? Possible resolutions: 1) restore alpha, apply modification 2) leave alpha deleted --- Resolution 1) $ svn revert alpha Reverted 'alpha' ### revert has cleared tree-conflicted status: $ svn status alpha ### alpha is now at r2 again: $ svn info alpha | grep Revision Revision: 2 $ cat alpha alpha $ svn diff -c3 ^/trunk/alpha Index: alpha =================================================================== --- alpha (revision 2) +++ alpha (revision 3) @@ -1 +1 @@ -alpha +alpha, modified $ svn update U alpha Updated to revision 3. $ cat alpha alpha, modified --- Resolution 2) $ svn status alpha D C alpha $ svn resolved alpha Resolved conflicted state of 'alpha' $ svn status alpha D alpha === Use case 1, directories Conflict reported: $ svn status D C gamma D gamma/delta $ svn info gamma [...] Tree conflict: The update attempted to edit 'gamma'. You have deleted 'gamma' locally. Maybe you renamed it? ### In this case, the modification made to the directory gamma ### was a modification to the file gamma/delta. This is why ### resolution recipes below sometimes operate on gamma/delta. Possible resolutions: 1) restore gamma, apply modification 2) leave gamma deleted --- Resolution 1) $ svn revert gamma/delta Reverted 'gamma/delta' $ svn status $ cat gamma/delta delta $ svn info gamma/delta | grep Revision Revision: 2 $ svn update U gamma/delta Updated to revision 3. -- Resolution 2) $ svn status D C gamma D gamma/delta $ svn resolved gamma Resolved conflicted state of 'gamma' $ svn status D gamma D gamma/delta === Use case 2, files Conflict reported: $ svn status M C alpha $ svn info alpha [...] Tree conflict: The update attempted to delete 'alpha', or attempted to rename it. You have edited 'alpha' locally. Possible resolutions: 1) Leave alpha in place, with local modifications. 2) Remove alpha including local modifications. -- Resolution 1) $ svn resolved alpha Resolved conflicted state of 'alpha' $ svn status M alpha -- Resolution 2) $ svn remove --force alpha D alpha $ svn status alpha D C alpha $ svn resolved alpha Resolved conflicted state of 'alpha' $ svn status alpha D alpha === Use case 2, directories Conflict reported: $ svn status C gamma A gamma/iota $ svn info gamma [...] Tree conflict: The update attempted to delete 'gamma', or attempted to rename it. You have edited 'gamma' locally. Possible resolutions: 1) Leave gamma in place, with local modifications. 2) Remove gamma including local modifications. --- Resolution 1) $ svn resolved gamma Resolved conflicted state of 'gamma' $ svn status A gamma/iota --- Resolution 2) $ svn remove --force gamma D gamma/delta D gamma/iota D gamma $ svn status D C gamma D gamma/delta $ svn resolved gamma Resolved conflicted state of 'gamma' $ svn status D gamma D gamma/delta === Use case 3, files Conflict reported: $ svn status D C alpha $ svn info alpha [...] Tree conflict: The update attempted to delete 'alpha', or attempted to rename it. You have deleted 'alpha' locally. Maybe you renamed it? Possible resolutions: 1) Leave alpha deleted. (Not shown below): If alpha was renamed on both sides, figure out the conflicting move target paths and decide where alpha should be moved to, and delete the undesired move target path before committing. If alpha was only renamed on one side, decide whether the file at the move target path should be deleted or not. --- Resolution 1): $ svn resolved alpha Resolved conflicted state of 'alpha' $ svn status D alpha ### Additional steps may be needed here in case alpha was renamed, see above. === Use case 3, directories Conflict reported: $ svn status D C gamma D gamma/delta $ svn info gamma [...] The update attempted to delete 'gamma', or attempted to rename it. You have deleted 'gamma' locally. Maybe you renamed it? Possible resolutions: 1) Leave gamma deleted. (Not shown below): If gamma was renamed on both sides, figure out the conflicting move target paths and decide where gamma should be moved to, and delete the undesired move target path before committing. If gamma was only renamed on one side, decide whether the directory at the move target path should be deleted or not. --- Resolution 1): $ svn resolved gamma Resolved conflicted state of 'gamma' $ svn status D gamma D gamma/delta ### Additional steps may be needed here in case gamma was renamed, see above. === Use case 4, files Conflict reported: $ svn status M . ! C alpha $ svn info alpha Path: alpha Name: alpha Node Kind: none Tree conflict: The merge attempted to edit 'alpha'. 'alpha' does not exist locally. Maybe you renamed it? Or has it been renamed in the history of the branch you are merging into? Possible resolutions: 1) Ignore incoming edit. 2) Restore alpha in branch and run merge again. (Not shown below:) In case alpha was renamed, rename alpha in the branch and run the merge again. --- Resolution 1) $ svn resolved alpha Resolved conflicted state of 'alpha' $ svn status M . # mergeinfo --- Resolution 2) ### revert merge to start from clean state, this also removes ### tree conflict markers: $ svn revert -R . Reverted '.' Reverted 'alpha' $ svn status ### find out when alpha was deleted on branch: $ svn log -r4 ^/branch ------------------------------------------------------------------------ r4 | stsp | 2008-11-20 14:43:21 +0000 (Thu, 20 Nov 2008) | 1 line deleted alpha ------------------------------------------------------------------------ ### alpha was deleted in r4, restore alpha from r3: $ svn copy ^/branch/alpha@3 . A alpha ### run the merge again, it succeeds: $ svn merge ^/trunk --- Merging r2 through r4 into '.': U alpha $ svn status M . A + alpha == Use case 4, directories Conflict reported: $ svn status M . ! C gamma $ svn info gamma Path: gamma Name: gamma Node Kind: none Tree conflict: The merge attempted to edit 'gamma'. You have deleted 'gamma' locally. Maybe you renamed it? Possible resolutions: 1) Ignore incoming edit. 2) Restore gamma in branch and run merge again. (Not shown below:) In case gamma was renamed, rename gamma in the branch and run the merge again. -- Resolution 1) $ svn resolved gamma Resolved conflicted state of 'gamma' $ svn status M . # mergeinfo --- Resolution 2) ### revert merge to start from clean state, this also removes ### tree conflict markers: $ svn revert -R . Reverted '.' Reverted 'gamma' $ svn status ### find out when gamma was deleted on branch: $ svn log -r4 ^/branch ------------------------------------------------------------------------ r4 | stsp | 2008-11-20 15:02:08 +0000 (Thu, 20 Nov 2008) | 1 line deleted gamma ------------------------------------------------------------------------ ### gamma was deleted in r4, restore gamma from r3: $ svn copy ^/branch/gamma@3 . A gamma/delta Checked out revision 3. A gamma ### run the merge again, it succeeds: $ svn merge ^/trunk --- Merging r2 through r4 into '.': A gamma/iota == Use case 5, files Conflict reported: $ svn status M . M C alpha $ svn info alpha [...] Tree conflict: The merge attempted to delete 'alpha', or attempted to rename it. Either you have edited 'alpha' locally, or it has been edited in the history of the branch you are merging into, but those edits are not present on the branch you are merging from. Possible resolutions: 1) Keep alpha with local modifications. 2) Delete alpha. (Not shown below:) If alpha was renamed, determine move target path and apply local modifications there first. -- Resolution 1) $ svn resolved alpha Resolved conflicted state of 'alpha' $ svn status alpha M alpha -- Resolution 2) $ svn status M . M C alpha ### If alpha was renamed, additional steps may be needed here ### to transfer local modifications to the new location. $ svn remove --force alpha D alpha $ svn status M . D C alpha $ svn resolved alpha Resolved conflicted state of 'alpha' $ svn status M . D alpha == Use case 5, directories Conflict is not detected automatically. Check merge result manually for this conflict. === Use case 6, files Conflict reported: $ svn status M . ! C alpha $ svn info alpha Path: alpha Name: alpha Node Kind: none Tree conflict: The merge attempted to delete 'alpha', or attempted to rename it. You have deleted 'alpha' locally. Maybe you renamed it? Possible resolutions: 1) Delete alpha (Not shown below:) If alpha was renamed on both sides, figure out the conflicting move target paths and decide where alpha should be moved to, and delete the undesired move target path before committing. If alpha was only renamed on one side, decide whether the file at the move target path should be deleted or not. --- Resolution 1) $ svn resolved alpha Resolved conflicted state of 'alpha' $ svn status M . # mergeinfo === Use case 6, directories Conflict reported: $ svn status M . ! C gamma $ svn info gamma Path: gamma Name: gamma Node Kind: none Tree conflict: The merge attempted to delete 'gamma', or attempted to rename it. You have deleted 'gamma' locally. Maybe you renamed it? Possible resolutions: 1) Delete gamma. (Not shown below:) If gamma was renamed on both sides, figure out the conflicting move target paths and decide where gamma should be moved to, and delete the undesired move target path before committing. If gamma was only renamed on one side, decide whether the file at the move target path should be deleted or not. -- Resolution 1) $ svn resolved gamma Resolved conflicted state of 'gamma' $ svn status M . # mergeinfo