git.rst
changeset 1002 234cd58cae56
child 1032 4decc3e00bb6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/git.rst	Fri Sep 23 12:46:18 2011 +0300
@@ -0,0 +1,351 @@
+.. -*- coding: utf-8; -*-
+
+======
+ Git.
+======
+
+Setup git.
+==========
+
+Debian.
+-------
+
+For Etch Degian release use git-core package from backports,
+old 1.4 version of git very dumb compared to new version 1.5::
+
+  $ sudo apt-get install git-core
+
+After install setup some options::
+
+  $ git config --global user.name "Oleksandr Gavenko"
+  $ git config --global user.mail "gavenkoa@gmail.com"
+  $ cat ~/.gitconfig
+  [user]
+    name = Oleksandr Gavenko
+    mail = gavenkoa@gmail.com
+
+Windows.
+--------
+
+No official support for Windows OS.
+
+Cygwin.
+-------
+
+  $ setup.exe -p git
+
+git over proxy.
+===============
+
+Only http:// protocol support proxy (not git://)::
+
+  $ export http_proxy="http://username:password@proxy:port/"
+  $ git clone http://github.com/$user/$proj.git $proj
+
+You can store proxy settings under repository local config file::
+
+  $ git config http.proxy http://$user:$passwd@$ip:$port
+
+Start your project.
+===================
+
+Setup proj space on fs::
+
+  $ mkdir proj
+  $ cd proj
+  $ git init
+  Initialized empty Git repository in /home/user/tmp/proj/.git/
+  $ ls -a
+  . .. .git
+
+Add file, make changes, commit all::
+
+  $ emacs Makefile
+  ... C-x C-c
+  $ emacs app.c
+  ... C-x C-c
+  $ git add Makefile app.c
+  $ git status
+  # On branch master
+  #
+  # Initial commit
+  #
+  # Changes to be committed:
+  #   (use "git rm --cached <file>..." to unstage)
+  #
+  #       new file: Makefile
+  #       new file: app.c
+  #
+
+or just::
+
+  $ git add .
+
+Commit newlly added file::
+
+  $ git commit
+  ... Write message log ...
+  Created initial commit 2169263: My first commit massage.
+   1 files changed, 4 insertions(+), 0 deletions(-)
+   create mode 100644 app.c
+
+Undo tracking added file.
+=========================
+
+You do::
+
+  $ git add badfile
+  $ git status
+  # On branch master
+  # Changes to be committed:
+  #   (use "git reset HEAD <file>..." to unstage)
+  #
+  #       new file:   badfile
+  #
+
+To stop tracking badfile do::
+
+  $ git rm --cached badfile
+  $ git status
+  # On branch master
+  # Untracked files:
+  #   (use "git add <file>..." to include in what will be committed)
+  #
+  #       file
+  nothing added to commit but untracked files present (use "git add" to track)
+
+or::
+
+  $ git reset badfile
+
+Doing changes.
+==============
+::
+
+  $ printf "clean:\n<TAB>rm $(wildcard *.o)\n" >>Makefile
+  $ git diff
+  diff --git a/Makefile b/Makefile
+  index e84f7e9..cd2438a 100644
+  --- a/Makefile
+  +++ b/Makefile
+  @@ -1,2 +1,5 @@
+   all:
+          @echo XXX
+          exit 1
+  +
+  +clean:
+  +       rm -f *.o
+    $ git add Makefile
+    $ git commit -m "Added clean target."
+  Created commit 11272b9: Added clean target.
+   1 files changed, 1 insertions(+), 0 deletions(-)
+   create mode 100644 file
+
+or just::
+
+  $ git commit -a -m "Added clean target."
+
+git analog of 'hg incoming'.
+============================
+
+git does not directly support such feature. You can emulate it by::
+
+  $ git fetch
+  $ git log master..origin/master   # or just '..origin/master'
+
+By previous commands you grab changes from remote server! You can apply them::
+
+  TODO
+  $ git merge
+
+git analog of 'hg outgoing'.
+============================
+
+git does not directly support such feature. You can emulate it by::
+
+  $ git fetch
+  $ git log origin/master..master   # or just 'origin/master..'
+
+Debug git network operation.
+============================
+
+Git uses libcurl for network operation::
+
+  $ export GIT_CURL_VERBOSE=1
+  $ git ...
+
+Using git to work with SVN offline.
+===================================
+
+Prepare SVN and git utilities::
+
+  $ sudo apt-get svn git-core git-svn
+
+Making SVN repo::
+
+    $ cd $HOME/tmp
+    $ svnadmin create svn-repo
+    $ svn co file://$HOME/tmp/svn-repo svn-devel
+    $ cd svn-devel
+    $ mkdir tags trunk branches
+    $ svn add *
+  A         branches
+  A         tags
+  A         trunk
+    $ cd trunk/
+    $ printf "all:\n  echo XXX\n" >Makefile
+    $ printf "int main() {return 0;}" >main.c
+    $ svn add *
+    $ cd ..
+    $ svn st
+  A      trunk
+  A      trunk/main.c
+  A      trunk/Makefile
+  A      branches
+  A      tags
+    $ svn ci -m init
+  Adding         branches
+  Adding         tags
+  Adding         trunk
+  Adding         trunk/Makefile
+  Adding         trunk/main.c
+  Transmitting file data ..
+    $ svn cp -m v0.0 file://$HOME/tmp/svn/trunk file://$HOME/tmp/svn/tags/v0.0
+    $ svn cp -m v0.1 file://$HOME/tmp/svn/trunk file://$HOME/tmp/svn/branches/v0.1
+
+Moving SVN changset to git repo::
+
+    $ cd $HOME/tmp
+    $ git svn init file://$HOME/tmp/svn git-repo
+    $ ls -a
+  .  ..  .git
+    $ git svn fetch
+      A   trunk/main.c
+      A   trunk/Makefile
+  W: +empty_dir: branches
+  W: +empty_dir: tags
+  r1 = 52ccd9882979dd53ec198dbac108783ec660410f (git-svn)
+      A   tags/v0.0/main.c
+      A   tags/v0.0/Makefile
+  r2 = 8ec8a772bb6f37ace56b3649066dc84e481ed427 (git-svn)
+      M   trunk/Makefile
+  r3 = 2c169ff409ed504dd6a092b1e302beb3fd94871e (git-svn)
+      A   branches/v0.1/main.c
+      A   branches/v0.1/Makefile
+  r4 = e68d76f4ba6beea4b9059c1884c1f38ce10831a7 (git-svn)
+      M   trunk/Makefile
+  r5 = cdde63974454b13ac53f2eeb201aa76c49fd875c (git-svn)
+  Checked out HEAD:
+    file:///home/sasha/tmp/svn r5
+
+or (in old git version)::
+
+  $ git svn clone file://$HOME/tmp/svn git-repo
+
+Making changes in svn::
+
+    $ cd $HOME/tmp/svn-devel/trunk
+    $ echo ".PHONY: clean" >>Makefile
+    $ svn ci -m "Added clean to phony."
+  Sending        trunk/Makefile
+  Transmitting file data .
+  Committed revision 6.
+
+Making committed in git::
+
+    $ cd $HOME/tmp/git-repo/trunk
+    $ echo ".PHONY: all" >>Makefile
+    $ echo "int foo(int x) {return x+x;}" >>main.c
+    $ git status
+  # On branch master
+  # Changed but not updated:
+  #   (use "git add <file>..." to update what will be committed)
+  #
+  #       modified:   Makefile
+  #       modified:   main.c
+  #
+  no changes added to commit (use "git add" and/or "git commit -a")
+    $ git commit -a -m "Bug fixed."
+  Created commit 222d399: Bug fixed.
+   2 files changed, 2 insertions(+), 0 deletions(-)
+
+Getting changes from SVN to git::
+
+    $ git svn rebase
+      M   trunk/Makefile
+  r6 = 8165e9bfb38e9df09a7313d19606ec227629b670 (git-svn)
+  First, rewinding head to replay your work on top of it...
+  Applying Bug fixed.
+  error: patch failed: trunk/Makefile:6
+  error: trunk/Makefile: patch does not apply
+  Using index info to reconstruct a base tree...
+  Falling back to patching base and 3-way merge...
+  Auto-merged trunk/Makefile
+  CONFLICT (content): Merge conflict in trunk/Makefile
+  Failed to merge in the changes.
+  Patch failed at 0001.
+
+  When you have resolved this problem run "git rebase --continue".
+  If you would prefer to skip this patch, instead run "git rebase --skip".
+  To restore the original branch and stop rebasing run "git rebase --abort".
+
+  rebase refs/remotes/git-svn: command returned error: 1
+    $ git add Makefile
+    $ git rebase --continue
+  Applying Bug fixed.
+
+and return all from git to SVN::
+
+    $ git svn dcommit
+  Committing to file:///home/sasha/tmp/svn ...
+      M   trunk/Makefile
+      M   trunk/main.c
+  Committed r7
+      M   trunk/main.c
+      M   trunk/Makefile
+  r7 = 68e782c8d06635f2db4dd69b9ca8599f99da22e2 (git-svn)
+  No changes between current HEAD and refs/remotes/git-svn
+  Resetting to the latest refs/remotes/git-svn
+
+See what going to SVN repo::
+
+    $ cd $HOME/tmp/svn-devel/trunk
+    $ svn diff -r BASE:HEAD
+  Index: Makefile
+  ===================================================================
+  --- Makefile    (working copy)
+  +++ Makefile    (revision 7)
+  @@ -6,4 +6,4 @@
+   .o: .c
+      $(CC) $(CFLAGS) -c -o $@ $<
+
+  -.PHONY: clean
+  +.PHONY: all clean
+  Index: main.c
+  ===================================================================
+  --- main.c  (working copy)
+  +++ main.c  (revision 7)
+  @@ -2,3 +2,4 @@
+   {
+       return 0;
+   }
+  +int foo(int x) {return x+x;}
+    $ svn up
+  U    Makefile
+  U    main.c
+  Updated to revision 7.
+
+gitk.
+=====
+
+gitk - The git repository browser. See gitk(1).
+
+Installing::
+
+  $ sudo apt-get instal gitk
+
+Using::
+
+  $ cd /path/to/git-repo
+  $ gitk
+