On Fri, Oct 19, 2007 at 20:50:29 +0200, Joakim Tjernlund wrote: > On den 19 oktober 2007 19:25, Johannes Schindelin [mailto:Johannes.Schindelin@xxxxxx] wrote: > > It strikes me as really odd that you would _want_ to create a branch > > remotely, that has _never_ existed locally. > It strikes me as really odd that a core developers like yourself > hasn't tried to justify/explain why push works as it does. Dscho it rarely kind to newbies. > As I am trying to convince our dev. group here to move to git instead of subversion, I > need to learn how git works. Now I have gotten to the push function and I need > to know what can be done with push and how, pitfalls too. As I go along I find behavior > that I find odd and report these to the list. > > git push <repo> v2.6.23:refs/heads/linus > will make a tag look like a branch That's becasue tags come in two flavors -- annotated and unannotated. Annotated ones don't point to commits directly, but via 'tag' objects, that contain description and usually signature. Now git push will simply assign a remote branch whatever value you give it. You gave it a tag, so it assigned a tag. > git push <repo> linus:linus > won't let me create the remote branch linus but > git push <repo> linus > will Because in the former you are not saying whether refs/heads/linus, refs/tags/linus or something else (the fact that heads and tags are treated specially by git does not mean refs can't have other subdirectories -- it can). On the other hand in the later it resolves the ref locally and uses the same name remotedly. > git push <repo> :linus > OOPS, now I just deleted remote branch linus, no warning Your commands are quite obvious. No need for warning. (Besides, isn't there a reflog?) > git push <repo> linus:refs/head/linus > creates a branch that is invisible(wont show in git branch -a) It does not create a branch. It creates a ref with slightly funny name (it's refs/heads, not refs/head). ^ > git push <repo> linus:refs/heads/newbranch > creates remote branch newbranch, but you have to know the magic words > refs/heads/ to do it. Because you could have wanted a tag. Or a remote. Or something completely different, maybe because some add-on uses (eg. stgit uses refs/bases and refs/patches, IIRC). > Se what I mean? To me it all looks perfectly consistent. But maybe the documentation should state more clearly, that push works in terms of arbitrary refs, NOT branches. Feel free to post a documentation patch (people who just had hard time finding something out are usually better at explaining it than old-timers who consider it obvious). -- Jan 'Bulb' Hudec <bulb@xxxxxx>
Attachment:
signature.asc
Description: Digital signature