私はPERFORCEを何年も使用しています。個人コードにgitを使用するように切り替えたいのですが、私が見たすべてのgitチュートリアルは、あなたが完全なソース管理n00b(非常に面倒なものになります)であるか、慣れていることを前提としています。 svn(私はそうではありません)。
私はp4を知っており、分散ソース管理システムの背後にある考え方も理解しています(したがって、売り込みは必要ありません、ありがとう)。私が欲しいのは、p4コマンドから同等のgitコマンドへの変換テーブルと、同等のp4がない「なしでは生きられない」コマンドです。
すべてのp4ユーザーがp4の異なるサブセットを使用していると思われるので、これは私がgitで実行できるようにしたい、p4で定期的に実行するいくつかのことですが、これまで見てきたドキュメントからはすぐにはわかりません。 :
- 1つのクライアントで複数の保留中の変更リストを作成します。(
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の同等の用語は何ですか?
ブランチは、p4がチェンジリストと呼ぶものの代わりにgitユーザーが使用するもののようです。p4にもブランチと呼ばれるものがあるため、少し混乱しますが、それらは漠然と関連した概念にすぎないようです。(私はいつもp4のブランチの概念はかなり奇妙だと思っていましたが、それはまたもや古典的なRCSのブランチの概念とは異なります。)
とにかく... gitのブランチを使用してp4チェンジリストで通常行うことをどのように達成するかがわかりません。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.
これで、同じクライアントに2つの別々のチェンジリストがあります。これらを同時に処理することができ、それらを「切り替える」ために何もする必要はありません。コミットするときが来たら、個別に送信できます。
$ 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
どちらかでコミットを実行すると同じ効果があるように見えます。私は何か間違ったことをしていますか?