Using shelve to mimic Git's staging area

John Arbash Meinel john at arbash-meinel.com
Tue Sep 27 10:35:38 UTC 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 9/27/2011 11:39 AM, A. S. Budden wrote:
> On 27 September 2011 10:10, John Arbash Meinel
> <john at arbash-meinel.com> wrote:
>> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
>> 
>> On 9/27/2011 11:00 AM, A. S. Budden wrote:
>>> Dear all,
>>> 
>>> I've recently been experimenting with bzr shelve.  As I
>>> understand it, this is intended to be an equivalent to the
>>> staging area in git: I can make changes on two separate issues
>>> and then commit them separately by moving one set of changes
>>> temporarily onto the shelf. I hope I have understood that
>>> right.
>>> 
>>> However, I have been unable to work out how to do this when 
>>> changes are close together in a file.  For example, imagine I
>>> had a file stuff.c, which "bzr diff" reports as looking like
>>> this:
>>> 
>>> === modified file 'Stuff.c' --- Stuff.c             2011-09-22 
>>> 14:04:20 +0000 +++ Stuff.c             2011-09-27 07:40:16
>>> +0000 @@ -42,6 +42,8 @@ * Some random comments preceding the
>>> change * that have already been committed. */ +/* I'd like to
>>> shelve this change */ +/* But not this one */ void
>>> AFunctionThatHasNotChanged(void) { uint8_t variable;
>>> 
>>> With git, I can add one of those too new comment lines to the 
>>> staging area and commit, then add the other one and commit
>>> [1]. Obviously this is a rather contrived example, but is there
>>> any way to do the equivalent of this with bzr (q)shelve?
>>> 
>>> Thanks,
>>> 
>>> Al
>>> 
>>> [1] In the command line version of git, this is done by
>>> editing the patch directly; in "git gui", you can right-click
>>> on a line and select either "add hunk to staging area" or "add
>>> line to staging area".
>>> 
>> 
>> If you do "bzr config change_editor=???", and set that to a text 
>> editor, it will allow you to do "e" to edit the file. My change
>> editor is configured to "vim -d".
>> 
>> That gives you a side-by-side of the old value of the file, and
>> the new value of the file. You edit the 'new' side until it looks
>> like what you want to keep, and then save and exit. And then bzr
>> will leave the new value to what you left it, and determine what
>> diff gets shelved based on that.
>> 
>> So in the above case you would hit 'e' then delete the "I want
>> to shelve this line" case.
> 
> Sounds great, thank you.  However, I think I must be doing
> something wrong.  What I did was to run "bzr shelve".  I then hit
> 'e' and gvim (diff-mode) opened, so I deleted the line "I'd like to
> shelve this change" and hit :wqa.  I hit 'y' and the change was
> shelved and I was left with a working file with just the line "But
> not this one".  I committed it and everything looked fine.  I then
> did "bzr unshelve" and was told:
> 
> Using changes with id "1". M  Stuff.c Text conflict in Stuff.c 1
> conflicts encountered. Deleted changes with id "1".
> 
> "bzr st" reported:
> 
> modified: Stuff.c unknown: Stuff.c.BASE Stuff.c.OTHER Stuff.c.THIS 
> conflicts: Text conflict in Stuff.c
> 
> and bzr diff (ignoring the lines of context) had this to say:
> 
> -/* But not this one */ +<<<<<<< TREE +/* But not this one */ 
> +======= +<<<<<<< +======= +/* I'd like to shelve this change */ 
> +/* But not this one */ +>>>>>>> +>>>>>>> MERGE-SOURCE
> 
> I realise that this can be easily resolved with qconflicts or 
> whatever, but this does seem to make the process of committing the
> two lines separately (which is what I want to achieve) a lot more 
> difficult.
> 
> Am I missing something obvious?
> 
> Al


The issue is that the shelved change looks like:

stuff
/* The line I removed */
more stuff

And the one you committed looks like

stuff
/* The line I kept */
more stuff

Given that the version before you did shelve looked like:

stuff
more stuff

We don't have a way of distinguishing those changes from being a
conflict. I can see your point that it would be nice if we could
shelve the change vs the aggregate, so that we can see that you really
do want to insert that line before the other.

It isn't possible at the moment, but it would be interesting to think
about.

Maybe I'm misunderstanding how Aaron implemented shelves, though.

John
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6BpvoACgkQJdeBCYSNAAPHWQCfdyExHmIXCDmFSogh2Os1yTyv
N5sAn0tllJ6aOdhjKcHKySI6XSUG2rLD
=n18X
-----END PGP SIGNATURE-----



More information about the bazaar mailing list