我已经使用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分支概念有所不同。)
无论如何...我不确定如何用git的分支来完成我通常在p4更改列表中所做的工作。在p4中,我可以执行以下操作:
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
此时,我有一个包含a.txt的changlist。我可以编辑说明并继续工作而无需提交更改列表。另外,如果事实证明我需要对其他文件进行一些更改,例如在代码的其他层中进行错误修复,则可以在同一客户端中执行此操作:
$ 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
在此示例中,土豚和斑马分支似乎包含完全相同的一组更改,并且基于其输出,git status
似乎在其中任一位置进行提交都将具有相同的效果。难道我做错了什么?