From: Petr Baudis Date: Tue, 03 May 2005 09:47:23 GMT Subject: Re: cogito "origin" vs. HEAD Message-ID: <20050503094723.GA22436@pasky.ji.cz> In-Reply-To: <1115104408.6156.100.camel@gaston> Dear diary, on Tue, May 03, 2005 at 09:13:28AM CEST, I got a letter where Benjamin Herrenschmidt told me that... > > when accessing the remote repository, Cogito always looks for remote > > refs/heads/master first - if that one isn't there, it takes HEAD, but > > there is no correlation between the local and remote branch name. If you > > want to fetch a different branch from the remote repository, use the > > fragment identifier (see cg-help cg-branch-add). > > Ok, that I'm getting. So then, what happen of my local > refs/heads/ and refs/heads/master/ ? I'm still a bit > confused by the whole branch mecanism... It's my understanding than when > I cg-init, it creates both "master" (a head without matching branch) > and "origin" (a branch + a head) both having the same sha1. It also > checks out the tree. > > Now, when I cg-update origin, what happens exactly ? I mean, I know it's > pulls all objects, then get the master from the remote pointed by the > origin branch, but then, I suppose it updates both my local "origin" and > my local "master" pointer, right ? I mean, they are always in sync ? Or > is this related to what branch my current checkout is tracking ? They are in sync as long as you update only from that given branch. At the moment you do a local commit, they get out of sync, at least until your master branch is merged to the origin branch on the other side. Every cg-update will then generate a merging commit, so it will look like this: [origin] [master] commit1 | commit2 Both heads are in sync so far... | commit3 / \ / commit4 Now heads/master is commit4, but / | heads/origin is still commit3 / | commit5-. | heads/master:commit4, heads/origin:commit5 | \ | | `-commit6 commit6 merges origin to master | / | / | / commit6 origin merged your master; since it contained all the commits on the origin | branch, it just took over the commit6 commit6 commit pointer as its new head; so both heads are again in sync now This is the reason why there are always at least two branches, origin and master. The checked out tree is always of the master branch (unless you do cg-seek, which is somewhat special anyway). [*] "Normally", when you do no local changes and just always cg-update the origin branch, the two branches are always in sync. At the point you start to "mix" several remote branches besides origin in your tree, or at the point you do a local commit, the master branch gets standalone - until the origin merges your changes as drawn in the diagram. There is one other situation when the head pointers may not be in sync - when you do cg-pull instead of cg-update. You want to see what are the changes in the origin branch, but you are not sure if you want them to appear in your master branch, you do cg-pull origin. Your origin head pointer is updated, but your master pointer stays where it is. If you decide it's ok to bring the changes in, you do either cg-update, or only cg-merge to avoid re-pulling. [*] Technically, you can have multiple local branches and your tree can be based on any of them, not only "master". Cogito supports that internally, but (deliberately) provides no UI to set that up, at least until we devise a way to do it without confusing people even more. -- Petr "Pasky" Baudis Stuff: http://pasky.or.cz/ C++: an octopus made by nailing extra legs onto a dog. -- Steve Taylor