About git-thought [was: brisbane: initial cut at a mergeline cache]

Robert Collins robert.collins at canonical.com
Thu Apr 2 21:43:36 BST 2009


On Fri, 2009-04-03 at 03:08 +0900, Stephen J. Turnbull wrote:
> Andrew Bennetts writes:
> 
>  > > If now you ask "what?", then you still don't get it.  There are lots
>  > 
>  > I don't know.  You're being awfully abstract...
> 
> Well, yes.  What I want is pretty abstract: I want access to the DAG.
> I don't want it dismembered, and the parts encapsulated in disjoint
> branches, simply because there happens to be a node there.
> 
> I want to be able to work with 3 or 4 branches simultaneously.  For
> example, in git you can say something like
> 
>     git log cairo earl ^master ^amd64-warnings
> 
> to get the log of commits that are in the cairo or earl branches, but
> not in the master (== trunk) or amd64-warnings branches.  Or

This is something nice we should definitely make possible in bzr.

> git checkout master
> for i in `git rev-list cairo earl ^master ^amd64-warnings`; do
>   git cherry-pick $i
> done
> 
> to cherry-pick all of them.

This is nearly as easy though a little more verbose.

> A more practical (and to me, workflow-relevant) example.  In writing
> up a presentation, I often do several rather different drafts of the
> same topic.  In that case, I'll typically represent my work as several
> branches from "yesterday's" version of the text, then merge.  Ie,
> rather than rewriting a draft in place, for each edit I branch,
> revert, and restart that part from scratch.  Like this:
> 
> git checkout master         # now I'm on trunk, where I left off yesterday
> 
> #     edit, decide I'm not satisfied, save the file
> 
> git commit -a -m "Nyet."
> git branch versionA         # I'm still on the trunk, but my work is safe
>                             # I know where to find it, in branch versionA
> git reset --hard master^    # "erase the blackboard"
> 
> #     mung until no good
> 
> Of course, the initial checkout is usually implicit, and I have a
> command defined in XEmacs so that the commit-branch-reset operation
> takes 3 keystrokes, plus typing the name of the new branch.  The time
> taken is the same as it takes to save the file, ie, imperceptibly
> short.

So, we have this ongoing unsolved disconnect between branches-are-urls
and making-new-trees-can-be-expensive. We need to come up with a
tasteful answer to that [which may well let us remove some of the
'cruft' :)]. That sais:
bzr checkout master working
#edit etc working
bzr commit -m "Nyet."
bzr push ../versionA # or bzr branch . ../versionA
bzr pull --overwrite ..master

Etc. Its totally sane, easy and fast [assuming a shared repo exists
at .., see the discussion about needing to fix the setup overhead there]
to work this way.

> I don't know what you think, but I think this is a decidedly weird
> workflow that no sane person would come up with.<wink>  But ... I did,
> I like it, and git lets me do it.  Easily, safely, and quickly.
> 
> How would you do that with a lightweight checkout?

See above.

> I'm also not clear on the concept of "aliases".  In git I don't need
> aliases, I just use tags (for "important" individual revisions) and
> branches (for dynamically developing versions).

One of the things git has by making the repository
the-place-where-branches-are is very reliable short names; we have a
nice solution too (see 'switch''s behaviour, but we haven't made it a
deep, automatic hook for all commands. We should.) I think your workflow
of tagging and branches is sensible - its what I do in bzr.

-Rob
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part
Url : https://lists.ubuntu.com/archives/bazaar/attachments/20090403/e183c09b/attachment.pgp 


More information about the bazaar mailing list