Comme cela est étiqueté avec git, j'espère que mon manque de connaissances en SVN est négligeable.
Actuellement, je clone un repo et clone une branche spécifique à l’aide de gitk.
Vous clonez l'ensemble du référentiel distant, pas seulement une branche spécifique.
Le référentiel est mieux imaginé en tant que base de données, vous créez donc un clone de l'état actuel de la base de données distante. Mais après cela, vous travaillez sur votre propre copie de cette base de données. si vous vous engagez, vous modifiez votre base de données locale.
Cette fetch
commande permet de maintenir la base de données locale synchronisée avec la base de données distante.
Généralement, à partir de cette base de données locale, vous extrayez une branche sur laquelle travailler. Ce n'est rien d'autre qu'un marqueur interne pour git, où votre travail actuel a commencé.
Disons que vous travaillez sur un référentiel simple, où il n'y a pas de branche en plus master
, vous pouvez jeter un coup d'oeil dans le .git
dossier pour dévoiler le "magique":
Supposons que votre dernier commit (on master
) était 182e8220b404437b9e43eb78149d31af79040c66
, vous le trouverez exactement sous cat .git/refs/heads/master
.
À partir de cette branche git checkout -b mybranch
, vous retrouvez exactement le même pointeur dans le fichier cat .git/refs/heads/mybranch
.
Les branches ne sont rien de plus que des "pointeurs". Le marqueur "de travail" est appelé un HEAD
.
Si vous voulez savoir où vous en êtes HEAD
:
cat .git/HEAD
qui dit, par exemple ref: refs/heads/mybranch
, qui pointe ( cat .git/refs/heads/mybranch
) à un hachage de commit78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
Les commits réels sont stockés dans le objects
dossier (le comment est un sujet à part).
Le dossier de projet ne contient que le contenu de cette branche et je ne peux pas voir toutes les branches comme dans SVN, ce qui est un peu déroutant pour moi.
Ne confondez pas le working directory
avec la "base de données git" dans son ensemble. Comme je l'ai dit plus haut, votre répertoire de travail n'est qu'un instantané de (peut-être) un sous-ensemble.
Supposons que vous avez différentes branches, votre répertoire de travail est dédié au travail sur cette branche uniquement (bien que vous puissiez placer le travail ailleurs).
Généralement, si vous voulez voir quelles branches sont définies pour le projet, vous avez la possibilité de
git branch
pour les branches locales
git branch --remote
pour les branches éloignées
git branch -a
pour les deux
(ou git branch -v
)
Puisque git est un système de contrôle de version distribué, il est non seulement possible, mais également conseillé, de créer différentes branches localement / à distance.
Mon flux de travail typique est:
- branche une branche de fonction
- branchez une branche WIP (travail en cours) à partir de celle
- travaillez comme vous le souhaitez - même si vous vous engagez après une seule ligne; ça n'a pas d'importance
Lorsque la fonctionnalité est terminée:
- squash / retravailler la
WIP
branche (avec rebasage interactif) = faire un simple commit à partir de celui-ci
- fusionnez la
WIP
branche dans la branche de fonctionnalités et proposez-la (si vous travaillez avec github, cette offre s'appelle une "demande d'extraction") à intégrer dans la branche stable (principale).
De plus, j'aimerais savoir comment gérer un processus où je dois travailler simultanément sur deux branches au cas où, par exemple, je devrais créer un correctif sur master tout en conservant le contenu d'une autre branche.
Cela dépend de la structure de votre projet:
Disons que vous avez un maître stable. Et les fonctionnalités ne sont développées qu'à partir de cette branche stable - elle se trouve donc généralement derrière une branche de fonctionnalité. Ensuite, vous auriez un dernier commit sur master qui serait la racine de la branche de fonctionnalité.
Ensuite, vous feriez un commit sur la branche principale et pourriez décider de fusionner les deux branches ou de les rebaser (ce qui est une sorte de fusion pour les utilisateurs ayant des besoins avancés, pour ainsi dire).
Ou vous pouvez toujours modifier des branches (par exemple master
) et les sélectionner à d’autres branches.
Quelles sont les conventions de nom recommandées pour créer les dossiers qui incluent la branche clonée à partir du référentiel dans GIT, par exemple myproject-branchname
C'est à toi de decider.
En règle générale, vous vous retrouvez avec le nom du référentiel.
Mais il y a des occasions, quand cela n'est pas voulu:
par exemple, vous clonez oh-my-zsh avec git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Here .oh-my-zsh
est explicitement nommé comme cible.