We've already learned how to switch which branch points to what using git branch -m. If I do this, is it going to make life difficult for the other people pulling from my repository?
Say I do a bunch of stuff on a branch topic1 and then do a
git branch -m master old_master
git branch -m topic1 master
git push origin master
and then somebody else pulls master from the my remote repository, what will they have to do to make everything point to the right place? Will I have to tell everybody to repeat my steps?
Is this akin to the problem of rebasing commits after pushing them and leaving other developers with dangling objects?
-
Basically your operations are the same as:
# git checkout master # git reset --hard topic1 # git push origin masterAnd they will have exactly that effect: Everybody else will get the
topic1branch (it’s namedmasterfor them, though) and its ancestry up to the point wheremasterandtopic1first diverged. The oldmasterbranch is then lying around in their repositories and will be garbage collected at some point in the future because nothing points to it anymore.If
topic1is a branch that originated from the currentHEADofmasteryou will be fine here. Otherwise you will get into the “rewriting history” situation which can make a mess of your e.g. your tags. You need to think carefully about what you’re really trying to achieve. Maybe a simplegit mergewill serve you better? -
I'm not exactly sure what your repo looks like but here's the worst-case scenario.
Suppose your
originrepository looks like thisorigin: o---o---A---B---C master
And your local repository looks like this,
JimPuls: o---o---A---B---C master, origin/master \ D---E---F topic1Then, after your branch renames your local repository looks like this:
JimPuls: o---o---A---B---C old_master, origin/master \ D---E---F masterNow, when you push
mastertooriginthat'll be a non-fast-forward update. After the push, theoriginrepository will look like this:origin: o---o---A...B...C (B & C are orphaned commits) \ D---E---F masterThis can be cruel to your friends who may have done commits on top of
C. For example, if Sally was working with you her repository may look like this:Sally: o---o---A---B---C origin/master \ G---H---I masterNow, if you do your non-fast-forward push and Sally does a
fetchher repository will look like this:Sally: D---E---F origin/master / o---o---A---B---C \ G---H---I masterNow Sally has to figure out how to get her work (G, H, I) back into the repository. If she simply does a merge with
origin/masterthen the changes in B and C will be back in the repository (oops!). Instead, she'll have tocherry-pickorrebaseher G-H-I changes ontoorigin/master.It's cool that Git lets you do that but it's kind of asking for trouble. You're really hoping that Sally notices the situation. This is why you should warn all the other contributors when you do this so they can deal with the change appropriately.
NOTE: the above is a worst-case scenario. If your
topic1branch departed frommasterat C then that change is a fast-forward and there are no problems.Sujoy : good explanation
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.