Search code examples
tfsmergerollback

TFS merge doesn't pick up rollback changeset(s)


I've had the following TFS issue:

I've created the new branch from MAIN branch. During the time some changesets (let specify them from CS-1 to CS-2) have happened on the new branch. In one moment I had modification on MAIN branch and this modification has been merged on the new branch (new changeset on branch: CS-3).

After that, new branch was having several changes (which produced changesets from CS-4 to CS-5). Also, I did a rollback of CS-3 and as result the new changeset CS-6 has been created on the new branch.

Now, the question is: Which changesets should be contained in merge from the new branch back to the MAIN? Logically, it should be: [CS-1 – CS-2, CS-4 – CS-5 and CS-6]. But, the real result was: [CS-1 – CS-2, CS-4 – CS-5]

Does anybody have any idea: Why the rollback changeset (CS-6) is not contained in merge? It is obvious that rollback of changeset CS-6 is not treated equally as usual changeset.


Solution

  • First of all, very well explained question :). The option which you need to start using is the "

    tf rollback /keepmergehistory

    The following example explains the 2 different options that we can use while doing rollbacks, and why you got the specific behavior you mentioned above. I recreated the entire scenario you mentioned above, but I rolled back from command prompt using the

    /keepmergehistory

    This time when I tried to merge back from dev branch back to the Main branch, it did bring up the rolled-back change (CS6) back to the source/main branch.

    Explanation from MSDN:

    When you roll back a changeset that includes a branch or a merge change, you usually want future merges between the same source and the same target to include those changes. However, you can use the /keepmergehistory option if you want future merges between the same source and the same target to exclude changesets that were encompassed in a past merge operation.

    For example, you can use this command in the following situation:

    • In On June 30, 2009, you perform a full merge of all items from $/BranchA/ to $/BranchB/:

      c:\workspace> tf merge $/BranchA $/BranchB

    You check in this merge as part of changeset 292.

    • In July, you make several changes $/BranchA/Util.cs. These changes are encompassed in changesets 297, 301, and 305.

    • On August 1, 2009, you merge $/BranchA/Util.cs to $/BranchB/Util.cs:

      c:\workspace> tf merge $/BranchA/Util.cs $/BranchB/Util.cs

    You check in the change as part of changeset 314. The result of this operation is that the edits that you made in changesets 297, 301, and 305 to $/BranchA/Util.cs are now also applied to $/BranchB/Util.cs.

    • A week later, you realize that the edits that you made to $/BranchA/Util.cs in July are not appropriate for $/BranchB/Util.cs. You can use the rollback command to negate these changes. When you use the rollback command to roll back a merge change or a branch change, you have a decision to make.

    • If you want the changes that you made in July to $/BranchA/Util.cs to be re-applied to $/BranchB/Util.cs in future merges, you should type the following command:

      c:\workspace> tf rollback /changeset:314

    • If you want the changes that you made in July to $/BranchA/Util.cs to never be re-applied to $/BranchB/Util.cs in future merges, you should type the following command:

    • c:\workspace> tf rollback /changeset:314 /keepmergehistory

    • A few weeks later, you merge $/BranchA/ into $/BranchB/: c:\workspace> tf merge $/BranchA $/BranchB

    • If you omitted the /keepmergehistory option, the merge change will apply to $/BranchB/Util.cs all changesets that were applied to $/BranchA/Util.cs since changeset 292, including changesets 297, 301,

    • In other words, a future merge will undo the rollback change.

    • If you included the /keepmergehistory option, the merge operation will apply to $/BranchB/Util.cs all changesets that were applied to $/BranchA/Util.cs since changeset 292, excluding changesets 297, 301, and 305. In other words, a future merge will not undo the rollback change. Therefore, the content on BranchA might not match the content on BranchB.

    MSDN SOURCE