Я использую Perforce в течение нескольких лет. Я хотел бы переключиться на использование git для моего личного кода, но все обучающие программы git, которые я видел, либо предполагают, что вы полный источник управления n00b (что делает их невероятно утомительными), либо что вы "Используется для svn (чего я не знаю).
Я знаю p4, и я также понимаю идею распределенной системы управления источниками (так что мне не нужна коммерческая подача, спасибо). Я бы хотел, чтобы это была таблица перевода из команды p4 в эквивалентные команды git, а также команды "не могут жить без", которые не имеют эквивалента p4.
Поскольку я подозреваю, что каждый пользователь p4 использует другое подмножество p4, вот некоторые из вещей, которые я регулярно делаю в p4, которые я хотел бы сделать в git, которые не сразу очевидны из документов Я посмотрел:
- создать несколько ожидающих списков изменений в одном клиенте. (
p4 change
) - изменить ожидающий список изменений. (также
p4 change
) - см. список всех моих ожидающих списков изменений (
p4 changes -s pending
) - список всех измененных файлов моего клиента (
p4 opened
) или в ожидающем списке изменений (p4 describe
) - см. разницу ожидающего списка изменений (я использую оболочку script для этого, которая использует
p4 diff
иp4 describe
) - для данного файла, см., какие представленные списки изменений повлияли на строки (
p4 annotate
) - для данного файла, см. список описаний списков изменений, которые повлияли на файл (
p4 log
) - отправить ожидающий список изменений (
p4 submit -c
) - прервать ожидающий список изменений (
p4 revert
)
Многие из них вращаются вокруг "списков изменений". "changelist" - терминология p4. Что эквивалентно термину git?
Похоже, что ветки могут быть пользователями git вместо того, что p4 вызывает списки изменений. Немного сбивает с толку, поскольку p4 также имеет что-то, называемое веткой, хотя они кажутся лишь смутно связанными понятиями. (Хотя я всегда считал, что концепция ветки p4 довольно странная, она опять же отличается от классической концепции RCS ветки.)
В любом случае... Я не уверен, как выполнить то, что я обычно делаю в списках изменений p4 с ветвями git. В p4 я могу сделать что-то вроде этого:
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
В этот момент у меня есть чардж-лист, содержащий a.txt. Я могу редактировать описание и продолжать работу, не отправляя список изменений. Кроме того, если выясняется, что мне нужно внести некоторые изменения в некоторые другие файлы, например сказать bugfix в каком-то другом слое кода, я могу сделать это в одном клиенте:
$ p4 edit z.txt
$ p4 change z.txt
Change 12346 created.
Теперь у меня есть два отдельных списка изменений в одном клиенте. Я могу работать над этим одновременно, и мне не нужно ничего делать, чтобы "переключаться между ними". Когда приходит время совершить, я могу отправить их отдельно:
$ p4 submit -c 12346 # this will submit the changes to z.txt
$ p4 submit -c 12345 # this will submit the changes to a.txt
Я не могу понять, как это сделать в git. Из моих экспериментов не представляется, что git add
связано с текущей ветвью. Насколько я могу судить, когда я git commit
, он собирается передать все файлы, которые я git add
-ed, независимо от того, в какой ветке я был в это время:
$ 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
В этом примере ветки aardvark и zebra, похоже, содержат точно такой же набор изменений, и на основе вывода git status
кажется, что выполнение фиксации в любом случае будет иметь тот же эффект. Я что-то делаю неправильно?