Difference between revisions of "Git"

From VideoLAN Wiki
Jump to navigation Jump to search
Line 45: Line 45:
 
  $ git pull --rebase origin
 
  $ git pull --rebase origin
 
voilà! Your commit will be re-applied on top of the origin (the svn trunk).
 
voilà! Your commit will be re-applied on top of the origin (the svn trunk).
If you don't want to have to hit --rebase everytime you pull do:
+
If you don't want to have to type --rebase everytime you pull do:
 
  $ git config branch.master.rebase true
 
  $ git config branch.master.rebase true
  
Line 152: Line 152:
 
* Make sure you've set your name and email in your commits
 
* Make sure you've set your name and email in your commits
 
== Staying up to date ==
 
== Staying up to date ==
 +
  $ git pull --rebase
 +
 +
If you don't want to have to type --rebase everytime you pull do:
 +
$ git config branch.master.rebase true
 +
 +
This one creates a merge object which is not how SVN worked, so let's use the first version...
 
   $ git pull
 
   $ git pull
  

Revision as of 02:11, 1 March 2008

For your convenience, a git mirror of the VLC svn tree has been set up. Here is a tutorial on how to use the git VLC repository.

You can read more about the VLC svn tree on our Subversion wiki page.

Basic Git usage

Getting VLC source code via Git

$ git clone git://git.videolan.org/vlc.git

Voilà! The full VLC history should be on your hard disk in vlc/. Type

$ git log

to see the full log of the trunk.

$ gitk

to see the log graphically.

You can also browse the sources via gitweb.


Configure your local git repository

Tell git your name. (use mostly by git-commit)

$ git repo-config user.name "Your Name"
$ git repo-config user.email "me@example.com"


List the local branch

You can now list your local branch by doing

$ git branch

which should ouput

$ git branch
* master

List your local non committed changes

$ git status | less

Commit

Now you can start to work on your tree. As soon as you feel you've reached a step in developement you can commit locally your work by

$ git commit -a

or

$ git commit <specific files>


List your commits

$ git log


Keeping your local working branch in sync

$ git pull --rebase origin

voilà! Your commit will be re-applied on top of the origin (the svn trunk). If you don't want to have to type --rebase everytime you pull do:

$ git config branch.master.rebase true

Submitting patches to the vlc-devel

If you have been developing on vlc locally and (still) don't have write access, you can submit all your commit in one shot using:

$ git format-patch -o out origin

which will produce the patches for each local commit in the directory "out". You can also use the git-imap-send command:

$ git format-patch --stdout --attach -n origin | git-imap-send

which will directly produces the emails and store them in a imap mail box, provided that you have properly set up git-imap-send.


Advanced usage

Creating a secondary local branch

If you want to work on a specific project that could require a branch of the trunk, create a local branch of the current branch by doing:

$ git branch mywork

and to actually use it do:

$ git checkout mywork

Which could be summarized by:

$ git checkout -b mywork

Then do some commit on it... And you can go back to your original master branch by doing:

$ git checkout master

Fetching a remote branch

If the remote branch is named avacore_branch

$ git checkout origin/avacore_branch

To stay up-to-date a simple

$ git fetch

Should be enough.

Revert your non-committed local changes

$ git checkout -f

Undo commit

This will undo the last commit

$ git reset HEAD^

which is the same as

$ git reset master^

(if you are checked-out copy of your tree is master) And also the same as

$ git reset a44a594 # note that there is no need to use the full sha id

If you have a stack of patch that you have not yet committed you can delete one patch from the list using git rebase --interactive

$ git rebase --interactive origin
 pick eacf185 test
 pick 56322eb VLMA owner is vlma prod.

 # Rebase 826757e..56322eb onto 826757e
 #
 # Commands:
 #  pick = use commit
 #  edit = use commit, but stop for amending
 #  squash = use commit, but meld into previous commit

Diff-ing

  • You can diff between two branches using
$ git diff branch1 branch2
  • You can diff between the previous 10th commit and current using
$ git diff HEAD~10 HEAD
  • You can diff between the previous 10th commit and current of the branch "mywork" using
$ git diff mywork~10 mywork
  • Imagine that git log is like
$ git log
commit e0394f269305edd09843257e7c1d1a66aaf48ab3
Author: jb <jb>
Date:   Fri Apr 13 07:14:48 2007 +0000
   qt4 - Mousewheel (2)
commit e80b339081aa6755f67c9bd8e2aacf93a9a79d95
[..]
commit ff7004b70fd239e4120deb160e2991bd5237b8df
[..]
commit a44a594898f981a145cfcace5f16f8973f9eb46f
[..]
commit 690df705c963cf6bf6f5746d54bc97a85ff91919
[..]
commit 679f8b1c3e0baa469efa970588b95a625c595d64
[..]
$ git diff a44a594898f981a145cfcace5f16f8973f9eb46f~2 e80b339081aa6755f67c9bd8e2aacf93a9a79d95

Will be equivalent to:

$ git diff ff7004b70fd239e4120deb160e2991bd5237b8df e80b339081aa6755f67c9bd8e2aacf93a9a79d95

And to:

$ git diff HEAD~4 HEAD^
  • Remember that to produce a patch you should rather use git-format-patch than git-diff most of the time.

Tracking regression

git has a great tool called git-bisect to help you to track a faulty commit. Imagine you are tracking a bug that is known to appear after 0.8.6 (assuming 0.8.6 is tagged):

$ git bisect start
$ git bisect bad # tell git current version has the bug you are tracking
$ git bisect good 0.8.6 # tell git 0.8.6 didn't has the bug

And then git will checkout a certain revision, and ask you to test it. And you simply say whether this version has the bug. If it has the bug:

$ git bisect bad

if the bug is not present:

$ git bisect good

And so on by bisection... At the end git will indicate the faulty commit. Most of the time this tool is really efficient to track regression.

If you can provide a script that test the presence of the bug

$ git bisect run <script_name>

will be able to track down the regression by itself. See git-bisect Documentation.

Using Git to push to VideoLAN git

Initial requirement

  • Make sure you've set your name and email in your commits

Staying up to date

 $ git pull --rebase

If you don't want to have to type --rebase everytime you pull do:

$ git config branch.master.rebase true

This one creates a merge object which is not how SVN worked, so let's use the first version...

 $ git pull

Pushing your work

 $ git push

Using Git (and git-svn) to commit on VideoLAN SVN trunk

Initial checkout

First get the official VLC svn trunk within git

$ git-svn init svn://your_committer_login@svn.videolan.org/vlc

If you want the full history skip this step:

$ git-svn fetch -r19800

Now get the get the rest

$ git-svn fetch

Compress the tree:

$ git repack -d

Keeping in sync

$ git-svn fetch
$ git rebase

Commit to VLC svn through git-svn

Once you've locally committed your changes you should be able to commit them to the remote svn branch by doing:

$ git-svn dcommit

Note that with git-svn, you'll lost some of the git advantages, and it will probably introduce some overhead in some cases.

Using Git to publish your work (for SoC student?)

First get the official VLC Soc trunk

$ git clone git://git.videolan.org/vlc-soc.git
$ cd vlc-soc

Ask for write access to a branch (called your_name_branch). Now we will make git know that you want to publish on this branch

$ git config remote.my_soc_public_branch.url ssh://your_name@altair.videolan.org/home/videolan/gitroot/vlc-soc.git

Now tell git that you want to automatically push the local master branch to the public your_name_branch:

$ git config remote.my_soc_public_branch.push +master:your_name_branch # the "+" will tell git to force update ignoring conflicts

Do some work and commit it to your master branch.

$ git commit -a

You can also sync with the trunk (origin) as needed

$ git fetch origin
$ git rebase origin

And don't forget to publish your changes:

$ git push my_soc_public_branch

Now you should be able to see your latest changes in your branch via gitweb.

Documentation about git