Re: git checkout no longer warning about uncommitted/untracked files!
On Mon, May 23, 2011 at 02:05:04PM -0700, funeeldy wrote:
> This is with version 1.7.5.2 - it just keeps the files as modified when I
> checkout a different branch.
Right. This has always been the way git works.
> The bad thing about this is that if I make a change on both branches,
> only the last change is kept, silently.
No, in the example below, you don't actually make a change on a branch. You make a change to your _worktree_, but that change is not associated with a branch until you actually commit (which you never do in your example).
Show 10 quoted lines
> private/marlene_cote/test/anroot/projects/kernel main_int $ git st
> # On branch main_int
> # Changed but not updated:
> # (use "git add <file>..." to update what will be committed)
> # (use "git checkout -- <file>..." to discard changes in working
> directory)
> #
> # modified: Makefile
> #
> no changes added to commit (use "git add" and/or "git commit -a")
OK, so you have a change to your Makefile...
Show 5 quoted lines
> /private/marlene_cote/test/anroot/projects/kernel main_int $ git checkout
> main
> M Makefile
> Branch main set up to track remote branch main from origin.
> Switched to a new branch 'main'
And now you switch to another branch. Because the version of Makefile in "main" is the same as the one on "main_int", git can switch branches and preserve your worktree change (if there had been a change to Makefile in main_int, you would have seen an error, and git would have told you to commit or stash your change sfirst).
> /private/marlene_cote/test/anroot/projects/kernel main $ git checkout
> main_int
> M Makefile
> Switched to branch 'main_int'
Now you're back on main_int, but again, you still have the same change in Makefile in your worktree.
> /private/marlene_cote/test/anroot/projects/kernel main_int $ git checkout
> main
> M Makefile
> Switched to branch 'main'
And back to main, with the same change in the worktree.
> v/private/marlene_cote/test/anroot/projects/kernel main $ vi Makefile
And now you edit the Makefile to new content. If you are expecting the intermediate state of the Makefile to be kept, it is not. You never committed it.
> /private/marlene_cote/test/anroot/projects/kernel main $ git checkout
> main_int
> M Makefile
> Switched to branch 'main_int'
And you still have the new content, because none of these checkouts is changing your Makefile at all; you are just switching other files around while the same changes to Makefile sit in the worktree.
-Peff