From: Joe Fiorini <hidden> Date: 2016-06-15 22:44:24
He all,
I'm still a newbie to Git (and this list), so if I don't provide
enough details please let me know what you need and I will provide :).
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?
Thanks all!
Joe
From: Jeff King <hidden> Date: 2016-06-15 22:44:24
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
From: Shawn O. Pearce <hidden> Date: 2016-06-15 22:44:24
Joe Fiorini [off-list ref] wrote:
I'm still a newbie to Git (and this list), so if I don't provide
enough details please let me know what you need and I will provide :).
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?
Use `git checkout -m` to switch the branch anyway. However, if
there is a merge conflict while you are trying to carry the changes
to the other branch you may be faced with a merge conflict you are
not prepared to resolve, or simply cannot resolve in a reasonable
period of time.
You may want to use `git stash` to save your dirty changes off to
a safe area, then switch branches. Your changes won't be there,
but you can get them back with `git stash apply 0`. If things go
badly, you can go back to B.1 and use `git stash apply 0` to put
the changes back where they were, and figure out what you are going
to do from there.
--
Shawn.
From: Jeff King <hidden> Date: 2016-06-15 22:44:24
On Fri, Mar 21, 2008 at 12:06:47AM -0400, Shawn O. Pearce wrote:
Use `git checkout -m` to switch the branch anyway. However, if
there is a merge conflict while you are trying to carry the changes
to the other branch you may be faced with a merge conflict you are
not prepared to resolve, or simply cannot resolve in a reasonable
period of time.
Ah, for some reason I didn't think of '-m' in the advice I gave (I guess
I have just never used it). It is almost certainly simpler than using a
'stash' at this point (but I do think stashing _beforehand_ still has
advantages).
-Peff
From: Joe Fiorini <hidden> Date: 2016-06-15 22:44:24
Thanks for the replies. I definitely like the stashing approach. Is
there any overhead or caveat to using stash a lot?
-Joe
On Mar 21, 2008, at 12:10 AM, Jeff King wrote:
On Fri, Mar 21, 2008 at 12:06:47AM -0400, Shawn O. Pearce wrote:
quoted
Use `git checkout -m` to switch the branch anyway. However, if
there is a merge conflict while you are trying to carry the changes
to the other branch you may be faced with a merge conflict you are
not prepared to resolve, or simply cannot resolve in a reasonable
period of time.
Ah, for some reason I didn't think of '-m' in the advice I gave (I
guess
I have just never used it). It is almost certainly simpler than
using a
'stash' at this point (but I do think stashing _beforehand_ still has
advantages).
-Peff