Ich benutze Perforce seit einigen Jahren. Ich würde gerne zur Verwendung von Git für meinen persönlichen Code wechseln, aber alle Git-Tutorials, die ich gesehen habe, gehen entweder davon aus, dass Sie eine vollständige Quellcodeverwaltung n00b sind (was sie unglaublich langweilig macht) oder dass Sie es gewohnt sind svn (was ich nicht bin).
Ich kenne p4 und verstehe auch die Idee hinter einem verteilten Versionsverwaltungssystem (also brauche ich kein Verkaufsgespräch, danke). Was ich möchte, ist eine Übersetzungstabelle vom Befehl p4 in äquivalente Git-Befehle sowie die Befehle "Ich kann nicht ohne leben", die kein p4-Äquivalent haben.
Da ich vermute, dass jeder p4-Benutzer eine andere Teilmenge von p4 verwendet, sind hier einige der Dinge, die ich regelmäßig in p4 mache, die ich in git tun möchte, die aus den von mir betrachteten Dokumenten nicht sofort ersichtlich sind ::
- Erstellen Sie mehrere ausstehende Änderungslisten in einem einzelnen Client. (
p4 change
) - Bearbeiten Sie eine ausstehende Änderungsliste. (auch
p4 change
) - siehe eine Liste aller meiner ausstehenden Änderungslisten (
p4 changes -s pending
) - Liste aller geänderten Dateien in meinem Client (
p4 opened
) oder in einer ausstehenden Änderungsliste (p4 describe
) - siehe einen Unterschied einer ausstehenden Änderungsliste (ich verwende dafür ein Wrapper-Skript, das
p4 diff
und verwendetp4 describe
) - Sehen Sie für eine bestimmte Datei, welche übermittelten Änderungslisten welche Zeilen beeinflusst haben (
p4 annotate
) - Für eine bestimmte Datei finden Sie eine Liste der Beschreibungen der Änderungslisten, die die Datei betroffen haben (
p4 log
) - eine ausstehende Änderungsliste einreichen (
p4 submit -c
) - eine ausstehende Änderungsliste abbrechen (
p4 revert
)
Viele davon drehen sich um "Änderungslisten". "Änderungsliste" ist die p4-Terminologie. Was ist der git-äquivalente Begriff?
Es hört sich so an, als ob Zweige das sein könnten, was Git-Benutzer anstelle dessen verwenden, was p4 Änderungslisten nennt. Ein bisschen verwirrend, da p4 auch so etwas wie einen Zweig hat, obwohl es sich nur um vage verwandte Konzepte zu handeln scheint. (Obwohl ich immer dachte, dass das Konzept von p4 für einen Zweig ziemlich seltsam ist, unterscheidet es sich noch einmal vom klassischen RCS-Konzept eines Zweigs.)
Wie auch immer ... Ich bin mir nicht sicher, wie ich das erreichen soll, was ich normalerweise in p4-Änderungslisten mit Git-Zweigen mache. In p4 kann ich so etwas machen:
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
Zu diesem Zeitpunkt habe ich eine Änderungsliste, die a.txt enthält. Ich kann die Beschreibung bearbeiten und weiterarbeiten, ohne die Änderungsliste einzureichen. Wenn sich herausstellt, dass ich einige Änderungen an anderen Dateien vornehmen muss, z. B. einen Bugfix in einer anderen Codeebene, kann ich dies auf demselben Client tun:
$ p4 edit z.txt
$ p4 change z.txt
Change 12346 created.
Jetzt habe ich zwei separate Änderungslisten im selben Client. Ich kann gleichzeitig daran arbeiten und muss nichts tun, um zwischen ihnen zu "wechseln". Wenn es Zeit für ein Commit ist, kann ich sie separat einreichen:
$ p4 submit -c 12346 # this will submit the changes to z.txt
$ p4 submit -c 12345 # this will submit the changes to a.txt
Ich kann nicht herausfinden, wie ich das in Git replizieren kann. Aus meinen Experimenten geht nicht hervor, dass dies git add
mit dem aktuellen Zweig verbunden ist. Soweit ich das beurteilen kann, werden beim git commit
Festschreiben aller Dateien, die ich erstellt habe, git add
unabhängig davon, in welchem Zweig ich mich zu diesem Zeitpunkt befand:
$ 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
In diesem Beispiel scheinen die Erdferkel- und Zebrazweige genau die gleichen Änderungen zu enthalten, und basierend auf der Ausgabe git status
scheint es, dass das Festschreiben in beiden den gleichen Effekt hat. Mache ich etwas falsch?