This is more that `Checkout` does not result in the desired behavior here (not the use of `ObjectId`). Checkout, when passed a commit ID, will detach the current HEAD (so, the result is that you will not end up in the same branch as you were before the checkout).

I think the method you will want to use is `CheckoutTree`. The tree parameter for this method can come a commit object, which you can lookup with (e.g.):

    Commit fastForwardCommit = this.Lookup<Commit>(sha);