===== GIT =====
===== References =====
* http://www.siteduzero.com/informatique/tutoriels/gerez-vos-codes-source-avec-git
* http://www.pierreschambacher.com/blog/git-in-a-nutshell/
* http://tutoriels.itaapy.com/wiki/tutoriel-git/
* https://help.github.com/articles/set-up-git
* http://www.jedi.be/blog/2009/05/06/8-ways-to-share-your-git-repository/
* http://www.fclose.com/b/linux/366/set-up-git-server-through-ssh-connection/
* http://othiebaut.developpez.com/tutoriels/general/git-on-debian/
* http://git-scm.com/book/fr/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants
===== Configuration locale =====
$ mkdir Git
$ cd Git
$ git config --global user.name jehanproc
$ git config --global user.email my.mail@int-evry.fr
$ git config --global color.diff auto
$ git config --global color.status auto
$ git config --global color.branch auto
$ git init
Initialized empty Git repository in /mci/mci/login/Git/.git/
$ cat ~/.gitconfig
[user]
name = jehanproc
email = my.mail@int-evry.fr
[color]
diff = auto
status = auto
branch = auto
===== manipulations =====
==== statut initial ====
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
==== ajout 1er fichier ====
$ vim file1.txt
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# file1.txt
nothing added to commit but untracked files present (use "git add" to track)
$ git add file1.txt
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached ..." to unstage)
#
# new file: file1.txt
==== commit ====
$ git commit -m "add initial file1.txt"
[master (root-commit) b679adb] add initial file1.txt
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file1.txt
$ git status
# On branch master
nothing to commit (working directory clean)
==== modification ====
$ vim file1.txt
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: file1.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
==== diff ====
$ git diff
diff --git a/file1.txt b/file1.txt
index ce01362..94954ab 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1 +1,2 @@
hello
+world
==== commit du diff ====
commit -a = commit de toutes les modifications .
$ git commit -a -m "modification de file1.txt -> +world"
[master 9058851] modification de file1.txt -> +world
1 files changed, 1 insertions(+), 0 deletions(-)
$ git status
# On branch master
nothing to commit (working directory clean)
==== affichage log ====
$ git log
commit 9058851ef6738163117ada54a94dbfc04365061c
Author: jehanproc
Date: Tue Apr 9 10:01:05 2013 +0200
modification de file1.txt -> +world
commit b679adb3b2e2fa5e30d1f52b2fa4f12cff888b66
Author: jehanproc
Date: Tue Apr 9 09:51:01 2013 +0200
add initial file1.txt
==== annuler le dernier commit ====
$ git reset --hard HEAD^
HEAD is now at b679adb add initial file1.txt
$ cat file1.txt
hello
===== branch =====
par defaut, une seule branche *master*
$ git branch
* master
creation d'un branche *option1* , ne modifie en rien les fichiers (pas de recopie)
$ git branch option1
$ git branch
* master
option1
$ ls -al
total 52
-rw-r--r-- 1 login mci 6 9 avril 10:11 file1.txt
drwxr-xr-x 8 login mci 4096 9 avril 10:11 .git
passage sur la branche option1 , git checkout est utilisé pour changer de branche mais aussi pour restaurer un fichier tel qu’il était lors du dernier commit. La commande a donc un double usage.
$ git checkout option1
Switched to branch 'option1'
$ git branch
master
* option1
$ ls -al
total 52
-rw-r--r-- 1 login mci 6 9 avril 10:11 file1.txt
drwxr-xr-x 8 login mci 4096 9 avril 10:28 .git
==== modif branche ====
$ vim file1.txt
$ cat file1.txt
hello
wild
$ git commit -a -m "ajout l3 wild dans file1"
[option1 9c17567] ajout l3 wild dans file1
1 files changed, 2 insertions(+), 0 deletions(-)
$ git status
# On branch option1
nothing to commit (working directory clean)
$ git log
commit 9c17567714d9158126d39d3b1dda20ebe5146d82
Author: jehanproc
Date: Tue Apr 9 11:18:36 2013 +0200
ajout l3 wild dans file1
commit b679adb3b2e2fa5e30d1f52b2fa4f12cff888b66
Author: jehanproc
Date: Tue Apr 9 09:51:01 2013 +0200
add initial file1.txt
==== branch master ====
$ git checkout master
Switched to branch 'master'
$ git log
commit b679adb3b2e2fa5e30d1f52b2fa4f12cff888b66
Author: jehanproc
Date: Tue Apr 9 09:51:01 2013 +0200
add initial file1.txt
$ cat file1.txt
hello
modification
$ vim file1.txt
$ cat file1.txt
hello
world
$ git commit -a -m "add l2 +world file1"
[master 5d03c08] add l2 +world file1
1 files changed, 1 insertions(+), 0 deletions(-)
==== merge ====
on merge option1 dans master
$ git merge option1
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
constat du conflit
$ cat file1.txt
hello
<<<<<<< HEAD
world
=======
wild
>>>>>>> option1
gestion du conflit
$ vim file1.txt
$ cat file1.txt
hello
world
wild
commit
$ git commit -a -m "marge master et option1, resolution conflit file1"
[master 8fedaa6] marge master et option1, resolution conflit file1
$ git status
# On branch master
nothing to commit (working directory clean)
Destruction de branche .
$ git branch -d option1
Deleted branch option1 (was 9c17567).
===== ssh git server =====
==== cle ssh ====
echange de clé avant "fermeture" du shell gituser
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gituser/.ssh/id_rsa):
Created directory '/home/gituser/.ssh'.
[login@arvouin ~/.ssh]
$ ssh-copy-id gituser@svnshare.it-sudparis.eu
==== configuration gituser ====
# yum install git
# useradd -m -d /home/gituser gituser
# usermod -s /usr/bin/git-shell gituser
# tail -2 /etc/shells
/bin/csh
/usr/bin/git-shell
# mkdir git-shell-commands
# chmod 755 git-shell-commands
# cp /usr/share/doc/git-1.7.4.1/contrib/git-shell-commands/* /home/gituser/git-shell-commands/
# chown -R gituser /home/gituser/git-shell-commands/*
# chmod +x /home/gituser/git-shell-commands/list /home/gituser/git-shell-commands/help
au sujet de git-shell-commands cf http://serverfault.com/questions/285324/git-shell-not-enabled/325484#325484
==== git bare server repo ====
on creer un repository vierge sur le serveur
# su -s /bin/bash - gituser
$ mkdir gittuto.git
$ cd gittuto.git/
$ git --bare init
Initialized empty Git repository in /home/gituser/gittuto.git/
===== initialisation git remote client =====
sur le client on declare notre serveur remote qui va heberger notre repo
==== remote add ====
syntaxe: git remote add [nomcourt] [url]
$ git remote add tuto ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git
verification de la declaration et des repo remote disponibles
$ git remote -v
tuto ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git (fetch)
tuto ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git (push)
==== git push ====
on pousse alors notre depot (branche master) local vers le serveur
$ git push tuto master
Counting objects: 12, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (12/12), 917 bytes, done.
Total 12 (delta 1), reused 0 (delta 0)
To ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git
* [new branch] master -> master
sur le serveur le directory "objects" a evolué
[gituser@gitshare gittuto.git]$ ls -ltra
drwxrwxr-x 4 gituser gituser 4096 Apr 9 14:54 refs
drwxrwxr-x 2 gituser gituser 4096 Apr 9 14:54 info
drwxrwxr-x 2 gituser gituser 4096 Apr 9 14:54 hooks
-rw-rw-r-- 1 gituser gituser 23 Apr 9 14:54 HEAD
-rw-rw-r-- 1 gituser gituser 73 Apr 9 14:54 description
-rw-rw-r-- 1 gituser gituser 66 Apr 9 14:54 config
drwxrwxr-x 2 gituser gituser 4096 Apr 9 14:54 branches
drwxrwxr-x 7 gituser gituser 4096 Apr 9 14:54 .
drwxrwxr-x 16 gituser gituser 4096 Apr 9 15:08 objects
===== usages client remote =====
depuis un (autre) client (teststud) on va recuperer ce repo et le modifier
$ ssh-copy-id gituser@gitshare.tem-tsp.eu
$ git clone ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git
Cloning into 'gittuto'...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 12 (delta 1), reused 0 (delta 0)
Receiving objects: 100% (12/12), done.
Resolving deltas: 100% (1/1), done.
-bash-4.2$ ls
gittuto
-bash-4.2$ cd gittuto/
-bash-4.2$ ls
file1.txt
-bash-4.2$ git remote -v
origin ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git (fetch)
origin ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git (push)
modifications et ajouts locaux
-bash-4.2$ vim file2.txt
-bash-4.2$ git add file2.txt
-bash-4.2$ git commit -a -m "add file2"
[master 9287d44] add file2
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 file2.txt
==== push remote ====
on envoie sur le serveur nos modifications
-bash-4.2$ git push
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 307 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git
8fedaa6..9287d44 master -> master
sur le serveur, c'est encore le directory "objects" qui viens d'etre modifié
[root@gitshare gittuto.git]# ls -ltr | tail -2
drwxrwxr-x 2 gituser gituser 4096 Apr 9 14:54 branches
drwxrwxr-x 19 gituser gituser 4096 Apr 9 15:26 objects
==== pull remote ====
depuis notre premier client nous allons recuperer les modifications faites par le second client (teststud)
=== visualisation de l'etat remote ===
$ git remote show tuto
* remote tuto
Fetch URL: ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git
Push URL: ssh://gituser@gitshare.tem-tsp.eu/~/gittuto.git
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (local out of date)
on note le "(local out of date)" !.
=== recuperation ===
on recupere (pull) depuis le serveur les dernieres modifications du repo "tuto" dans notre branche "master"
$ git pull tuto master
From ssh://gitshare.tem-tsp.eu/~/gittuto
* branch master -> FETCH_HEAD
Updating 8fedaa6..9287d44
Fast-forward
file2.txt | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 file2.txt
$ ls
file1.txt file2.txt