Re: Switching branches without committing changes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Mar 20, 2008 at 11:27:09PM -0400, Joe Fiorini wrote:

> I'm trying to switch branches without committing my changes.  Is this  
> possible?  For example, I'm working on a site, I'm testing the  
> implementation of a new technology (branch B), I'm not quite done there 
> (or I forget to commit everything) and I want to implement something else 
> new.  I create a new branch off of B, called B.1, and then make some 
> changes.  I commit only the changes that apply to B.1 and then try to go 
> back to B.  However, I get an error saying a file I changed in B is not 
> uptodate and it cannot merge.  What am I doing wrong and how can I get 
> back to B?

It sounds like you still have some changes in your working tree, and
that is preventing the branch switch.

Generally you would have stashed those changes before working on the
second task, like:

  git checkout B
  hack hack hack
  # oops, I want to work on some other topic
  git stash
  git checkout -b B.1 B
  hack hack hack
  git commit
  # now I'm ready to go back to my original work
  git checkout B
  git stash apply

That example uses git-stash, but you could just as easily do it with a
"work in progress" commit on a branch (which is how people did it before
git-stash was written). Now in your case, I get the impression you have
done this:

  git checkout B
  hack hack hack
  # oops, I want to work on some other topic
  git checkout -b B.1 ;# keeps all of your changes in the working tree
  hack hack hack
  # now my second topic is ready for commit
  git add ;# selectively, or with git add -p
  git commit
  # now I'm ready to go back to my original work
  git checkout B

but the last checkout doesn't work cleanly, because you have some
uncommitted changes in your working tree for some file 'A', but moving
from B.1 to B would also change 'A'.

So you actually need to merge those changes (actually, you are merging
the _undo_ of the B.1 changes) to get back to B. Unfortunately,
git-checkout is smart enough to do merges that don't touch the same
file, but not anything more complex. So instead, we can use stash again.
At this point, you can do:

  git stash
  git checkout B
  git stash apply

which will actually invoke the "real" merge machinery to correctly sort
out the changes.

So what you did isn't wrong, but you probably would have had a much
easier time if you stashed _before_ doing the B.1 work. It would have
made your git-add easier, and it makes testing more accurate (since you
never actually tested the state committed to B.1; you tested B.1 + your
changes that will be commited on top of B).

Make sense?

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux