我已经使用 Perforce 很多年了。我希望在我的个人代码中使用 git,但是我看到的所有 git 教程要么假设你是一个完整的源代码控制 n00b (这使得它们非常乏味) ,要么假设你已经习惯了 svn (我不是)。
我了解 p4,也理解分布式源代码控制系统背后的理念(所以我不需要推销,谢谢)。我想要的是一个从 p4命令到等效 git 命令的转换表,以及没有等效 p4命令的“ can’t live without”命令。
因为我怀疑每个 p4用户都使用不同的 p4子集,下面是我在 p4中经常做的一些事情,我希望能够在 git 中完成,这些事情在我看过的文档中并不明显:
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 的变更列表。我可以编辑描述并继续工作而不提交变更列表。另外,如果我需要对其他一些文件进行一些修改,比如在代码的其他层中修复一个 bug,我可以在同一个客户端中进行:
$ 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
的输出,似乎在任何一个分支中执行提交都会产生相同的效果。我做错什么了吗?