Robert Muir wrote:
Right, I'm positive this (pull requests) is github :)
Well, as I said, I dont KNOW exactly where the border between git and
github is, but I have a very mature logical sence and a fair amount of
knowledge about information theory. The rest of the content in the mail
is based only on my logical sence. I would love to be proved wrong and
told that my logical sence played a trick on me :-)
My thoughts are that SVN is not dumb (always thinks the best about
others :-) ), it just hasnt got enough information to help merging in a
better way than what we have all experienced with SVN. If SVN is not
dumb, the only way you can be better is by having more information. And
I would really be mistaken if this is not the reason that git is able to
act in a smarter way when merging. It simply has more information than SVN!
So what kind of information does it have that SVN does not have? My
guess is, that it knows where code came from and how it developed
throughout the life of a hierarchy of branches/forks with a history
going all the way back to the original common ancestor of the branches.
If you have this kind of information I would imagine you can do smarter
merging, and most important you can maintain the detailed information
about where code came from and how it developed even on the target side
of the merge, so that you can also be smarter when that branch/fork has
to be merged somewhere else. So when I said in a prior mail "...else I
couldnt imagine how you get the advantages you get. Remember that when
using git you actually run a "repository" on every developers local
machines. When you commit, you commit only to you local "repository".
You need to "push" in order to have it "upstreamed" (as they call it)"
it was acutally an attempt to make an argument that "all the smartness
must be in git" - I understand it was a very unclear argument.
But the thing is that the local repository is NOT github - it is git. I
dont have github on my local machine :-) And it is information about the
commits I did to my local git repository that potentially can make the
entire process smarter. Without information from my local git repository
about how I changed the code, it is not possible (again only based on my
mature logical sence) for the receiving git-repository (eventually
github) to be smarter than SVN. Therefore, since the clever information
tracking needs to go on on my local machine, where only git (not github)
lives, I argue that the smart thing is in git and not in github.
Actually I couldnt imagine that a "pull requests" isnt just a convenient
alternative to sending a mail to the owners/committers of the target
git-fork asking them to downstream this and that commit from my source
git-fork. I know it is a lot to claim, based alone on logical sence, but
I trust my logical sence very much :-)
Below some thought about what kind of information you will need to be
smarter than SVN - again just completely on top of my own head (I really
dont know anything about git :-) ):
Imagine a file in a repository - content of file:
*abcd
efgh
ijkl
mnop
*
Now we fork (branch) into three forks - fork1, fork2 and fork3
On fork1 the content of the file is changed into
*abcd
1234
efgh
ijkl
mnop
*A line between original line #1 and #2 was inserted - a line with the
content "1234"
On fork2 the content of the file is changed into
*abcd
efxyz
ijkl
mnop
*The original line #2 was changed
Now you push the changes on fork1 into fork2. The net result on fork2
obviously is
*abcd
1234
efxyz
ijkl
mnop
* In the meanwhile on fork3 the content of the file has changed into
*abcd
efgh
ij
mnop
*The original line #3 was changed
Now you want to push the changes on fork2 (where some of it came from
fork1) into fork3
Basically you have the problem of merging the following two versions of
the file:
*abcd
1234
efxyz
ijkl
mnop
*and
*abcd
efgh
ij
mnop
*In SVN you have no other information than the content of the two
versions of the file about to be merged. With that amount of information
it is impossible to make a solid decission about the net result -->
merge conflict.
If you had information about the history of changes since the common
original "a line between original line #1 and #2 was inserted", "the
original line #2 was changed" and "the original line #3 was changed",
there would be no doubt that the correct net result must be
*abcd
1234
efxyz
ij
mnop
*No merge conflict! I believe the thing about git is that is has this
information and therefore that is can be smart.
So back to the my line of argument, that it has to be git and not github:
* The information needed to be smart in the final step has to be picked
up in the early steps
* The early steps are (potentially) going on outside github
* Therefore github cannot be "the smart one"
A very important thing for this to work is that everything is a fork. In
git a developer does not checkout a branch to do modifications on it. He
forks the branch to make his changes, and afterwards he pushes the
changes to the branch he forked from (his "upstream"). Those pushes are
explicit/built-in operations in git, and therefore git has a change to
pick up and maintain the necessary information, and keep track of it
transitively throughout a long chain of code-modifications. In SVN
merging is not a SVN-thing - only the commit is. I SVN when you merge
changes from branch1 into branch2, it just ends up in a commit on
branch2 - no information is maintained about fact that the changes in
this commit actually came from this and that change on branch1 (and that
those changes originally came from this and that changes on branchX and
branchY). For all of this to work everything needs to go on on separate
branches (forks) and a change to a branch only happens by pushes
(merges) from other branches (forks).
It is all about information - git has it, SVN doesnt. And my logical
sence tells me that is has to be git and not github!
:-) Now tell me that I am stupid :-)