[pacman-dev] [PATCH 1/2] Enabled new interactive prompt and updated some tests.

Bryan Ischo bji-keyword-pacman.3644cb at www.ischo.com
Mon Feb 23 16:10:53 EST 2009


Aaron Griffin wrote:
>
> I use git stash when switching back and forth between branches when I
> am of the mindset that "oh this isn't commit-able yet".
>
> I keep noticing you mention "multiple branches in the same tree", but
> am at a loss as to why that's necessary. git offers the same
> functionality, mainly due to the fact that a "git checkout" is as
> quick as a "cd".
>
> git co master
> ...change...
> commit
> git co branch-a
> ...change...
> commit
> ..change..
> stash
> git co master
> git stash --apply
> commit
>
> I guess I can't think of a good use-case when you would want to edit
> foo.c from BOTH master and branch-a at the exact same time... it seems
> like an attention killer to me. Like watching two TVs at once or
> something.
>
> Could you explain why you would need the files side-by-side?
>   

It's not the ability to modify a single file in two different places at 
once.  It's the ability to keep changes logically separated by 
directory, in a persistent manner that doesn't require git commands to 
put changes away and bring them back, that I care about.  I find it 
infinitely easier to keep track of what I am doing by persistently 
retaining directory contents than by having a single working view and 
everything else being stashed away to be retrieved later.

One example of where git stash is more cumbersome is if you've created 
new files but haven't added them to the index yet.  You have to add them 
to the index before you can stash.  Now this is not a huge deal, but it 
does require more work to prep your tree for a stash than simply cd'ing 
out to another branch directory would take.  There may be other cases 
where more work is involved in stashing (above and beyond having to 
actually run the git stash commands and maintain the list of stashes) 
than is involved in using locally stored branches, but I haven't used 
git stash enough to discover them.  It would not surprise me to learn 
that there are lots of subtle details to be aware of when using git stash.

Parallel branch directories have an advantage over git's branch views 
whenever you need to compare the contents of branches.  With parallel 
branch directories, all of the contents are there so you can compare 
them however you want.  Additionally, you can compare things with 
parallel branch directories that you can't compare easily with git: for 
example, if I have a branch with a bug fix on it, and I want to compare 
the behavior of my program with the behavior of my program without that 
bug fix, or maybe with a different bug fix, I can build both in parallel 
and run them however I need to to make these comparisons.  With git I 
guess I'd have to make my bug fix, build it, stash the code and copy the 
build directory somewhere else, then checkout the other branch, and 
build it, and then I could compare what I have just built with what I 
copied away somewhere else.  But then if I want to make a quick change 
in the other branch and see how it affects the program output, I'd have 
to run a bunch more git commands and do lots more juggling to get back 
to the other brach, make the change, compile it, copy the results 
elsewhere, re-stash, un-stash, etc etc.

Maybe it's because I'm an emacs user and not a vi user, but I don't like 
to keep track of any more stuff in my head than I need to.  And keeping 
track of what changes I've stashed away from which branches and what 
sequence of git commands I need to run to return myself to a prior state 
when I was working on something else, is just more mental effort than I 
want to undertake.  I find it so much easier to just leave a branch 
subdirectory and when I return to it later, it is guaranteed to be 
exactly as it was when I left, without any effort on my part.  If I am 
working on 4 or 5 bugs in parallel (which I have certainly done at work, 
where working on just 1 or 2 bugs at once would be inefficient because 
of the downtime associated with building each tree) I can't even imagine 
using git stashes to sanely keep track of everything.


>> - A single branch-based 'view' that switches your files around in-place as
>> you change which branch you are on, instead of keeping branches in separate
>> subdirectories
>>     
>
> See above - I don't get how this is a con, as branch switching in git
> is painfully quick
>   

If quickness is all that matters, then I can guarantee that a simple 
'cd' is even faster than git, no matter how fast git is.  But quickness 
is not all that matters, and as I have described above, being able to 
view branches in parallel, and work on them in parallel, without any 
intervening git commands or mental effort in juggling stashes, and with 
the ability to keep parallel builds and use the build results in 
parallel, are much more important and for me, greatly favor parallel 
local branches.
>   
>> - Lack of rename tracking.  Yeah, I know, git claims that it can do it after
>> the fact when examining change histories but I've tried various scenarios
>> and it just doesn't work very well, and even when it does, requires stupidly
>> complex options to git commands to enable git to discover renames in the
>> history correctly
>>     
>
> git is focused on file contents, and doesn't really care where those
> contents actually are. It seems odd to me too, but I have yet to
> discover a case when this is a big deal - I mean if I'm looking at
> some C code, I don't care if the file is named something.c or
> SOEMTHING.c or omgwtf.c - it's the code that matters.

The problem comes when someone, in a branch, renames a file, and then 
tries to merge their changes into another branch in which the file was 
not renamed.  Unless file renames are tracked, the merge becomes very 
difficult.  Refactoring a subsystem on a 'workbranch' is something that 
is done sometimes on large projects,  and with git, I would expect that 
to be basically impossible to do sanely.  Even if git's 'detect renames 
while examining history' technique did work, it still makes renames 
cumbersome, because you can't rename a file and change its contents at 
the same time or else git has almost no chance of detecting the rename 
via history.  And if you can't change a file and rename it at the same 
time, then you can't, for example, properly rename a Java class, because 
the class name and file name have to be the same.  So you'd have to 
rename the file (thus breaking the build, because the file would no 
longer compile), check that in, and live with having a broken build for 
a bit until you modified the file's contents to match its new name, 
tested it, and checked that in.

It just shouldn't be that hard.  File names are part of the metadata 
that is relevent to versioning.  So the version control system should 
track file names properly, along with every other thing about a file 
(such as its contents and permissions).  The fact that git doesn't do 
this is a serious oversight and I guarantee that eventually the git 
developers will have to face this and make some major changes to git.  
Either that, or they will just stubbornly refuse in the face of valid 
reasoning to the contrary.

Bryan



More information about the pacman-dev mailing list