저는 수년 동안 Perforce를 사용해 왔습니다. 내 개인 코드에 git을 사용하는 것으로 전환하고 싶지만 내가 본 모든 git 자습서에서는 사용자가 완전한 소스 제어 n00b (엄청나게 지루 해짐)이거나 익숙하다고 가정합니다. svn (나는 아닙니다).
저는 p4를 알고 있으며 분산 소스 제어 시스템의 개념도 이해합니다 (따라서 판매 홍보가 필요하지 않습니다. 감사합니다). 내가 원하는 것은 p4 명령에서 동등한 git 명령으로의 변환 테이블과 p4와 동등한 명령이없는 "ca n't live without"명령입니다.
모든 p4 사용자가 p4의 다른 하위 집합을 사용한다고 생각하기 때문에 내가 본 문서에서 즉시 명확하지 않은 git에서 할 수 있기를 원하는 p4에서 정기적으로 수행하는 작업 중 일부는 다음과 같습니다. :
- 단일 클라이언트에서 여러 보류중인 변경 목록을 만듭니다. (
p4 change
) - 보류중인 변경 목록을 편집합니다. (또한
p4 change
) - 보류중인 모든 변경 목록 (
p4 changes -s pending
) 목록보기 - 내 클라이언트 (
p4 opened
) 또는 보류중인 변경 목록 (p4 describe
) 에서 변경된 모든 파일 목록 - (나는 이것에 대한 래퍼 스크립트를 사용하는 용도에 보류중인 변경 목록의 DIFF를 참조
p4 diff
하고p4 describe
) - 주어진 파일에 대해 제출 된 변경 목록이 어떤 행에 영향을 미치는지 확인하십시오 (
p4 annotate
). - 주어진 파일에 대해 파일에 영향을 준 변경 목록의 설명 목록을 참조하십시오 (
p4 log
). - 보류중인 변경 목록 제출 (
p4 submit -c
) - 보류중인 변경 목록 중단 (
p4 revert
)
이 중 많은 부분이 "변경 목록"을 중심으로 이루어집니다. "changelist"는 p4 용어입니다. git에 해당하는 용어는 무엇입니까?
브랜치가 p4가 changelist라고 부르는 대신 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.
이제 동일한 클라이언트에 두 개의 개별 변경 목록이 있습니다. 동시에 작업 할 수 있으며 "전환"하기 위해 아무것도 할 필요가 없습니다. 커밋 할 때가되면 별도로 제출할 수 있습니다.
$ 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
따라 둘 중 하나에서 커밋을 수행하면 동일한 효과가 나타납니다. 내가 뭘 잘못하고 있니?