GitPhraseBook

From Openembedded.org
Revision as of 20:02, 27 February 2009 by 77.23.114.46 (talk) (Add link to the GIT community book)
Jump to navigation Jump to search

Git Phrase Book

NOTE: For increased pleasure use git 1.5 or later.

Pointers

There are plenty of good git tutorials on the net. A small collection of links can be seen below:

Setup

Getting the data (read-only)

 git clone git://git.openembedded.net/openembedded

Getting the data (write-access)

For this command to succeed you need to have provided a SSH key (see #Generating a ssh key).

 git clone git@git.openembedded.net:openembedded

Generating a ssh key

To be able to push to the OpenEmbedded git server you will need to have the right permissions. This starts with having your public ssh key on the server. Generate a key and send the public key to the one of the core developers.

 # send the resulting pub key to koen, mickeyl, RP, or zecke [email address]
 ssh-keygen -t rsa or -t dsa

Upgrading your data (lurking)

 git pull --rebase

This command will fetch new objects from the server, and try to put your local changes on top of the newly fetched revisions for your current branch. If you have no local revisions you will still be updated.

Depending on your git version this command may fail and does not report any error message: Version 1.5.6.5 (Debian Lenny) does, 1.5.5.1 (Fedora 9) does not. The message is "refusing to pull with rebase: your working tree is not up-to-date".

In case that 'git pull --rebase' does not work for you try the following:

 git stash
 git pull --rebase
 git stash apply
 git stash clear    /* to clear the stash stack */

This information was taken from the VideoLAN Wiki.

Checking out a branch

 # See which branches are available
 git branch -a
 # In theory create a branch and switch
 git checkout -b local origin/remote
 # you will now be in the dreambox branch and track this.
 git checkout -b org.openembedded.dreambox origin/org.openembedded.dreambox

Configuring your tree for commits

If you forget this, your name and email in the commit mails, may be messed up.

 git config user.name "Your Name"
 git config user.email "you@name"

Doing things with git

Commit Message

<package name> <version>| <package category> | <configfile/class name>: <summary> 
{  - <detail 1>
   - <detail 2>}*

Making your changes (old way)

 # if you have new files
 git add your/new/file
 # Commit everything
 git commit -a

Making your changes (better way)

 git add your/changed/files
 git commit

Making your changes (a cool way)

 git add -i
 git commit

Amending to your changes

You forgot something, no big deal, change the commit

 git add your/others/changes
 git commit --amend

Commiting someones else work

 git commit --author "Other One <other@one>"

Pushing your changes

 # just pushes the org.openembedded.dev
 git push origin org.openembedded.dev
 # the same, just simpler
 git push
 # just pushes your things to a test branch. Use the right branch! dangerous!
 git push origin yourname/testbranch
 # delete a branch
 git push origin :yourname/testbranch

Dealing with conflicts

Git will tell you what needs resolving. You can use kdiff3, meld, or many other tools to resolve the conflict. Don't be afraid you can easily redo and undo everything.

 # Conflicts from here or something else
 git pull --rebase
 git status
 # Starts interactive resolver, TOOL can be kdiff3, meld or anything else
 git mergetool --tool=TOOL filename
 git rebase --continue or similar once everything got resolved

Working with git

Feature branches

Create your own short lived feature branch

 git checkout -b yourname/yourfeature origin/org.openembedded.dev

Push your feature branch

 git push origin yourname/yourfeature

Delete your branch after it was merged

 git push origin :yourname/yourfeature

Upgrade/Rebase your branch to the latest version

 git fetch origin
 git rebase origin/org.openembedded.dev

Change your history

 # select edit, squash, pick to say what to do with the commit
 git rebase -i origin/org.openembedded.dev
 # to abort the operation on a tricky merge
 git rebase --abort
 # to find out a previous state to use with git reset
 git reflog

Seeing changes

Log

 # See what happened in a branch
 git log branch
 # See the change, HEAD or branch name will work too
 git show --color (COMMIT)
 #  Only show you change on foo/file
 git show --color HEAD -- foo/file
 # Graphical browser
 gitk

What did you change

 # Lists you the revs that are only in your branch compared to org.openembedded.dev
 git rev-list origin/org.openembedded.dev..

Other Interesting commands

 # fetch new revisions from all remote repositories
 git fetch
 # show your local branches and which branch you are in
 git branch
 # show your all branches
 git branch -a
 # create a branch and switch to it
 git checkout -b MYNAME origin/THEIRNAME
 # upgrade a branch
 git push origin org.openembedded.dev
 git reflog
 # Change your index to be at the state of REF
 git reset REF
 # Kill the last commit
 git reset HEAD^1

Working with additional git repositories

One of the neat things with git is you can easily work with external repositories.

 # add an external repository:
 git remote add openmoko.org git://git.openmoko.org/git/openmoko.git
 git fetch openmoko.org
 
 # view all remote branches available
 git branch -r
 # view changes on a remote branch
 gitk openmoko.org/org.openmoko.asu.stable
 git log openmoko.org/org.openmoko.asu.stable
 # view all diffs
 git diff origin/org.openembedded.dev openmoko.org/org.openmoko.asu.stable
 
 # view diffs in just one subdirectory
 git diff origin/org.openembedded.dev openmoko.org/org.openmoko.asu.stable classes


Examples

Example 1:

 vi packages/gaim/gaim.inc
 git commit packages/gaim/gaim.inc
 git pull --rebase

should have a log message like this:

gaim: make sure do_install does its job in gaim.inc
* install lib to ${libdir} instead of /usr/lib
* remove executable bits from docs

Example 2:

diff /tmp/foo.c /oe/work/gtk+-2.8.4-r0/gtk+-2.8.4/src/foo.c > gtk-2.8.4/fix-foo.patch
vi gtk+_2.8.4.bb
git add gtk-2.8.4/fix-foo.patch
git commit gtk-2.8.4/fix-foo.patch gtk+_2.8.4.bb
git pull --rebase

should have a log message like this:

gtk+ 2.8.4: add patch for buffer overflow