{"id":3741,"date":"2011-08-31T11:31:20","date_gmt":"2011-08-31T11:31:20","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/bharry\/2011\/08\/31\/merge-enhancements-in-tfs-11\/"},"modified":"2024-06-11T14:35:02","modified_gmt":"2024-06-11T21:35:02","slug":"merge-enhancements-in-tfs-11","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/bharry\/merge-enhancements-in-tfs-11\/","title":{"rendered":"Merge enhancements in TFS 11"},"content":{"rendered":"<p>Here\u2019s the next post in my series of \u201cDevelopers are raving fans\u201d enhancements coming in TFS 11.\u00a0 My last post was on <a href=\"http:\/\/blogs.msdn.com\/b\/bharry\/archive\/2011\/08\/02\/version-control-model-enhancements-in-tfs-11.aspx\">workspace improvements<\/a>.<\/p>\n<p>One of the things we consistently get customer feedback on in TFS 2010 is that merging is still too complicated and\/or too limited.\u00a0 We\u2019ve made several significant improvements in the coming release:<\/p>\n<p><strong>A new diff\/merge experience<\/strong> \u2013 The one we\u2019ve been shipping for the past 5 years is the original SourceSafe diff\/merge tools \u2013 built while we were One Tree Software circa 1994.\u00a0 It had been enhanced over the years to support globalization, Unicode, etc but it was, in essence, the same diff tool.\u00a0 Well not any more, it\u2019s gone!\u00a0 We\u2019ve built a new diff\/merge experience based on the VS editor.\u00a0 And before you say \u201cbut wait, I really love kdiff!\u201d, don\u2019t worry \u2013 it\u2019s still configurable and you can use any tool you like but the out of the box one is now WAY better.\u00a0 How is it better you say?<\/p>\n<ul>\n<li>It supports both \u201cinline\u201d and \u201cside by side\u201d modes and you can choose the one you like best.<\/li>\n<li>It has syntax highlighting (as supported in the VS editor).<\/li>\n<li>Individual changes within a line are highlighted.<\/li>\n<li>When both diffing and merging, you can edit with the full power of the VS editor, including undo, Intellisense and everything!<\/li>\n<li>Diff has a nice \u201cmini-map\u201d.<\/li>\n<li>You can now take more actions from the views (like history, etc).<\/li>\n<li>Diff uses the new provisional tab feature in VS to avoid cluttering your document well.<\/li>\n<li>An improved way of manually selecting merge resolutions.<\/li>\n<li>An interactive way of turning on\/off ignoring whitespace.<\/li>\n<\/ul>\n<p>Here are some screen shots to demonstrate.\u00a0 You can observe many of the points I made above:<\/p>\n<p>Side by side diff view in the provisional tab (all the way to the right) with a change highlighting gutter on the left, in line change highlighting, VS style class\/method navigation, syntax coloring and more.\u00a0 Yes the text with the file names above the source looks dumb \u2013 that\u2019s a bug.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2671.DiffSxS_thumb_1AA85A52.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16211\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2671.DiffSxS_thumb_1AA85A52.png\" alt=\"Image 2671 DiffSxS thumb 1AA85A52\" width=\"804\" height=\"671\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2671.DiffSxS_thumb_1AA85A52.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2671.DiffSxS_thumb_1AA85A52-300x250.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2671.DiffSxS_thumb_1AA85A52-768x641.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p>Same diff using inline mode:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7558.DiffInline_thumb_40FA17D0.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16212\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7558.DiffInline_thumb_40FA17D0.png\" alt=\"Image 7558 DiffInline thumb 40FA17D0\" width=\"804\" height=\"671\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7558.DiffInline_thumb_40FA17D0.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7558.DiffInline_thumb_40FA17D0-300x250.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7558.DiffInline_thumb_40FA17D0-768x641.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p>And here are some screenshots of the merge experience.\u00a0 I\u2019ve included all three of the views you can choose from:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.MergeTool_thumb_15F203FE.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16214\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.MergeTool_thumb_15F203FE.png\" alt=\"Image 4747 MergeTool thumb 15F203FE\" width=\"804\" height=\"644\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.MergeTool_thumb_15F203FE.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.MergeTool_thumb_15F203FE-300x240.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.MergeTool_thumb_15F203FE-768x615.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/6888.MergeTool2_thumb_3317AC08.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16215\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/6888.MergeTool2_thumb_3317AC08.png\" alt=\"Image 6888 MergeTool2 thumb 3317AC08\" width=\"804\" height=\"617\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/6888.MergeTool2_thumb_3317AC08.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/6888.MergeTool2_thumb_3317AC08-300x230.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/6888.MergeTool2_thumb_3317AC08-768x589.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7080.MergeTool3_thumb_24F8BD0B.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16216\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7080.MergeTool3_thumb_24F8BD0B.png\" alt=\"Image 7080 MergeTool3 thumb 24F8BD0B\" width=\"804\" height=\"617\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7080.MergeTool3_thumb_24F8BD0B.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7080.MergeTool3_thumb_24F8BD0B-300x230.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7080.MergeTool3_thumb_24F8BD0B-768x589.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p>Overall, it\u2019s a much better default diff and merge experience than we\u2019ve had before!<\/p>\n<p><strong>Minimal conflicts when merging <\/strong>\u2013 Probably the biggest complaint that we hear about merging is that it\u2019s way too cumbersome.\u00a0 We spent a bunch of time trying to get to the bottom of this feedback and concluded that the primary issue is that when you do a merge, you get way too many reported conflicts that actually don\u2019t require you to make meaningful decisions.\u00a0 People want it to just \u201chandle\u201d all the obvious merge cases and only draw their attention to places where they have real work to do.<\/p>\n<p>To demonstrate the difference between TFS 2010 and TFS 11, I have run a sample scenario.\u00a0 It\u2019s simple and contrived but it demonstrates the difference.\u00a0 I took a big folder full of TFS source code and branched it.\u00a0 I then global renames of two methods in the two branches and merged the results.\u00a0 The result was 48 files changed in the source branch and 90 files changed in the destination branch.\u00a0 The resulting reported con\nflicts were:<\/p>\n<ul>\n<li>TFS 2010: 38 conflicts<\/li>\n<li>TFS 11: 12 conflicts<\/li>\n<\/ul>\n<p>The difference is that TFS 11 automatically resolved 26 of the conflicts without requiring user interaction.<\/p>\n<p>I always hear that Git is the \u201cgold standard\u201d for this behavior.\u00a0 So, we did a head-to-head comparison between Git and TFS merge behavior and we found that the change necessary to our code to get pretty close to the Git experience was actually pretty small.\u00a0 So I did a head-to-head to compare the new TFS merge behavior to Git.\u00a0 I\u2019m not going to claim that it\u2019s an exhaustive test or that I caught everything but I believe it covers most of the common scenarios and, when you get your hands on it, if you find anything we missed, please let me know.<\/p>\n<p>For this scenario, I wanted to compare the behavior with different kinds of conflicts.\u00a0 I created a folder with 9 files in it, branched it and then arranged a specific pattern of changes to evoke conflicts.\u00a0 Here are the changes:<\/p>\n<table border=\"0\" width=\"698\" cellspacing=\"0\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"55\">File<\/td>\n<td valign=\"top\" width=\"106\">Source change<\/td>\n<td valign=\"top\" width=\"129\">Destination change<\/td>\n<td valign=\"top\" width=\"406\">Comment<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file1.txt<\/td>\n<td valign=\"top\" width=\"106\">unchanged<\/td>\n<td valign=\"top\" width=\"129\">unchanged<\/td>\n<td valign=\"top\" width=\"406\">Trivial case, nothing to merge and nothing in the destination<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file2.txt<\/td>\n<td valign=\"top\" width=\"106\">edit line 3<\/td>\n<td valign=\"top\" width=\"129\">unchanged<\/td>\n<td valign=\"top\" width=\"406\">Just merge the change into the destination<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file3.txt<\/td>\n<td valign=\"top\" width=\"106\">unchanged<\/td>\n<td valign=\"top\" width=\"129\">edit line 3<\/td>\n<td valign=\"top\" width=\"406\">Nothing to merge over and the change in the destination should affect it<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file4.txt<\/td>\n<td valign=\"top\" width=\"106\">edit line 3<\/td>\n<td valign=\"top\" width=\"129\">edit line 7<\/td>\n<td valign=\"top\" width=\"406\">Distinct changes in source and destination<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file5.txt<\/td>\n<td valign=\"top\" width=\"106\">edit line 5<\/td>\n<td valign=\"top\" width=\"129\">same edit line 5<\/td>\n<td valign=\"top\" width=\"406\">Same change in both files should merge well<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file6.txt<\/td>\n<td valign=\"top\" width=\"106\">edit line 5<\/td>\n<td valign=\"top\" width=\"129\">different edit line 5<\/td>\n<td valign=\"top\" width=\"406\">This is a conflict that will require user interaction to resolve<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file7.txt<\/td>\n<td valign=\"top\" width=\"106\">delete file<\/td>\n<td valign=\"top\" width=\"129\">unchanged<\/td>\n<td valign=\"top\" width=\"406\">Delete the file in the source an no changes in the destination<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file8.txt<\/td>\n<td valign=\"top\" width=\"106\">delete file<\/td>\n<td valign=\"top\" width=\"129\">edit line 5<\/td>\n<td valign=\"top\" width=\"406\">A file delete in the source conflicting with an edit in the destination<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"55\">file9.txt<\/td>\n<td valign=\"top\" width=\"106\">rename file<\/td>\n<td valign=\"top\" width=\"129\">unchanged<\/td>\n<td valign=\"top\" width=\"406\">Should not really be any conflict here<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>I then created the same scenario in TFS 2010, TFS 11 and Git and looked at the results.\u00a0 In this scenario, I used the command lines for all 3 to really show apples to apples.<\/p>\n<p>Here\u2019s the merge output for TFS 2010:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5822.image_thumb_428A980A.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16217\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5822.image_thumb_428A980A.png\" alt=\"Image 5822 image thumb 428A980A\" width=\"804\" height=\"247\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5822.image_thumb_428A980A.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5822.image_thumb_428A980A-300x92.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5822.image_thumb_428A980A-768x236.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p>Note there are 3 conflicts listed and 4 additional merges.\u00a0 files 1 and 3 didn\u2019t require any merges.\u00a0 And here\u2019s the output of tf status:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/3362.image_thumb_79F0A938.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16218\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/3362.image_thumb_79F0A938.png\" alt=\"Image 3362 image thumb 79F0A938\" width=\"804\" height=\"221\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/3362.image_thumb_79F0A938.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/3362.image_thumb_79F0A938-300x82.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/3362.image_thumb_79F0A938-768x211.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p>And we see 7 changes pended (to be expected based on what we saw in the merge output).<\/p>\n<p>Here\u2019s the merge output for Git in the same scenario:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8463.GitMergeOutput_thumb_113BADAA.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16219\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8463.GitMergeOutput_thumb_113BADAA.png\" alt=\"Image 8463 GitMergeOutput thumb 113BADAA\" width=\"804\" height=\"138\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8463.GitMergeOutput_thumb_113BADAA.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8463.GitMergeOutput_thumb_113BADAA-300x51.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8463.GitMergeOutput_thumb_113BADAA-768x132.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p>and the status output:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.GitStatus_thumb_2F39BB9E.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16220\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.GitStatus_thumb_2F39BB9E.png\" alt=\"Image 4747 GitStatus thumb 2F39BB9E\" width=\"804\" height=\"231\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.GitStatus_thumb_2F39BB9E.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.GitStatus_thumb_2F39BB9E-300x86.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/4747.GitStatus_thumb_2F39BB9E-768x221.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p>First thing to note is that Git lists only 2 conflicts \u2013 file4 is automatically resolved where it is not in TFS 2010.\u00a0 The other thing that I not\nice is that file5 doesn\u2019t show up at all (remember that\u2019s the one where identical changes were made in source and destination).\u00a0 Other than that, the merge\/conflict results are identical.\u00a0 Other things I notice is that all the wrapping in TFS\u2019s merge output makes it hard to read, the color coding in Git is nicer and including the conflict information in the status output is very nice.<\/p>\n<p>I then ran the same scenario in TFS 11:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8154.Dev11MergeOutput_thumb_5EA82A6A.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16221\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8154.Dev11MergeOutput_thumb_5EA82A6A.png\" alt=\"Image 8154 Dev11MergeOutput thumb 5EA82A6A\" width=\"804\" height=\"234\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8154.Dev11MergeOutput_thumb_5EA82A6A.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8154.Dev11MergeOutput_thumb_5EA82A6A-300x87.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/8154.Dev11MergeOutput_thumb_5EA82A6A-768x224.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7870.Dev11Status_thumb_2D78C9FD.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16222\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7870.Dev11Status_thumb_2D78C9FD.png\" alt=\"Image 7870 Dev11Status thumb 2D78C9FD\" width=\"804\" height=\"204\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7870.Dev11Status_thumb_2D78C9FD.png 804w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7870.Dev11Status_thumb_2D78C9FD-300x76.png 300w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/7870.Dev11Status_thumb_2D78C9FD-768x195.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><\/p>\n<p>Now the number of conflicts matches Git.\u00a0 We still have the difference that we list file5.txt because we way we do debit\/credit logic on merges requires that we have a pending change to recognize that the merge has happened.\u00a0 I\u2019m going to look at this more closely.\u00a0 The output is the same and I\u2019ve spoken to the team about making a few changes here that can improve readability and reduce verbosity.<\/p>\n<p>When I ran this comparison against Git, I was struck that the number of types of conflicts that we resolved differently in 2010 was not actually all that high.\u00a0 However, that doesn\u2019t take into account frequency (which is why I did the rename example first).\u00a0 The one type we didn\u2019t handle as well happens to be the most common type, so that small change has a pretty big effect on the developer experience.<\/p>\n<p><strong>Baseless merge in the UI<\/strong> \u2013 Another long standing piece of feedback is people want to be able to initiate baseless merges in the UI.\u00a0 We\u2019ve supported it in the command line for a long time but much as I said about rollback in my post on the Power Tools, for many people, if it\u2019s not in the UI, it\u2019s not in the product.\u00a0 Now it\u2019s in the UI.\u00a0 If you initiate a merge from the Source Control Explorer, the merge wizard now has a browse button that allows you to go find branches to do a baseless merge against.<\/p>\n<p>Let\u2019s look at an example.\u00a0 I started with a branch structure that looked like this:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2287.Hierarchy_thumb_64DEDB2B.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16223\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2287.Hierarchy_thumb_64DEDB2B.png\" alt=\"Image 2287 Hierarchy thumb 64DEDB2B\" width=\"484\" height=\"444\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2287.Hierarchy_thumb_64DEDB2B.png 484w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/2287.Hierarchy_thumb_64DEDB2B-300x275.png 300w\" sizes=\"(max-width: 484px) 100vw, 484px\" \/><\/a><\/p>\n<p>As you can see there\u2019s no merge relationship between destination and AlternateDestination.\u00a0 But let\u2019s imagine that I have some changes in destination that I want in AlternateDestination but I don\u2019t want to go through Source.\u00a0 I want a baseless merge from destination to AlternateDestination.\u00a0 I can now go to Source Control Explorer and start the standard merge experience:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5023.MergeWiz_thumb_02DCE920.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16224\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5023.MergeWiz_thumb_02DCE920.png\" alt=\"Image 5023 MergeWiz thumb 02DCE920\" width=\"644\" height=\"516\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5023.MergeWiz_thumb_02DCE920.png 644w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5023.MergeWiz_thumb_02DCE920-300x240.png 300w\" sizes=\"(max-width: 644px) 100vw, 644px\" \/><\/a><\/p>\n<p>As always, only Source is in the list because it is the only related branch to destination.\u00a0 However, unlike TFS 2010, there is now a Browse\u2026 button for baseless merges.\u00a0 If you click it, you get:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5824.BrowseBranch_thumb_72EDA45B.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16225\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5824.BrowseBranch_thumb_72EDA45B.png\" alt=\"Image 5824 BrowseBranch thumb 72EDA45B\" width=\"644\" height=\"516\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5824.BrowseBranch_thumb_72EDA45B.png 644w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/5824.BrowseBranch_thumb_72EDA45B-300x240.png 300w\" sizes=\"(max-width: 644px) 100vw, 644px\" \/><\/a><\/p>\n<p>and here you can see I can pick AlternateDestination.\u00a0 And if I do, and hit OK, I go back to the wizard:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/0243.BaselessMerge_thumb_6CC657C0.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-16226\" src=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/0243.BaselessMerge_thumb_6CC657C0.png\" alt=\"Image 0243 BaselessMerge thumb 6CC657C0\" width=\"644\" height=\"516\" srcset=\"https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/0243.BaselessMerge_thumb_6CC657C0.png 644w, https:\/\/devblogs.microsoft.com\/bharry\/wp-content\/uploads\/sites\/8\/2011\/08\/0243.BaselessMerge_thumb_6CC657C0-300x240.png 300w\" sizes=\"(max-width: 644px) 100vw, 644px\" \/><\/a><\/p>\n<p>And it warns me that I\u2019m doing a baseless merge but I can hit next and then finish and proceed with it.\u00a0 So, now you can do baseless merges in the UI!<\/p>\n<p><strong>Merge on unshelve<\/strong> \u2013 From the beginning people have loved shelving as a simple, clean way to package up changes and set them aside.\u00a0 However, we\u2019ve often heard the complaint that the inability to unshelve into a workspace with pending changes and deal with the merge conflicts was a serious limitation.\u00a0 No more!\u00a0 We have now built merging into unshelve operation and it works just like merging does elsewhere in the product.<\/p>\n<p>This post has gotten plenty long so I\u2019m not going to include screenshots of this.\u00a0 The new thing is that merges are performed, conflicts are filed, etc in this scenario.\u00a0 All the UI around that is the same as on other scenarios (like merge and get) where merges happen.<\/p>\n<p>Whew!\u00a0 That was a lot but I\u2019ve got plenty more to tell so I\u2019ll keep writing posts in this series.<\/p>\n<p>Brian<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s the next post in my series of \u201cDevelopers are raving fans\u201d enhancements coming in TFS 11.\u00a0 My last post was on workspace improvements. One of the things we consistently get customer feedback on in TFS 2010 is that merging is still too complicated and\/or too limited.\u00a0 We\u2019ve made several significant improvements in the coming [&hellip;]<\/p>\n","protected":false},"author":244,"featured_media":14617,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[5],"class_list":["post-3741","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-tfs"],"acf":[],"blog_post_summary":"<p>Here\u2019s the next post in my series of \u201cDevelopers are raving fans\u201d enhancements coming in TFS 11.\u00a0 My last post was on workspace improvements. One of the things we consistently get customer feedback on in TFS 2010 is that merging is still too complicated and\/or too limited.\u00a0 We\u2019ve made several significant improvements in the coming [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/posts\/3741","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/users\/244"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/comments?post=3741"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/posts\/3741\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/media\/14617"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/media?parent=3741"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/categories?post=3741"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/bharry\/wp-json\/wp\/v2\/tags?post=3741"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}