Merges
When you would like to know what changes have been merged already between a source and a target you can run:
tf merges sourceItemSpec targetItemSpec
Usually you would like to view the merge history recursively when you are using folders are branch roots (it’s recommended to use folders as branch roots, don’t use files as branch roots). The /r option will allow you to see merges between the folders and their child items too. If you don’t supply /r you will only see merge history of the folder itself (which usually consists of renames, deletes, etc.) and it wouldn’t be much. You can also run the command without specifying the optional argument sourceItemSpec to view all the merges that were applied to that target regardless of the source.
The output of the command looks like the following:
Changeset Merged in Changeset Author Date
--------- ------------------------ -------------------------------- ----------
120 130 DOMAIN\userName 2/2/2009
150 200 DOMAIN\userName 3/3/2009
…etc.
The first column shows you the changeset that was merged or ported over from source to target, and the second column shows the changeset when this merge was committed.
When you would like to view the changesets/versions that weren’t merged from source to target yet, you can run:
tf merge /candidate sourceItemSpec targetItemSpec
Again, usually you would like to use the /r option with this command too. The output of this command looks like:
Changeset Author Date
--------- -------------------------------- ----------
210 DOMAIN\userName 4/4/2009
220 DOMAIN\userName 5/5/2009
These are the candidate changesets for the next merge. Merging up to the latest version will pend these changes on the target, you will see something like this:
merge, edit: $/Proj/Src/File.cs;C205~C220 -> $/Proj/Tgt/File.cs;C207
This means that you are going to merge the changes from the source between changeset 205 (the first changeset after the last merge from source to target) and 220 (latest version of source) to the target item at version 207 (latest version of target). The merge command allows you to merge cherry-picked changesets or merge up to a specific version of source. For example, if you run:
tf merge /r $/Proj/Src;100 $/Proj/Tgt
Since you specified changeset 100 (you don’t need to use the C prefix, it’s the default) it’s like requesting a merge for versions 1~100 of source which were already merged, hence, you will see a message indicating that "There are no changes to merge."
When the merge change is committed, the merge history of the target is updated, and credit is given to the merge. Next time you merge, you wouldn’t see these changes again, unless you force them to be merged again using the /force option, and subsequently they wouldn’t show up in the candidates list. Of course, the merge history will show one more entry after the merge. If you want to ignore the changes but at the same time give credit for the merge, you can use the /discard option. This will pend only the merge change without any other accompanying change, just like what happens when you resolve a conflict as keep target. Again this will record the merge operation in the merge history.
Comments
Anonymous
April 09, 2009
Hi. I have a situation where there are two code branches, one of which was branched off from the other, and a particular file in one of the branches has a number of changes. I'm trying to investigate one of the changes and whether or not it was ever merged up. Its changeset doesn't show up in the list generated by tf merges. However it also doesn't show up when I run tf merge /candidate. Any idea how that could happen? Shouldn't it appear in one or the other? -- MikeAnonymous
April 09, 2009
It depends on the direction. Are you looking at merge candidates from branch A to branch B or vice-versa? If the changes were made in B but you are looking at the merge candidates from A to B, they won't show up, to see them, choose the right direction, in this case: from B to A.Anonymous
April 10, 2009
I am merging from branch A to B, and have made numerous changes in branch A, some of which have been merged to B. I've identified a couple changesets in branch A that I want to investigate. So I enter: tf merges $/BranchA/FileA $/BranchB/FileA where fileA is a file present in the changesets I'm investigating. It displays a list of changesets that have been merged from Branch A to Branch B, none of which is the one I'm looking for. This implies to me that the changesets haven't been merged yet. Next I enter tf merge /candidate $/BranchA/FileA $/BranchB/FileA and get a list of candidate changesets. However it does not contain the changesets I was investigating. It seems like any given changeset that was checked into BranchA/FileA should appear in one list or the other, no? -- MikeAnonymous
April 10, 2009
I tried to reproduce the issue, here's my output: tf merges BranchAFile.cs BranchBFile.cs Changeset Merged in Changeset Author Date
654 655 mohamedg 4/10/2009 656 657 mohamedg 4/10/2009 658 661 mohamedg 4/10/2009 659 661 mohamedg 4/10/2009 660 661 mohamedg 4/10/2009 662 665 mohamedg 4/10/2009 663 665 mohamedg 4/10/2009 tf merge /candidate BranchAFile.cs BranchBFile.cs Changeset Author Date
664 mohamedg 4/10/2009 tf hist BranchAFile.cs /i Changeset Change User Date Comment
664 edit mohamedg 4/10/2009 663 edit mohamedg 4/10/2009 662 edit mohamedg 4/10/2009 660 edit mohamedg 4/10/2009 659 edit mohamedg 4/10/2009 658 edit mohamedg 4/10/2009 656 edit mohamedg 4/10/2009 654 add mohamedg 4/10/2009 I tried edits in A and merging to B, and even merge with discard. As you can see, the set of versions listed in history is the union of merges and candidates. Please check the histroy of the file. You can also send me the actual data in an email: http://blogs.msdn.com/mohamedg/contact.aspx
Anonymous
April 20, 2009
Hi. Sorry for the delay in getting back to you. I've captured a good example & sent it to you in a separate email. Thanks.Anonymous
April 28, 2009
To make it clear for other readers. This can happen when the user has resolved a conflict as AcceptTheirs - hence choosing to never merge the previous changes. You can confirm this by looking at the file contents and check it against the file contents of the source version. The command tf merges wouldn't show implicitly ignored versions (AcceptTheirs) and it won't appear in the candidates list because you told TFS to ignore it.