Les systèmes de version de code (SVC / CVS)
Les commandes Git de base
Travailler avec plusieurs versions
Travailler avec d'autres personnes
CVS - Concurent version
Approche Client/serveur, centralisé, facilité de faire des copies et modifier.
SVN - Subversion
Approche client/serveur, centralisé. Permet de plus facilement faire des merge car l'approche est basé sur une ligne évolutive au lieu de multiples branches.
GIT
Approche décentralisé qui enregistre les changements apportés dans un arbre historique.
Git est utilisé par de nombreux outils tels GitHub, GitLab, Bitbucket, etc.
git init
rm -rf .git
git clone <url> <cible: optionnel>
git init
git remote add origin <l'url du repo>
git fetch origin
git checkout master
git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
git add <pattern>
git add .
git add sous-dir/.
git add *.txt
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
Avant
Après
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: hello.txt
Avant
Après
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: hello.txt
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
Avant
Après
git reset
git reset repertoire/.
git reset *.pattern
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: hello.txt
Unstaged changes after reset:
M hello.txt
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
Avant reset
Après reset
Git fait un suivi de changesets; il garde une trace des fichiers modifiés et leur contenus.
Pour bien organiser son contenu, il créé des arbres de fichiers.
Chaque changeset fait référence à un autre changeset qui fait de même.
Ceci créé un arbre de changement qui éventuellement se reconnectent les uns aux autres.
Git fait un suivi des contenus et changements en créant des arbres internes.
Les branches des différents arbres font référence à des contenus de fichier et c'est de cette façon qu'on évalue les changements entre les versions de chaque fichiers.
Lorsqu'un fichier change, on garde en général la totalité du contenu ou du moins le delta dans un fichier.
Les arbres font ensuite référence à ces contenus pour organiser les différentes versions de fichiers.
Avant
Après
Dans cet exemple, 3 fichiers existent mais 1 seul change. Les blobs dans 2 autres fichiers restent intact et 1 nouveau blob est créé.
Un commit est une référence à un arbre d'objet et à un autre commit.
Un commit peut faire référence à plusieurs commit surtout lorsque vous migrez plusieurs versions ensemble.
Une branche est une séparation dans l'arbre des commit. C'est une façon de permettre à plusieurs version d'un même fichier d'exister avec du contenu différent.
Les branches sont essentielles dans le processus de développement pour permettre une revue de code et un développement progressif.
Une branche n'est pas un concept très compliqué, c'est un fait une simple référence à un commit.
Lorsque vous créez une branche, vous créez une référence à un commit et les prochains commit créerons un arbre de commit différents.
git branch
* master
git branch dev
git branch
dev
* master
git branch -d dev
Deleted branch dev (was ab86f85)
git branch -d dev
error: The branch 'dev' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev'.
git branch -D dev
Deleted branch dev (was ab86f85)
git checkout dev
Switched to branch 'dev'
echo "BLAH" > hello.txt
git add .
git commit -m "dev changes"
git checkout master
cat hello.txt
Test
commit ab86f859a0dd1333ec8413e44f9ee7d6176432fb (HEAD -> master)
Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
Date: Sat May 23 10:46:49 2020 -0400
Test commit
commit 81e7bdeeb21172b8ee33ad133fc7f1893092ec41 (HEAD -> dev)
Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
Date: Sat May 23 11:52:47 2020 -0400
Test 2
commit ab86f859a0dd1333ec8413e44f9ee7d6176432fb (master)
Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
Date: Sat May 23 10:46:49 2020 -0400
Test commit
* commit 81e7bdeeb21172b8ee33ad133fc7f1893092ec41 (HEAD -> dev)
| Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
| Date: Sat May 23 11:52:47 2020 -0400
|
| Test 2
|
* commit ab86f859a0dd1333ec8413e44f9ee7d6176432fb
Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
Date: Sat May 23 10:46:49 2020 -0400
Test commit
* commit c5a6fd48bd3372f1962a3e21ef982d7e80397c6f (HEAD -> dev2)
| Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
| Date: Sat May 23 14:30:01 2020 -0400
|
| New feature
|
| * commit aee11b272543efa8d7411e0ff90628823694b9d5 (dev)
|/ Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
| Date: Sat May 23 14:29:30 2020 -0400
|
| dev change
|
* commit 81e7bdeeb21172b8ee33ad133fc7f1893092ec41
| Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
| Date: Sat May 23 11:52:47 2020 -0400
|
| Test 2
|
| * commit 0d5905bac31d17e07e5e57198c9f7398bd926b25 (master)
| | Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
| | Date: Sat May 23 14:28:52 2020 -0400
| |
| | Some new file
| |
| * commit 2430aef3f3bf7e95ad4dac2e5572821c45ee7c9d
|/ Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
| Date: Sat May 23 14:26:22 2020 -0400
|
| Test3
|
* commit ab86f859a0dd1333ec8413e44f9ee7d6176432fb
Author: Mathieu Dumoulin <thecrazycodr@gmail.com>
Date: Sat May 23 10:46:49 2020 -0400
Test commit
* c5a6fd4 (HEAD -> dev2) New feature
| * aee11b2 (dev) dev change
|/
* 81e7bde Test 2
| * 0d5905b (master) Some new file
| * 2430aef Test3
|/
* ab86f85 Test commit
aee11b2 (HEAD -> dev) dev change
81e7bde Test 2
ab86f85 Test commit
git diff aee11b2 81e7bde
diff --git a/hello.txt b/hello.txt
index d075906..110c58e 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-dev version
+Test 2
git diff 81e7bde aee11b2
diff --git a/hello.txt b/hello.txt
index 110c58e..d075906 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-Test 2
+dev version
diff --git a/hello.txt b/hello.txt
index d075906..b36e8ac 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-dev version
+dev version 2
diff --git a/hello.txt b/hello.txt
index d075906..b36e8ac 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-dev version
+dev version 2
git diff HEAD
<résultat>
git diff dev
<même résultat>
git diff HEAD HEAD~1
diff --git a/hello.txt b/hello.txt
index d075906..110c58e 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-dev version
+Test 2
Avantages
Désavantages
Un remote c'est une référence à un repository différent du votre. Il faut lui donner un nom et importer son contenu dans le votre pour travailler avec.
Un remote ce peut être:
Au début de cette formation, nous avons vu git clone et vous avez vu que git clone est en fait une série de commandes:
En fait, git clone ajoute un remote à votre repository et fait un git fetch. Nous verrons ces commandes dans ce module.
git init
git remote add origin <l'url du repo>
git fetch origin
git checkout master
git remote add <nom> <l'url du repo>
git remote
relative
git remote
httpsremote
relative
sshremote
Nom | Description |
---|---|
rename | Renome le remote à un nouveau nom |
remove | Supprime ce remote |
set-url | Change l'url de ce remote |
get-url | Affiche l'url de ce remote |
Warning: Permanently added the RSA host key for IP address '140.82.112.4' to the list of known hosts.
warning: no common commits
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 32 (delta 13), reused 27 (delta 8), pack-reused 0
Unpacking objects: 100% (32/32), done.
From github.com:crazycodr/silencer
* [new branch] master -> sshremote/master
* [new tag] 0.1.0 -> 0.1.0
* [new tag] 0.2.0 -> 0.2.0
* [new tag] 0.2.1 -> 0.2.1
* [new tag] 0.3.1 -> 0.3.1
* [new tag] 0.3.2 -> 0.3.2
* [new tag] 0.3.3 -> 0.3.3
git checkout dev
git reset --hard 0.1.0
git merge sshremote/master
Updating b931b57..2cf1629
Fast-forward
.gitignore | 3 ++-
README.md | 38 +++++++++++++++++++++++++++++++-------
silencer-config.json | 5 +++++
silencer.py | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
4 files changed, 202 insertions(+), 32 deletions(-)
create mode 100644 silencer-config.json
mode change 100644 => 100755 silencer.py
Le code ou texte d'un fichier semble avoir changé exactement au même endroit où vous avez fait des changements.
Git n'est pas capable de savoir ce qui est bon ou mauvais.
Un fichier à été supprimé ou modifié alors que vous avez fait le contraire.
Git ne sait plus s'il doit conserver le fichier ou le supprimer.
Un conflit de modification aura l'air de ceci:
git merge dev
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
Le contenu du fichier "hello.txt" aura l'air de ceci:
<<<<<<< HEAD
Dancing
=======
Foo Bar
>>>>>>> dev
Le "<<<<<< HEAD" indique que le contenu qui suit fait parti de votre modification. Le "=======" indique la séparation avec l'autre branche. Finalement ">>>>>> dev" indique la fin du conflit.
Il n'existe aucun truc, il faut simplement observer et corriger. Au besoin, parlez avec vos collègues pour savoir quelle est la version finale:
Dancing
Foo Bar
Dancing
Foo Bar
Juste le Head?
Les deux?
Juste l'autre branche?
De plus, si vous voulez mettre les deux cas ensemble, il faut savoir que l'ordre peut être important.
Lorsqu'un fichier est supprimé et que vous l'avez changé, la règle générale est qu'il doit être supprimé. Donc le problème est encore plus complexe:
Comment allez vous reproduire le changement originel maintenant que le fichier que vous aviez modifié est supprimé?
Il n'existe aucun truc, il faut simplement observer les nouveaux changements et intégrer vos changements de façon différente. Au besoin, parlez avec vos collègues pour savoir quelle sera l'approche.
Cette commande est un tout en un pour vous simplifier la vie. Une fois un remote mis en place vous pouvez faire un fetch et un merge en une seule commande:
git checkout dev
git reset --hard 0.1.0
git pull sshremote/master
Updating b931b57..2cf1629
Fast-forward
.gitignore | 3 ++-
README.md | 38 +++++++++++++++++++++++++++++++-------
silencer-config.json | 5 +++++
silencer.py | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
4 files changed, 202 insertions(+), 32 deletions(-)
create mode 100644 silencer-config.json
mode change 100644 => 100755 silencer.py
Cette commande est un tout en un pour vous simplifier la vie. Une fois un remote mis en place vous pouvez faire un fetch et un merge en une seule commande:
Un git pull c'est l'équivalent d'un git fetch <remote> suivi d'un git merge <remote>/<branch>.
Cette commande est la plus importante dans la collaboration. Elle permet de pousser les changements en local dans un remote.
git push origin HEAD:test
Counting objects: 13, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (13/13), 5.59 KiB | 5.59 MiB/s, done.
Total 13 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
remote:
remote: Create a pull request for 'test' on GitHub by visiting:
remote: https://github.com/crazycodr/standard-exceptions/pull/new/test
remote:
To https://github.com/crazycodr/standard-exceptions.git
* [new branch] HEAD -> test
Il existe plusieurs façons d'utiliser git push:
Chaque approche permet de faire sensiblement la même chose.
Avantages
Désavantages
Avantages
Désavantages
Avantages
Désavantages