Commit / Merge / Rebase / Workflow / Squash
sha1(
commit date
commit message
committer
author
author date
tree
)
sha1(
commit date
commit message
committer
author
author date
tree
)
//Avant | //Après
A----B----C (develop/HEAD) | A----B----C----1----2 (develop/HEAD, project)
\ |
1-----2 (project) | //Avant | //Après
A----B----C----D----E (develop/HEAD) | A----B----C----D----E----F (develop/HEAD)
\ | \ /
1-----2 (project) | 1-----2 (project)//Avant | //Après
A----B----C----D (develop/HEAD) | A----B----C----D----$1----$2 (develop/HEAD,project)
\ |
1---- 2 (project) |
Devons-nous fonctionner avec des merges ou des rebases ?
La définition d'un Workflow Git unique, pour l'ensemble des contributeurs, est indispensable pour garantir une meilleure collaboration et installer
des règles de contribution identiques pour tous
Merge - Rebase / master - develop - feat
Le rebase --onto facilite les rebase, même les plus complexes, sans subir les conséquences d'un rebase standard.
Il offre également une certaine souplesse dans la réorganisation des commits (supprimer, renommer, réordonner...etc.)
//État initial
A----B----C (master/ HEAD)
\
D---...---Y---Z (develop/HEAD)
\
1---2---3 (project/HEAD)//État initial
A----B----C (master/ HEAD)
\
D---...---Y---Z (develop/HEAD)
\
1---2---3 (project/HEAD)//Rebase develop sur master
A----B----C (master/HEAD)
\
$D---...---$Y---$Z (develop/HEAD)
x (/Ce lien est perdu*/)
1---2---3 (project/HEAD)//État initial
A----B----C (master/ HEAD)
\
D---...---Y---Z (develop/HEAD)
\
1---2---3 (project/HEAD)//Rebase develop sur master
A----B----C (master/HEAD)
\
$D---...---$Y---$Z (develop/HEAD)
x (/Ce lien est perdu*/)
1---2---3 (project/HEAD)//Rebase project sur develop (sans rebase --onto)
A----B----C (master/HEAD)
\
$D---...---$Y---$Z (develop/HEAD)
...\... (Chercher le plus ancien parent commun pour rebase*/)
1----2---3 (project/HEAD)
git rebase --onto <newparent> <oldparent> <feature-branch/until> |
//Avant | //Après
A----B----C----D (develop) | A----B----C----D (develop)
\ | \
1----2 (project/HEAD) | $1----$2 (project/HEAD)
git rebase --onto <newparent> <oldparent> <feature-branch/until> |
$ git checkout project
$ git rebase --onto D C
//Avant | //Après
A----B----C----D (develop) | A----B----C----D (develop)
\ | \
1----2 (project/HEAD) | $1----$2 (project/HEAD)
git rebase --onto <newparent> <oldparent> <feature-branch/until> |
$ git checkout project
$ git rebase --onto D C
//Avant | //Après
A----B----C----D (develop) | A----B----C----D (develop)
\ | \
1----2 (project/HEAD) | $1----$2 (project/HEAD)
git rebase --onto <newparent> <oldparent> <feature-branch/until> |
//Avant | //Après
A----B----C----D----E (develop) | A----B----C----D----E (develop)
\ | \
1----2----3----4 (project/HEAD) | $3----$4 (project/HEAD)$ git checkout project
$ git rebase --onto D C
//Avant | //Après
A----B----C----D (develop) | A----B----C----D (develop)
\ | \
1----2 (project/HEAD) | $1----$2 (project/HEAD)
git rebase --onto <newparent> <oldparent> <feature-branch/until> |
$ git checkout project
$ git rebase --onto D 2
//Avant | //Après
A----B----C----D----E (develop) | A----B----C----D----E (develop)
\ | \
1----2----3----4 (project/HEAD) | $3----$4 (project/HEAD)
git rebase --onto <newparent> <oldparent> <feature-branch/until> |
//Rebase project sur develop (sans rebase --onto)
A----B----C (master/HEAD)
\
$D---...---$Y---$Z (develop/HEAD)
...\... (Chercher le plus ancien parent commun pour rebase*/)
1----2---3 (project/HEAD)//Rebase onto project sur develop
A----B----C (master/HEAD)
\
$D---...---$Y---$Z (develop/HEAD)
\
$1----$2---$3 (project/HEAD)
git rebase --onto <newparent> <oldparent> <feature-branch/until> |
//Rebase project sur develop (sans rebase --onto)
A----B----C (master/HEAD)
\
$D---...---$Y---$Z (develop/HEAD)
...\... (Chercher le plus ancien parent commun pour rebase*/)
1----2---3 (project/HEAD)$ git checkout project
$ git rebase --onto $Z CURRENT_PARENT (ou $git rebase --onto develop CURRENT_PARENT)
//Rebase onto project sur develop
A----B----C (master/HEAD)
\
$D---...---$Y---$Z (develop/HEAD)
\
$1----$2---$3 (project/HEAD)Le squash consiste à regrouper n commits en 1 commit pertinent, compréhensible et cohérent.
Le but du squash est de rendre l'historique Git lisible, claire et pertinent.
* e0d1c94 - 2022-09-30 (14 seconds)- feat(metier) sql create report request OK !!! (HEAD -> master)
* db37fe2 - 2022-09-30 (62 seconds)- feat(metier) oups!!! update 2 sql create report request
* 4f5e97f - 2022-09-30 (2 minutes)- feat(metier) update sql create report request
* 683d34b - 2022-09-30 (2 minutes)- feat(metier) add sql create report request
* 9ff0e10 - 2021-03-24 (1 year, 6 months)- chore(master) add .gitignore regenerate-*.bat$ git rebase -i HEAD~4 (ou git rebase -i 9ff0e10)* 78fd32c - 2022-09-30 (2 minutes)- feat(metier) add sql create report request (HEAD -> master)
* 9ff0e10 - 2021-03-24 (1 year, 6 months)- chore(master) add .gitignore regenerate-*.batÉvaluation, en temps réel, du retour sur le temps investi