On Wed, Sep 17, 2014 at 05:52:29AM -0700, Dmitry Moscow wrote: > > > I come from an SVN background, and I have a hard time grasping Git's > philosophy. In particular, I'm confused by the following. > > 1. Imagine I have made some changes in my working dir. If I switch > to another branch, the changes*remain*, which is very unusual, > from an SVN point of view. This means that uncommitted changes > are*shared* between the branches. Moreover, the "stage property" > of the files is also *shared* between the branches: if I call > git add * in one branch, then all the files will be added to > next commit in all the branches. Looks like my branches differ > only by already *committed* files.
Actually, SVN behaves the same way in regards to jumping between
branches with changes present:
~~~
% svn info|grep Relative
Relative URL: ^/trunk
% svn st
M bar
% svn diff
Index: bar
===================================================================
--- bar (revision 3)
+++ bar (working copy)
@@ -0,0 +1 @@
+Hello.
% svn switch ^/branches/b1
At revision 3.
% svn diff
Index: bar
===================================================================
--- bar (revision 3)
+++ bar (working copy)
@@ -0,0 +1 @@
+Hello.
~~~
And keep in mind that SVN only has an explicit staging step when
adding files. Furthermore, the staging area in git is not tied to a
branch, it's tied to the working area. Again, just as in SVN.
> So, if uncommitted data are *shared*, then, no matter which branch I am
> on now, I will commit *all the staged files*, even if they were added in
> different branches! As I come from an SVN background, this strikes me as
> very odd.
Also for files that are just added does SVN behave exactly the same as
git.
~~~
% svn info|grep Relative
Relative URL: ^/trunk
% touch qux
% svn add qux
A qux
% svn switch ^/branches/b1
At revision 3.
% svn st
A qux
~~~
> Am I correct, or am I just confused? Why does Git work in this way?
So, if I understand you correctly you actually are confused ;) No
seriously, of course it's a valid question to ask 'why'. Interesting
though that you never ran into the behaviour when using SVN.
> 2. Sometimes, Git tells me something like this:
>
> Cannot switch to another branch because your changes will be
> erased. Commit them first.
>
> In SVN, that's not a problem: branches are *independent*. Why and
> when does this happen in Git?
It happens at the same point as when you get a merge conflict in SVN ;)
~~~
% svn info|grep Relative
Relative URL: ^/trunk
% svn cat ^/trunk/bar
% svn cat ^/branches/b1/bar
foo bar
% echo 'wibble wobble' >> bar
% svn st
M bar
% svn switch ^/branches/b1
C bar
Updated to revision 4.
Conflict discovered in file 'bar'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
(mc) my side of conflict, (tc) their side of conflict,
(s) show all options:
~~~
That is, git tells you it can't switch to the other branch without
losing your changes. Just as SVN does. They just do it in different
ways; SVN forces you to merge, git forces you to remove the changes
or commit them first.
/M
--
Magnus Therning OpenPGP: 0xAB4DFBA4
email: [email protected] jabber: [email protected]
twitter: magthe http://therning.org/magnus
Any fool can write code that a computer can understand. Good programmers
write code that humans can understand.
-- Martin Fowler
pgp8HD04VUWD5.pgp
Description: PGP signature
