Я використовую 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
) - побачити різницю очікуваного списку змін (для цього я використовую сценарій обгортки, який використовує
p4 diff
іp4 describe
) - для даного файлу подивіться, які надіслані списки змін вплинули на які рядки (
p4 annotate
) - для даного файлу див. перелік описів списків змін, що вплинули на файл (
p4 log
) - подати список змін, що очікує на розгляд (
p4 submit -c
) - скасувати очікуваний список змін (
p4 revert
)
Багато з них обертаються навколо "списків змін". "список змін" - це термінологія p4. Що таке еквівалентний термін git?
Здається, гілки можуть бути тим, що користувачі git використовують замість того, що p4 називає списками змін. Трохи заплутано, оскільки p4 також має щось, що називається гілкою, хоча, здається, це лише неясно пов'язані поняття. (Хоча я завжди думав, що концепція p4 філії є досить дивною, вона все ж відрізняється від класичної концепції RCS гілки.)
У будь-якому випадку ... Я не впевнений, як виконати те, що я зазвичай роблю в списках змін p4 з гілками git. У p4 я можу зробити щось подібне:
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
На даний момент у мене є список змін, який містить a.txt. Я можу редагувати опис і продовжувати працювати, не подаючи список змін. Крім того, якщо виявиться, що мені потрібно внести деякі зміни в деякі інші файли, наприклад, скажімо, виправлення помилки в якомусь іншому рівні коду, я можу зробити це в тому ж клієнті:
$ 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
мав, незалежно від того, в якій гілці я був у той час:
$ 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
цього видається, що виконання коміту в будь-якому з них матиме однаковий ефект. Я щось роблю не так?