Jump to content

Activity Team/Git Activity Maintainer Walkthrough: Difference between revisions

From Sugar Labs
Created page with 'NOTE: this IRC log would definitely need a good edit. Feel free to improve it. <pre> <bernie> godiard: then, regarding your second question, you'll need some git-fu. let me kno...'
 
No edit summary
Line 1: Line 1:
NOTE: this IRC log would definitely need a good edit. Feel free to improve it.
:'''<bernie>'''  godiard: then, regarding your second question, you'll need some git-fu. let me know when you're ready
 
:'''<bernie>'''  godiard: I'll guide you through the process
<pre>
:'''<godiard>'''  bernie: ok
 
:'''<godiard>'''  bernie: from comandline or from git.slo ?
<bernie> godiard: then, regarding your second question, you'll need some git-fu. let me know when you're ready
:'''<bernie>'''  godiard: cmdline
<bernie> godiard: I'll guide you through the process
:'''<bernie>'''  godiard: first of all, clone the mainline repo. perhaps you've done this already
<godiard> bernie: ok
:'''<bernie>'''  godiard: if you did use the git:// url for the initial checkout, you may have to update your configuration to use the ssh url
<godiard> bernie: from comandline or from git.slo ?
:'''<bernie>'''  godiard: otherwise, you won't be able to push
<bernie> godiard: cmdline
<bernie> godiard: first of all, clone the mainline repo. perhaps you've done this already
<bernie> godiard: if you did use the git:// url for the initial checkout, you may have to update your configuration to use the ssh url
<bernie> godiard: otherwise, you won't be able to push
* timClicks (~tim@219-89-80-120.adsl.xtra.co.nz) has joined #sugar
* timClicks (~tim@219-89-80-120.adsl.xtra.co.nz) has joined #sugar
<godiard> bernie: sorry, where is the ssh url?
:'''<godiard>'''  bernie: sorry, where is the ssh url?
<bernie> godiard: you can see it in the repo page
:'''<bernie>'''  godiard: you can see it in the repo page
<godiard> bernie: i do git clone git://git.sugarlabs.org/paint/mainline.git
:'''<godiard>'''  bernie: i do git clone git://git.sugarlabs.org/paint/mainline.git
<bernie> godiard: it's the third one
:'''<bernie>'''  godiard: it's the third one
<bernie> godiard: ok, if you did "git clone git://...", you can't push. the git:// protocol is unauthenticated and hence read-only
:'''<bernie>'''  godiard: ok, if you did "git clone git://...", you can't push. the git:// protocol is unauthenticated and hence read-only
<godiard> git push gitorious@git.sugarlabs.org:paint/mainline.git ?
:'''<godiard>'''  git push gitorious@git.sugarlabs.org:paint/mainline.git ?
<bernie> godiard: the url can be fixed afterwards by editing .git/config or, if you prefer to go by the rules, with the "git remote" command
:'''<bernie>'''  godiard: the url can be fixed afterwards by editing .git/config or, if you prefer to go by the rules, with the "git remote" command
<bernie> godiard: oh, this is another way to achieve it
:'''<bernie>'''  godiard: oh, this is another way to achieve it
<bernie> godiard: it's more inconvenient, though... you'd have to type the url every time you want to push.
:'''<bernie>'''  godiard: it's more inconvenient, though... you'd have to type the url every time you want to push.
<godiard> bernie: trying
:'''<godiard>'''  bernie: trying
<godiard> bernie: but i need to do the clone before the git remote
:'''<godiard>'''  bernie: but i need to do the clone before the git remote
<godiard> ?
:'''<godiard>'''  ?
<bernie> godiard: oh, I thought you had done a clone already... I was trying to save you time by changing the url in the existing repo
:'''<bernie>'''  godiard: oh, I thought you had done a clone already... I was trying to save you time by changing the url in the existing repo
<godiard> bernie:ok
:'''<godiard>'''  bernie:ok
<bernie> godiard: to answer your question: yes, git remote works from within an existing repo (which may be also a totally empty repo created with "git init")
:'''<bernie>'''  godiard: to answer your question: yes, git remote works from within an existing repo (which may be also a totally empty repo created with "git init")
<godiard> bernie: ok
:'''<godiard>'''  bernie: ok
<bernie> godiard: ok, once you have a repo checked out and the url is the ssh one, we may proceed.
:'''<bernie>'''  godiard: ok, once you have a repo checked out and the url is the ssh one, we may proceed.
>Quozl< git is so hard for newbies...
> Quozl:< git is so hard for newbies...
<godiard> bernie: i started again in another directory
:'''<godiard>'''  bernie: i started again in another directory
<godiard> bernie : i cloned mainline with git clone git://git.sugarlabs.org/paint/mainline.git
:'''<godiard>'''  bernie : i cloned mainline with git clone git://git.sugarlabs.org/paint/mainline.git
<godiard> bernie: in the page i don't found any ssh url
:'''<godiard>'''  bernie: in the page i don't found any ssh url
* kushal has quit (Ping timeout: 240 seconds)
* kushal has quit (Ping timeout: 240 seconds)
<bernie> godiard: odd... do you see your name on the right?
:'''<bernie>'''  godiard: odd... do you see your name on the right?
<bernie> godiard: are you logged in?
:'''<bernie>'''  godiard: are you logged in?
<godiard> bernie:yes
:'''<godiard>'''  bernie:yes
<bernie> godiard: you only see "Public clone url" and "HTTP clone url" ?
:'''<bernie>'''  godiard: you only see "Public clone url" and "HTTP clone url" ?
<bernie> godiard: are you looking here? http://git.sugarlabs.org/projects/paint/repos/mainline
:'''<bernie>'''  godiard: are you looking here? http://git.sugarlabs.org/projects/paint/repos/mainline
<godiard> bernie: yes and push url
:'''<godiard>'''  bernie: yes and push url
<bernie> godiard: aha! that's the ssh url
:'''<bernie>'''  godiard: aha! that's the ssh url
<godiard> ouch
:'''<godiard>'''  ouch
<bernie> godiard: (sorry, I don't see what you see because I don't have commit access to paint)
:'''<bernie>'''  godiard: (sorry, I don't see what you see because I don't have commit access to paint)
<godiard> but when i do "git remote add origin gitorious@git.sugarlabs.org:paint/mainline.git"
:'''<godiard>'''  but when i do "git remote add origin gitorious@git.sugarlabs.org:paint/mainline.git"
<bernie> godiard: so, since you checked out the git:// again, you'll have to edit .git/config and replace the url with this one
:'''<bernie>'''  godiard: so, since you checked out the git:// again, you'll have to edit .git/config and replace the url with this one
<godiard> i have "fatal: Not a git repository (or any of the parent directories): .git"
:'''<godiard>'''  i have "fatal: Not a git repository (or any of the parent directories): .git"
<bernie> godiard: odd
:'''<bernie>'''  godiard: odd
* bbellmyers (~bruce@71-215-240-171.mpls.qwest.net) has joined #sugar
* bbellmyers (~bruce@71-215-240-171.mpls.qwest.net) has joined #sugar
<godiard> bernie: i must do git init before git remote?
:'''<godiard>'''  bernie: i must do git init before git remote?
<bernie> godiard: are you into the checkout dir?
:'''<bernie>'''  godiard: are you into the checkout dir?
<bbellmyers> hey, re: standard cursors
:'''<bbellmyers>'''  hey, re: standard cursors
<bernie> godiard: if you did git clone .../mainline.git, your repo is probably in a dir called "mainline"
:'''<bernie>'''  godiard: if you did git clone .../mainline.git, your repo is probably in a dir called "mainline"
<godiard> ok
:'''<godiard>'''  ok
<godiard> cd mainline
:'''<godiard>'''  cd mainline
<bernie> godiard: i have a feeling that "git remote add ..." will fail again because you already have an origin configured now
:'''<bernie>'''  godiard: i have a feeling that "git remote add ..." will fail again because you already have an origin configured now
<bernie> godiard: for this case, new versions of git offer a command: "git remote set-url origin gitorious@git.sugarlabs.org:paint/mainline.git"
:'''<bernie>'''  godiard: for this case, new versions of git offer a command: "git remote set-url origin gitorious@git.sugarlabs.org:paint/mainline.git"
<godiard> try git remote in mainline?
:'''<godiard>'''  try git remote in mainline?
<Quozl> bernie: don't forget the opportunity to have godiard show you his .git/config
:'''<Quozl>'''  bernie: don't forget the opportunity to have godiard show you his .git/config
* pfroehlich_afk is now known as pfroehlich
* pfroehlich_afk is now known as pfroehlich
<bernie> godiard: git remote is kind of hard to use... this is why I was suggesting editing .git/config instead :-)
:'''<bernie>'''  godiard: git remote is kind of hard to use... this is why I was suggesting editing .git/config instead :-)
<godiard> ok
:'''<godiard>'''  ok
<Quozl> "git remote" is another interface to the file .git/config
:'''<Quozl>'''  "git remote" is another interface to the file .git/config
<bernie> godiard: all the command does is change that file
:'''<bernie>'''  godiard: all the command does is change that file
<godiard> ok, i am editing the file
:'''<godiard>'''  ok, i am editing the file
<godiard> i see a url parameter
:'''<godiard>'''  i see a url parameter
<bernie> git has plenty of UI sugar commands nowadays. the intent was to make it easier to use, but in my mind they made it more obfuscated.
:'''<bernie>'''  git has plenty of UI sugar commands nowadays. the intent was to make it easier to use, but in my mind they made it more obfuscated.
<godiard> bernie:i must change "git" by "gitorious"  ?
:'''<godiard>'''  bernie:i must change "git" by "gitorious"  ?
<bernie> like the "friendly" error messages with a dozen lines of justification for not doing what you wanted to do :-)
:'''<bernie>'''  like the "friendly" error messages with a dozen lines of justification for not doing what you wanted to do :-)
<bernie> godiard: you've got to change the entire url to  gitorious@git.sugarlabs.org:paint/mainline.git
:'''<bernie>'''  godiard: you've got to change the entire url to  gitorious@git.sugarlabs.org:paint/mainline.git
<godiard> bernie: ok
:'''<godiard>'''  bernie: ok
<bernie> godiard: note, it's easy to miss that this url has a ":" where the old one had "/".
:'''<bernie>'''  godiard: note, it's easy to miss that this url has a ":" where the old one had "/".
<bernie> godiard: a few days ago someone wasted a day because of this :-)
:'''<bernie>'''  godiard: a few days ago someone wasted a day because of this :-)
<godiard> :)
:'''<godiard>'''  :)
<Quozl> godiard: http://pastebin.ca/1879483 is my .git/config where i commit to a non-mainline paint repo.
:'''<Quozl>'''  godiard: http://pastebin.ca/1879483 is my .git/config where i commit to a non-mainline paint repo.
<godiard> can i acomment with # ?
:'''<godiard>'''  can i acomment with # ?
<bernie> godiard: yep
:'''<bernie>'''  godiard: yep
<Quozl> godiard: just so you see how other paint users use it.
:'''<Quozl>'''  godiard: just so you see how other paint users use it.
<Quozl> godiard: in my case i fetch from mainline and push to quozl.git
:'''<Quozl>'''  godiard: in my case i fetch from mainline and push to quozl.git
<walterbender> bernie: why are we suddenly having this / vs : problem?
:'''<walterbender>'''  bernie: why are we suddenly having this / vs : problem?
<bernie> godiard: now you should be able to do "git pull"... it will tell you that there's nothing new in the remote
:'''<bernie>'''  godiard: now you should be able to do "git pull"... it will tell you that there's nothing new in the remote
<godiard> quozl: thanks
:'''<godiard>'''  quozl: thanks
<bernie> walterbender: one is a real url (git://host/path)
:'''<bernie>'''  walterbender: one is a real url (git://host/path)
<bernie> walterbender: the other is an ssh address in the form  user@host:path
:'''<bernie>'''  walterbender: the other is an ssh address in the form  user@host:path
<Quozl> bernie: isn't there a URL form of the SSH address?
:'''<Quozl>'''  bernie: isn't there a URL form of the SSH address?
<godiard> bernie: git pull ok!
:'''<godiard>'''  bernie: git pull ok!
<bernie> walterbender: for symmetry, git also supports an ssh://user@host/url  syntax similar to svn... but it's rarely used
:'''<bernie>'''  walterbender: for symmetry, git also supports an ssh://user@host/url  syntax similar to svn... but it's rarely used
<bernie> Quozl: yep ^
:'''<bernie>'''  Quozl: yep ^
<bernie> godiard: ok, now I'll let you see around your repo so you gain confidence
:'''<bernie>'''  godiard: ok, now I'll let you see around your repo so you gain confidence
<bernie> godiard: first of all, I recommend looking at the history: git log
:'''<bernie>'''  godiard: first of all, I recommend looking at the history: git log
<godiard> bernie: ok, i see the same
:'''<godiard>'''  bernie: ok, i see the same
<bernie> godiard: for each commit, it will tell you who did it, when and hopefully also why
:'''<bernie>'''  godiard: for each commit, it will tell you who did it, when and hopefully also why
<bernie> godiard: to see even the patches, try "git log -p"
:'''<bernie>'''  godiard: to see even the patches, try "git log -p"
<Quozl> godiard: by the way, you can also test the effects of what you are about to do to mainline on git.sugarlabs.org ... by cloning that repository to your system, e.g. /tmp, and then pushing your changes to it and examining the effect.
:'''<Quozl>'''  godiard: by the way, you can also test the effects of what you are about to do to mainline on git.sugarlabs.org ... by cloning that repository to your system, e.g. /tmp, and then pushing your changes to it and examining the effect.
<bernie> godiard: oh yeah, this is a good way to experiment without breaking anything in the server
:'''<bernie>'''  godiard: oh yeah, this is a good way to experiment without breaking anything in the server
<Quozl> (e.g. pushing changes from your local clone that you want to keep, to a local clone that you have only for testing a push).
:'''<Quozl>'''  (e.g. pushing changes from your local clone that you want to keep, to a local clone that you have only for testing a push).
<bernie> godiard: an important concept to grasp in git is that your repo is only yours and you can mess it as much as you like. all your commits will remain local.
:'''<bernie>'''  godiard: an important concept to grasp in git is that your repo is only yours and you can mess it as much as you like. all your commits will remain local.
<bernie> godiard: until you do a "git push", or course.
:'''<bernie>'''  godiard: until you do a "git push", or course.
<godiard> bernie: ok
:'''<godiard>'''  bernie: ok
<godiard> bernie : i can do a rollback?
:'''<godiard>'''  bernie : i can do a rollback?
<bernie> godiard: every time you do a clone, it's an entire copy of the other repo and you can use it as the url for another clone and so on
:'''<bernie>'''  godiard: every time you do a clone, it's an entire copy of the other repo and you can use it as the url for another clone and so on
<bernie> godiard: yes, git has very powerful commands for undoing changes in many ways
:'''<bernie>'''  godiard: yes, git has very powerful commands for undoing changes in many ways
<bernie> godiard: "git reset", "git commit --amend"... it's almost unconfined because... the repo has only one user: you.
:'''<bernie>'''  godiard: "git reset", "git commit --amend"... it's almost unconfined because... the repo has only one user: you.
<godiard> bernie:ok
:'''<godiard>'''  bernie:ok
<bernie> godiard: ok, now look at what branches you have: git branch -a
:'''<bernie>'''  godiard: ok, now look at what branches you have: git branch -a
<bernie> godiard: you'll see a * next to the current one
:'''<bernie>'''  godiard: you'll see a * next to the current one
<bernie> godiard: it will probably be "master"
:'''<bernie>'''  godiard: it will probably be "master"
<Quozl> godiard: instead of rollback (as a concept), you can just checkout the hash before your commit, make your changes again, and commit again.
:'''<Quozl>'''  godiard: instead of rollback (as a concept), you can just checkout the hash before your commit, make your changes again, and commit again.
<godiard> ok
:'''<godiard>'''  ok
<Quozl> git repo is a series of alternate realities.
:'''<Quozl>'''  git repo is a series of alternate realities.
<Quozl> sometimes those alternate realities merge back together, but they don't have to unless you want them to.
:'''<Quozl>'''  sometimes those alternate realities merge back together, but they don't have to unless you want them to.
<bernie> godiard: now it's time for some rock & roll. add another remote: git remote add quozl git://git.sugarlabs.org/paint/quozl.git
:'''<bernie>'''  godiard: now it's time for some rock & roll. add another remote: git remote add quozl git://git.sugarlabs.org/paint/quozl.git
<godiard> ok
:'''<godiard>'''  ok
<bernie> godiard: now you can fetch the stuff that quozl did in his repo
:'''<bernie>'''  godiard: now you can fetch the stuff that quozl did in his repo
<bernie> godiard: are you planning to merge everything?
:'''<bernie>'''  godiard: are you planning to merge everything?
<godiard> quozl: i think so, any problem?
:'''<godiard>'''  quozl: i think so, any problem?
<Quozl> i suggest you consider rewriting some of the commit messages before you push.
:'''<Quozl>'''  i suggest you consider rewriting some of the commit messages before you push.
<Quozl> some of the commit messages are unduly brief and don't include what we learned in mail threads.
:'''<Quozl>'''  some of the commit messages are unduly brief and don't include what we learned in mail threads.
<bernie> Quozl: good idea... we'll use it as an excuse to show godiard how to do these advanced things too
:'''<bernie>'''  Quozl: good idea... we'll use it as an excuse to show godiard how to do these advanced things too
<bernie> godiard: ok, now the easiest and most non-destructive thing you could do is "fetch" from quozl repo
:'''<bernie>'''  godiard: ok, now the easiest and most non-destructive thing you could do is "fetch" from quozl repo
<bernie> godiard: like so: git fetch quozl
:'''<bernie>'''  godiard: like so: git fetch quozl
<Quozl> i'll do what godiard is doing too, so that i can learn.
:'''<Quozl>'''  i'll do what godiard is doing too, so that i can learn.
<bernie> godiard: "fetch" is a bit like clone, but you use it in an existing repo and it downloads only the objects that you don't already have.
:'''<bernie>'''  godiard: "fetch" is a bit like clone, but you use it in an existing repo and it downloads only the objects that you don't already have.
<godiard> bernie: ok, now i have the quozl remotes when i do "git branch -a"
:'''<godiard>'''  bernie: ok, now i have the quozl remotes when i do "git branch -a"
<Quozl> works for me.
:'''<Quozl>'''  works for me.
<bernie> godiard: hehe, you anticipated me this time!
:'''<bernie>'''  godiard: hehe, you anticipated me this time!
<bernie> godiard: ok, now you could look at what quozl has done in his repository: git log quozl/master
:'''<bernie>'''  godiard: ok, now you could look at what quozl has done in his repository: git log quozl/master
<bernie> godiard: I'm assuming that quozl also had a branch called "master", like you do
:'''<bernie>'''  godiard: I'm assuming that quozl also had a branch called "master", like you do
<bernie> godiard: because "master" is the name for the main branch in git, many repositories have it. but it's not obligatory
:'''<bernie>'''  godiard: because "master" is the name for the main branch in git, many repositories have it. but it's not obligatory
<godiard> bernie: yes, i see my changes
:'''<godiard>'''  bernie: yes, i see my changes
<Quozl> godiard: http://fpaste.org/oBJh/ ... shows me cloning mainline, adding my repo, fetching from my repo, and checking remote.
:'''<Quozl>'''  godiard: http://fpaste.org/oBJh/ ... shows me cloning mainline, adding my repo, fetching from my repo, and checking remote.
* dogi has quit (Ping timeout: 265 seconds)
* dogi has quit (Ping timeout: 265 seconds)
<bernie> godiard: aren't the first commits different from the ones in mainline?
:'''<bernie>'''  godiard: aren't the first commits different from the ones in mainline?
<Quozl> godiard: e430f2742f910d16a59318060bd39fc80e37822b for example has wrong author.
:'''<Quozl>'''  godiard: e430f2742f910d16a59318060bd39fc80e37822b for example has wrong author.
<bernie> Quozl: hehe, we can fix that :)
:'''<bernie>'''  Quozl: hehe, we can fix that :)
<Quozl> bernie: there are two lines of descent ... there were a few patches that Gonzalo sent before e-mail address was correct, such as 125a5dc57ab03bb8ac22cbcf259ede6b6857a338.
:'''<Quozl>'''  bernie: there are two lines of descent ... there were a few patches that Gonzalo sent before e-mail address was correct, such as 125a5dc57ab03bb8ac22cbcf259ede6b6857a338.
<godiard> yes
:'''<godiard>'''  yes
<bernie> Quozl: ah I see
:'''<bernie>'''  Quozl: ah I see
<bernie> godiard: ok, let me know when you feel ready for the next wave of distributed version control theory :)
:'''<bernie>'''  godiard: ok, let me know when you feel ready for the next wave of distributed version control theory :)
<godiard> tell me
:'''<godiard>'''  tell me
<godiard> my wife is calling me to dinner :)
:'''<godiard>'''  my wife is calling me to dinner :)
<Quozl> godiard: after cloning mainline.git and fetching quozl.git, the result is a repo that contains the patches but is currently showing files representing mainline.git's status.  fetch doesn't change the files, it only grabs patches.
:'''<Quozl>'''  godiard: after cloning mainline.git and fetching quozl.git, the result is a repo that contains the patches but is currently showing files representing mainline.git's status.  fetch doesn't change the files, it only grabs patches.
<Quozl> ah, bad time.
:'''<Quozl>'''  ah, bad time.
<bernie> godiard: ok, now normally one would do (don't do it!): git merge quozl/master
:'''<bernie>'''  godiard: ok, now normally one would do (don't do it!): git merge quozl/master
<Quozl> always pre-empt git with wife.  long learning.
:'''<Quozl>'''  always pre-empt git with wife.  long learning.
<bernie> godiard: this would do a so-called merge between your history and his history
:'''<bernie>'''  godiard: this would do a so-called merge between your history and his history
<bernie> godiard: it would look like this:
:'''<bernie>'''  godiard: it would look like this:
<bernie>                      A---B---C topic
 
<bernie>                    /        \
                      A---B---C topic
<bernie>                D---E---F---G---H master
                      /        \
<bernie> godiard: (the line between C and H is what  the merge does)
                D---E---F---G---H master
<godiard> ok
 
<bernie> godiard: this is very stupid and even cvs and svn could do it
:'''<bernie>'''  godiard: (the line between C and H is what  the merge does)
<bernie> godiard: but we want to do more
:'''<godiard>'''  ok
<bernie> godiard: we want to do something called a "rebase"
:'''<bernie>'''  godiard: this is very stupid and even cvs and svn could do it
<Quozl> the problem with doing "git merge quozl/master" at this point is that all of my mistakes in history are simply copied into mainline.
:'''<bernie>'''  godiard: but we want to do more
<bernie> Quozl: exactly!
:'''<bernie>'''  godiard: we want to do something called a "rebase"
<godiard> quozl: aha
:'''<Quozl>'''  the problem with doing "git merge quozl/master" at this point is that all of my mistakes in history are simply copied into mainline.
<Quozl> copying my bad history into mainline makes mainline history harder to read.
:'''<bernie>'''  Quozl: exactly!
>walterbender< are you enjoying the git class too? :-)
:'''<godiard>'''  quozl: aha
<bernie> godiard: the rebase would take the old history that looked like this:
:'''<Quozl>'''  copying my bad history into mainline makes mainline history harder to read.
<bernie>                      A---B---C topic
> walterbender:< are you enjoying the git class too? :-)
<bernie>                    /
:'''<bernie>'''  godiard: the rebase would take the old history that looked like this:
<bernie>                D---E---F---G master
 
<Quozl> godiard: the history of change to code is almost as valuable as the code itself, sometimes.
                      A---B---C topic
<bernie> godiard: and change it to a new history that looks like this:
                      /
<bernie>                              A´--B´--C´ topic
                D---E---F---G master
<bernie>                            /
 
<bernie>                D---E---F---G master
:'''<Quozl>'''  godiard: the history of change to code is almost as valuable as the code itself, sometimes.
<Quozl> (quozl.git is topic?)
:'''<bernie>'''  godiard: and change it to a new history that looks like this:
<bernie> godiard: take your time to see what is happening :)
 
<bernie> Quozl: yep
                              A´--B´--C´ topic
<godiard> bernie: ok
                              /
<bernie> Quozl: and yep, the history is important... maybe not in a small activity, but it's very important in a project the size of sugar
                D---E---F---G master
<godiard> bernie: i will to print this and read many times :)
 
<Quozl> godiard: you must go to dinner now?
:'''<Quozl>'''  (quozl.git is topic?)
<bernie> godiard: ok, git can do this almost automatically. sometimes it will need your help because A, B, C changed the same lines of E, F, G...
:'''<bernie>'''  godiard: take your time to see what is happening :)
<bernie> godiard: I can suggest some cool git tutorials and docs
:'''<bernie>'''  Quozl: yep
<godiard> bernie: this time is easy, mainline didn change
:'''<godiard>'''  bernie: ok
<bernie> godiard: anyway, after all the theory, all you need to do is: git rebase quozl/master
:'''<bernie>'''  Quozl: and yep, the history is important... maybe not in a small activity, but it's very important in a project the size of sugar
<bernie> godiard: WHAM! you have rebased
:'''<godiard>'''  bernie: i will to print this and read many times :)
<godiard> bernie: yes, i need read more
:'''<Quozl>'''  godiard: you must go to dinner now?
<godiard> bernie: i can do it now?
:'''<bernie>'''  godiard: ok, git can do this almost automatically. sometimes it will need your help because A, B, C changed the same lines of E, F, G...
<bernie> godiard: you could, but you would make a small mistake. I did it... so you can do it too and I'll show you how to remedy
:'''<bernie>'''  godiard: I can suggest some cool git tutorials and docs
<godiard> First, rewinding head to replay your work on top of it...
:'''<godiard>'''  bernie: this time is easy, mainline didn change
<godiard> Fast-forwarded master to quozl/master.
:'''<bernie>'''  godiard: anyway, after all the theory, all you need to do is: git rebase quozl/master
<Quozl> works for me too, but it looks the same in gitk.  what is the difference?
:'''<bernie>'''  godiard: WHAM! you have rebased
<bernie> godiard: ok, now look at the history... you have all the changes that quozl had done!
:'''<godiard>'''  bernie: yes, i need read more
<godiard> yes
:'''<godiard>'''  bernie: i can do it now?
:'''<bernie>'''  godiard: you could, but you would make a small mistake. I did it... so you can do it too and I'll show you how to remedy
:'''<godiard>'''  First, rewinding head to replay your work on top of it...
:'''<godiard>'''  Fast-forwarded master to quozl/master.
:'''<Quozl>'''  works for me too, but it looks the same in gitk.  what is the difference?
:'''<bernie>'''  godiard: ok, now look at the history... you have all the changes that quozl had done!
:'''<godiard>'''  yes
* tinker-f595 has quit (Quit: tinker-f595)
* tinker-f595 has quit (Quit: tinker-f595)
<Quozl> (including that double line of descent around #931 #1902 and #1015)
:'''<Quozl>'''  (including that double line of descent around #931 #1902 and #1015)
<bernie> Quozl: now all of your changes are also on the local master branch
:'''<bernie>'''  Quozl: now all of your changes are also on the local master branch
<godiard> then i must do push?
:'''<godiard>'''  then i must do push?
<bernie> godiard: ok, here's the mistake: we forgot to change all the commits to adjust the author and logs!
:'''<bernie>'''  godiard: ok, here's the mistake: we forgot to change all the commits to adjust the author and logs!
<godiard> aha
:'''<godiard>'''  aha
<godiard> i can do it in the local repo?
:'''<godiard>'''  i can do it in the local repo?
<bernie> Quozl: oh yeah, I see it. fixing it would require a little more work
:'''<bernie>'''  Quozl: oh yeah, I see it. fixing it would require a little more work
* chrowe has quit (Quit: chrowe)
* chrowe has quit (Quit: chrowe)
<bernie> godiard: yes, first we need to undo the rebase
:'''<bernie>'''  godiard: yes, first we need to undo the rebase
<bernie> godiard: I promised git can undo anything, but how can this be done?
:'''<bernie>'''  godiard: I promised git can undo anything, but how can this be done?
<godiard> bernie and quozl: sorry can we continue in 1 hour?
:'''<godiard>'''  bernie and quozl: sorry can we continue in 1 hour?
<bernie> godiard: if you remember what the first commit was before the rebase, you can return to it with "git reset --hard <commit-ish>"
:'''<bernie>'''  godiard: if you remember what the first commit was before the rebase, you can return to it with "git reset --hard <commit-ish> "
<bernie> godiard: sure
:'''<bernie>'''  godiard: sure
<bernie> godiard: see you later
:'''<bernie>'''  godiard: see you later
 
</pre>

Revision as of 23:04, 8 June 2010

<bernie> godiard: then, regarding your second question, you'll need some git-fu. let me know when you're ready
<bernie> godiard: I'll guide you through the process
<godiard> bernie: ok
<godiard> bernie: from comandline or from git.slo ?
<bernie> godiard: cmdline
<bernie> godiard: first of all, clone the mainline repo. perhaps you've done this already
<bernie> godiard: if you did use the git:// url for the initial checkout, you may have to update your configuration to use the ssh url
<bernie> godiard: otherwise, you won't be able to push
  • timClicks (~tim@219-89-80-120.adsl.xtra.co.nz) has joined #sugar
<godiard> bernie: sorry, where is the ssh url?
<bernie> godiard: you can see it in the repo page
<godiard> bernie: i do git clone git://git.sugarlabs.org/paint/mainline.git
<bernie> godiard: it's the third one
<bernie> godiard: ok, if you did "git clone git://...", you can't push. the git:// protocol is unauthenticated and hence read-only
<godiard> git push gitorious@git.sugarlabs.org:paint/mainline.git ?
<bernie> godiard: the url can be fixed afterwards by editing .git/config or, if you prefer to go by the rules, with the "git remote" command
<bernie> godiard: oh, this is another way to achieve it
<bernie> godiard: it's more inconvenient, though... you'd have to type the url every time you want to push.
<godiard> bernie: trying
<godiard> bernie: but i need to do the clone before the git remote
<godiard>  ?
<bernie> godiard: oh, I thought you had done a clone already... I was trying to save you time by changing the url in the existing repo
<godiard> bernie:ok
<bernie> godiard: to answer your question: yes, git remote works from within an existing repo (which may be also a totally empty repo created with "git init")
<godiard> bernie: ok
<bernie> godiard: ok, once you have a repo checked out and the url is the ssh one, we may proceed.

> Quozl:< git is so hard for newbies...

<godiard> bernie: i started again in another directory
<godiard> bernie : i cloned mainline with git clone git://git.sugarlabs.org/paint/mainline.git
<godiard> bernie: in the page i don't found any ssh url
  • kushal has quit (Ping timeout: 240 seconds)
<bernie> godiard: odd... do you see your name on the right?
<bernie> godiard: are you logged in?
<godiard> bernie:yes
<bernie> godiard: you only see "Public clone url" and "HTTP clone url" ?
<bernie> godiard: are you looking here? http://git.sugarlabs.org/projects/paint/repos/mainline
<godiard> bernie: yes and push url
<bernie> godiard: aha! that's the ssh url
<godiard> ouch
<bernie> godiard: (sorry, I don't see what you see because I don't have commit access to paint)
<godiard> but when i do "git remote add origin gitorious@git.sugarlabs.org:paint/mainline.git"
<bernie> godiard: so, since you checked out the git:// again, you'll have to edit .git/config and replace the url with this one
<godiard> i have "fatal: Not a git repository (or any of the parent directories): .git"
<bernie> godiard: odd
  • bbellmyers (~bruce@71-215-240-171.mpls.qwest.net) has joined #sugar
<godiard> bernie: i must do git init before git remote?
<bernie> godiard: are you into the checkout dir?
<bbellmyers> hey, re: standard cursors
<bernie> godiard: if you did git clone .../mainline.git, your repo is probably in a dir called "mainline"
<godiard> ok
<godiard> cd mainline
<bernie> godiard: i have a feeling that "git remote add ..." will fail again because you already have an origin configured now
<bernie> godiard: for this case, new versions of git offer a command: "git remote set-url origin gitorious@git.sugarlabs.org:paint/mainline.git"
<godiard> try git remote in mainline?
<Quozl> bernie: don't forget the opportunity to have godiard show you his .git/config
  • pfroehlich_afk is now known as pfroehlich
<bernie> godiard: git remote is kind of hard to use... this is why I was suggesting editing .git/config instead :-)
<godiard> ok
<Quozl> "git remote" is another interface to the file .git/config
<bernie> godiard: all the command does is change that file
<godiard> ok, i am editing the file
<godiard> i see a url parameter
<bernie> git has plenty of UI sugar commands nowadays. the intent was to make it easier to use, but in my mind they made it more obfuscated.
<godiard> bernie:i must change "git" by "gitorious"  ?
<bernie> like the "friendly" error messages with a dozen lines of justification for not doing what you wanted to do :-)
<bernie> godiard: you've got to change the entire url to gitorious@git.sugarlabs.org:paint/mainline.git
<godiard> bernie: ok
<bernie> godiard: note, it's easy to miss that this url has a ":" where the old one had "/".
<bernie> godiard: a few days ago someone wasted a day because of this :-)
<godiard>  :)
<Quozl> godiard: http://pastebin.ca/1879483 is my .git/config where i commit to a non-mainline paint repo.
<godiard> can i acomment with # ?
<bernie> godiard: yep
<Quozl> godiard: just so you see how other paint users use it.
<Quozl> godiard: in my case i fetch from mainline and push to quozl.git
<walterbender> bernie: why are we suddenly having this / vs : problem?
<bernie> godiard: now you should be able to do "git pull"... it will tell you that there's nothing new in the remote
<godiard> quozl: thanks
<bernie> walterbender: one is a real url (git://host/path)
<bernie> walterbender: the other is an ssh address in the form user@host:path
<Quozl> bernie: isn't there a URL form of the SSH address?
<godiard> bernie: git pull ok!
<bernie> walterbender: for symmetry, git also supports an ssh://user@host/url syntax similar to svn... but it's rarely used
<bernie> Quozl: yep ^
<bernie> godiard: ok, now I'll let you see around your repo so you gain confidence
<bernie> godiard: first of all, I recommend looking at the history: git log
<godiard> bernie: ok, i see the same
<bernie> godiard: for each commit, it will tell you who did it, when and hopefully also why
<bernie> godiard: to see even the patches, try "git log -p"
<Quozl> godiard: by the way, you can also test the effects of what you are about to do to mainline on git.sugarlabs.org ... by cloning that repository to your system, e.g. /tmp, and then pushing your changes to it and examining the effect.
<bernie> godiard: oh yeah, this is a good way to experiment without breaking anything in the server
<Quozl> (e.g. pushing changes from your local clone that you want to keep, to a local clone that you have only for testing a push).
<bernie> godiard: an important concept to grasp in git is that your repo is only yours and you can mess it as much as you like. all your commits will remain local.
<bernie> godiard: until you do a "git push", or course.
<godiard> bernie: ok
<godiard> bernie : i can do a rollback?
<bernie> godiard: every time you do a clone, it's an entire copy of the other repo and you can use it as the url for another clone and so on
<bernie> godiard: yes, git has very powerful commands for undoing changes in many ways
<bernie> godiard: "git reset", "git commit --amend"... it's almost unconfined because... the repo has only one user: you.
<godiard> bernie:ok
<bernie> godiard: ok, now look at what branches you have: git branch -a
<bernie> godiard: you'll see a * next to the current one
<bernie> godiard: it will probably be "master"
<Quozl> godiard: instead of rollback (as a concept), you can just checkout the hash before your commit, make your changes again, and commit again.
<godiard> ok
<Quozl> git repo is a series of alternate realities.
<Quozl> sometimes those alternate realities merge back together, but they don't have to unless you want them to.
<bernie> godiard: now it's time for some rock & roll. add another remote: git remote add quozl git://git.sugarlabs.org/paint/quozl.git
<godiard> ok
<bernie> godiard: now you can fetch the stuff that quozl did in his repo
<bernie> godiard: are you planning to merge everything?
<godiard> quozl: i think so, any problem?
<Quozl> i suggest you consider rewriting some of the commit messages before you push.
<Quozl> some of the commit messages are unduly brief and don't include what we learned in mail threads.
<bernie> Quozl: good idea... we'll use it as an excuse to show godiard how to do these advanced things too
<bernie> godiard: ok, now the easiest and most non-destructive thing you could do is "fetch" from quozl repo
<bernie> godiard: like so: git fetch quozl
<Quozl> i'll do what godiard is doing too, so that i can learn.
<bernie> godiard: "fetch" is a bit like clone, but you use it in an existing repo and it downloads only the objects that you don't already have.
<godiard> bernie: ok, now i have the quozl remotes when i do "git branch -a"
<Quozl> works for me.
<bernie> godiard: hehe, you anticipated me this time!
<bernie> godiard: ok, now you could look at what quozl has done in his repository: git log quozl/master
<bernie> godiard: I'm assuming that quozl also had a branch called "master", like you do
<bernie> godiard: because "master" is the name for the main branch in git, many repositories have it. but it's not obligatory
<godiard> bernie: yes, i see my changes
<Quozl> godiard: http://fpaste.org/oBJh/ ... shows me cloning mainline, adding my repo, fetching from my repo, and checking remote.
  • dogi has quit (Ping timeout: 265 seconds)
<bernie> godiard: aren't the first commits different from the ones in mainline?
<Quozl> godiard: e430f2742f910d16a59318060bd39fc80e37822b for example has wrong author.
<bernie> Quozl: hehe, we can fix that :)
<Quozl> bernie: there are two lines of descent ... there were a few patches that Gonzalo sent before e-mail address was correct, such as 125a5dc57ab03bb8ac22cbcf259ede6b6857a338.
<godiard> yes
<bernie> Quozl: ah I see
<bernie> godiard: ok, let me know when you feel ready for the next wave of distributed version control theory :)
<godiard> tell me
<godiard> my wife is calling me to dinner :)
<Quozl> godiard: after cloning mainline.git and fetching quozl.git, the result is a repo that contains the patches but is currently showing files representing mainline.git's status. fetch doesn't change the files, it only grabs patches.
<Quozl> ah, bad time.
<bernie> godiard: ok, now normally one would do (don't do it!): git merge quozl/master
<Quozl> always pre-empt git with wife. long learning.
<bernie> godiard: this would do a so-called merge between your history and his history
<bernie> godiard: it would look like this:
                      A---B---C topic
                     /         \
                D---E---F---G---H master
<bernie> godiard: (the line between C and H is what the merge does)
<godiard> ok
<bernie> godiard: this is very stupid and even cvs and svn could do it
<bernie> godiard: but we want to do more
<bernie> godiard: we want to do something called a "rebase"
<Quozl> the problem with doing "git merge quozl/master" at this point is that all of my mistakes in history are simply copied into mainline.
<bernie> Quozl: exactly!
<godiard> quozl: aha
<Quozl> copying my bad history into mainline makes mainline history harder to read.

> walterbender:< are you enjoying the git class too? :-)

<bernie> godiard: the rebase would take the old history that looked like this:
                      A---B---C topic
                     /
                D---E---F---G master
<Quozl> godiard: the history of change to code is almost as valuable as the code itself, sometimes.
<bernie> godiard: and change it to a new history that looks like this:
                              A´--B´--C´ topic
                             /
                D---E---F---G master
<Quozl> (quozl.git is topic?)
<bernie> godiard: take your time to see what is happening :)
<bernie> Quozl: yep
<godiard> bernie: ok
<bernie> Quozl: and yep, the history is important... maybe not in a small activity, but it's very important in a project the size of sugar
<godiard> bernie: i will to print this and read many times :)
<Quozl> godiard: you must go to dinner now?
<bernie> godiard: ok, git can do this almost automatically. sometimes it will need your help because A, B, C changed the same lines of E, F, G...
<bernie> godiard: I can suggest some cool git tutorials and docs
<godiard> bernie: this time is easy, mainline didn change
<bernie> godiard: anyway, after all the theory, all you need to do is: git rebase quozl/master
<bernie> godiard: WHAM! you have rebased
<godiard> bernie: yes, i need read more
<godiard> bernie: i can do it now?
<bernie> godiard: you could, but you would make a small mistake. I did it... so you can do it too and I'll show you how to remedy
<godiard> First, rewinding head to replay your work on top of it...
<godiard> Fast-forwarded master to quozl/master.
<Quozl> works for me too, but it looks the same in gitk. what is the difference?
<bernie> godiard: ok, now look at the history... you have all the changes that quozl had done!
<godiard> yes
  • tinker-f595 has quit (Quit: tinker-f595)
<Quozl> (including that double line of descent around #931 #1902 and #1015)
<bernie> Quozl: now all of your changes are also on the local master branch
<godiard> then i must do push?
<bernie> godiard: ok, here's the mistake: we forgot to change all the commits to adjust the author and logs!
<godiard> aha
<godiard> i can do it in the local repo?
<bernie> Quozl: oh yeah, I see it. fixing it would require a little more work
  • chrowe has quit (Quit: chrowe)
<bernie> godiard: yes, first we need to undo the rebase
<bernie> godiard: I promised git can undo anything, but how can this be done?
<godiard> bernie and quozl: sorry can we continue in 1 hour?
<bernie> godiard: if you remember what the first commit was before the rebase, you can return to it with "git reset --hard <commit-ish> "
<bernie> godiard: sure
<bernie> godiard: see you later