J'utilise Perforce depuis plusieurs 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 contrôle de source complet n00b (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 argumentaire de vente, merci). Ce que je voudrais, c'est une table de traduction de la commande p4 vers des commandes git équivalentes, ainsi que les commandes "ne peut pas vivre sans" qui n'ont pas d'équivalent p4.
Puisque 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 que j'aimerais pouvoir faire dans git qui ne sont pas immédiatement évidentes à partir des 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. (aussi
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 modifications en attente (p4 describe
) - voir un diff d'une liste de modifications en attente (j'utilise un script wrapper pour cela qui utilise
p4 diff
etp4 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
) - abandonner une liste de modifications en attente (
p4 revert
)
Beaucoup d'entre eux tournent autour de "listes de modifications". "changelist" est la terminologie p4. Quel est le terme équivalent à git?
On dirait que les branches pourraient être ce que les utilisateurs de git utilisent à la place de ce que p4 appelle les listes de modifications. Un peu déroutant, car p4 a aussi quelque chose qui s'appelle une branche bien qu'ils ne semblent être que des concepts vaguement liés. (Bien que j'ai toujours pensé que le concept de branche de p4 était assez étrange, il est encore une fois différent du concept RCS classique d'une branche.)
Quoi qu'il en soit ... Je ne sais pas comment accomplir ce que je fais normalement dans les listes de modifications 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 a.txt. Je peux modifier la description et continuer à travailler sans soumettre la liste des modifications. De plus, s'il s'avère que j'ai besoin d'apporter des modifications à certains autres fichiers, comme par exemple un correctif 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 sur ces derniers simultanément, et je n'ai rien à faire pour "basculer entre" eux. Quand vient le temps de m'engager, 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 ne peux pas comprendre comment répliquer cela dans git. D'après mes expériences, il ne semble pas que ce git add
soit associé à la branche actuelle. Pour autant que je sache, quand je git commit
vais valider tous les fichiers que j'ai git add
créés, 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 en fonction de la sortie de celles- git status
ci, il semble que faire un commit dans l'une ou l'autre aura le même effet. Est-ce que je fais quelque chose de mal?