J'utilise Perforce depuis un certain nombre d'années. J'aimerais passer à l'utilisation de git pour mon code personnel, mais tous les tutoriels git que j'ai vus supposent que vous êtes un n00b du contrôle de source (ce qui les rend incroyablement fastidieux) ou que vous êtes habitué à svn (ce que je ne suis pas).
Je connais p4, et je comprends aussi l'idée derrière un système de contrôle de source distribué (donc je n'ai pas besoin d'un discours commercial, merci). Ce que j'aimerais, c'est une table de traduction des commandes p4 en commandes git équivalentes, ainsi que les commandes "incontournables" qui n'ont pas d'équivalent p4.
Comme je soupçonne que chaque utilisateur de p4 utilise un sous-ensemble différent de p4, voici quelques-unes des choses que je fais régulièrement dans p4 et que j'aimerais pouvoir faire dans git, mais qui ne sont pas immédiatement évidentes dans les documents que j'ai consultés :
- créer plusieurs listes de modifications en attente dans un seul client. (
p4 change
) - modifier une liste de modifications en attente. (également
p4 change
) - voir une liste de toutes mes listes de modifications en attente (
p4 changes -s pending
) - liste de tous les fichiers modifiés dans mon client (
p4 opened
) ou dans une liste de changements en attente (p4 describe
) - voir un diff d'une liste de modifications en attente (j'utilise un script pour cela qui utilise
p4 diff
yp4 describe
) - pour un fichier donné, voir quelles listes de modifications soumises ont affecté quelles lignes (
p4 annotate
) - pour un fichier donné, voir une liste des descriptions des listes de modifications qui ont affecté le fichier (
p4 log
) - soumettre une liste de modifications en attente (
p4 submit -c
) - interrompre une liste de modifications en attente (
p4 revert
)
Beaucoup d'entre elles tournent autour des "changelists". "changelist" est la terminologie de p4. Quel est le terme équivalent dans git ?
Il semble que les branches soient ce que les utilisateurs de git utilisent à la place de ce que p4 appelle des listes de changements. Un peu déroutant, puisque p4 a aussi quelque chose appelé branche, bien qu'ils semblent n'être que des concepts vaguement liés. (Bien que j'ai toujours pensé que le concept de branche de p4 était assez bizarre ; il est encore différent du concept classique de branche du RCS).
Bref... Je ne suis pas sûr de savoir comment accomplir ce que je fais normalement dans les changelists de p4 avec les branches de git. Dans p4, je peux faire quelque chose comme ceci :
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
À ce stade, j'ai une liste de modifications qui contient un fichier .txt. Je peux modifier la description et continuer à travailler sans soumettre la changelist. De même, s'il s'avère que je dois apporter des modifications à d'autres fichiers, par exemple pour corriger un bogue dans une autre couche du code, je peux le faire dans le même client :
$ p4 edit z.txt
$ p4 change z.txt
Change 12346 created.
Maintenant, j'ai deux listes de modifications distinctes dans le même client. Je peux travailler dessus simultanément, et je n'ai pas besoin de faire quoi que ce soit pour passer de l'une à l'autre. Au moment de la validation, je peux les soumettre séparément :
$ p4 submit -c 12346 # this will submit the changes to z.txt
$ p4 submit -c 12345 # this will submit the changes to a.txt
Je n'arrive pas à trouver comment reproduire cela dans git. D'après mes expérimentations, il ne semble pas que git add
est associé à la branche en cours. Pour autant que je puisse dire, lorsque je git commit
il va commettre tous les fichiers que j'ai git add
-quelle que soit la branche dans laquelle je me trouvais à l'époque :
$ git init
Initialized empty Git repository in /home/laurence/git-playground/.git/
$ ls
a.txt w.txt z.txt
$ git add -A .
$ git commit
Initial commit.
3 files changed, 3 insertions(+), 0 deletions(-)
create mode 100644 a.txt
create mode 100644 w.txt
create mode 100644 z.txt
$ vi a.txt z.txt
2 files to edit
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a.txt
# modified: z.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git branch aardvark
$ git checkout aardvark
M a.txt
M z.txt
Switched to branch 'aardvark'
$ git add a.txt
$ git checkout master
M a.txt
M z.txt
Switched to branch 'master'
$ git branch zebra
$ git checkout zebra
M a.txt
M z.txt
Switched to branch 'zebra'
$ git add z.txt
$ git status
# On branch zebra
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
# modified: z.txt
#
$ git checkout aardvark
M a.txt
M z.txt
Switched to branch 'aardvark'
$ git status
# On branch aardvark
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
# modified: z.txt
Dans cet exemple, les branches aardvark et zebra semblent contenir exactement le même ensemble de modifications, et d'après la sortie de la commande git status
il semble que faire un commit dans l'un ou l'autre aura le même effet. Est-ce que je fais quelque chose de mal ?
2 votes
Vous pourriez simplement utiliser perforce pour votre code personnel en supposant que les 5 clients gratuits sont suffisants.
3 votes
C'est ce que je faisais jusqu'à présent, mais j'aimerais passer à quelque chose qui soit open-source et également utilisé par des projets open-source. J'ai considéré à la fois git et Mercurial. J'ai penché pour git parce qu'il semble avoir plus d'élan.
2 votes
Vous feriez mieux d'apprendre Git à partir de zéro. Le flux de travail prescrit par Git est très différent du flux de travail prescrit par Perforce. La traduction des flux de travail sera maladroite, et essayer de mettre en équation les fonctionnalités rendra votre compréhension difficile. Heureusement, la communauté Git offre une abondance de documentation pour les débutants, par ex. git-scm.com/book
2 votes
@ColonelPanic Je comprends votre point de vue, mais le problème avec une telle documentation est qu'elle perd du temps à expliquer des choses basiques que tout utilisateur de Perforce connaît déjà. Lire une telle documentation est tout aussi ennuyeux que d'essayer de lire un tutoriel sur un autre langage de programmation qui passe un chapitre à expliquer ce que sont les variables.
0 votes
@ColonelPanic Cela dit, j'ai lu d'autres documents git, dont les suivants Git From the Bottom Up y Git pour les informaticiens qui étaient en fait assez utiles. J'utilise Git depuis quelques années maintenant (notez quand cette question a été posée à l'origine), et j'ai l'impression que les principaux problèmes de l'apprentissage de git ne sont pas le manque de documentation, mais une mauvaise nomenclature, une incohérence interne, des commandes mal surchargées, et certaines parties non finies qui ne sont pas prêtes pour une utilisation réelle. J'aimerais bien que quelqu'un aille nettoyer toutes les parties non finies, mais cela ennuierait ceux qui s'y sont habitués.