ฉันใช้ Perforce มาหลายปีแล้ว ฉันต้องการเปลี่ยนไปใช้คอมไพล์สำหรับรหัสส่วนตัวของฉัน แต่บทช่วยสอนคอมไพล์ทั้งหมดที่ฉันเคยเห็นอาจคิดว่าคุณเป็นแหล่งควบคุม n00b ที่สมบูรณ์ (ซึ่งทำให้พวกเขาน่าเบื่ออย่างไม่น่าเชื่อ) หรือที่คุณคุ้นเคย svn (ซึ่งฉันไม่ใช่)
ฉันรู้ p4 และฉันก็เข้าใจแนวคิดเบื้องหลังระบบควบคุมแหล่งที่มาแบบกระจาย (ดังนั้นฉันไม่ต้องการสำนวนการขายขอบคุณ) สิ่งที่ฉันต้องการคือตารางแปลจากคำสั่ง p4 ไปจนถึงคำสั่ง git ที่เทียบเท่าเช่นเดียวกับคำสั่ง "ขาดไม่ได้" ที่ไม่มี p4 เทียบเท่า
เนื่องจากฉันสงสัยว่าผู้ใช้ p4 ทุกคนใช้ชุดย่อยของ p4 ที่แตกต่างกันนี่คือบางสิ่งที่ฉันทำเป็นประจำใน p4 ที่ฉันต้องการจะทำได้ในคอมไพล์ที่ไม่ชัดเจนในทันทีจากเอกสารที่ฉันดู :
- สร้างรายการการเปลี่ยนแปลงที่รอดำเนินการหลายรายการในไคลเอนต์เดียว (
p4 change
) - แก้ไขรายการการเปลี่ยนแปลงที่รอดำเนินการ (ยัง
p4 change
) - ดูรายการการเปลี่ยนแปลงที่รอดำเนินการทั้งหมดของฉัน (
p4 changes -s pending
) - รายการไฟล์ที่เปลี่ยนแปลงทั้งหมดในไคลเอนต์ของฉัน (
p4 opened
) หรือในรายการการเปลี่ยนแปลงที่รอดำเนินการ (p4 describe
) - ดูความแตกต่างของรายการการเปลี่ยนแปลงที่รอดำเนินการ (ฉันใช้สคริปต์ wrapper สำหรับสิ่งนี้ซึ่งใช้
p4 diff
และp4 describe
) - สำหรับไฟล์ที่ระบุให้ดูว่ารายการการเปลี่ยนแปลงที่ส่งส่งผลกระทบต่อบรรทัดใด (
p4 annotate
) - สำหรับไฟล์ที่ระบุดูรายการคำอธิบายของรายการการเปลี่ยนแปลงที่มีผลต่อไฟล์ (
p4 log
) - ส่งรายการการเปลี่ยนแปลงที่รอดำเนินการ (
p4 submit -c
) - ยกเลิกรายการการเปลี่ยนแปลงที่รอดำเนินการ (
p4 revert
)
จำนวนมากวนเวียนอยู่กับ "รายการเปลี่ยนแปลง" "changelist" คือคำศัพท์ p4 คำศัพท์เทียบเท่า git คืออะไร?
ดูเหมือนว่าสาขาอาจเป็นสิ่งที่ผู้ใช้คอมไพล์ใช้แทนสิ่งที่ p4 เรียกว่ารายการเปลี่ยนแปลง สับสนเล็กน้อยเนื่องจาก p4 มีสิ่งที่เรียกว่าสาขาแม้ว่าจะดูเหมือนเป็นเพียงแนวคิดที่ไม่ชัดเจน (แม้ว่าฉันมักจะคิดว่าแนวคิดของสาขาของ p4 นั้นค่อนข้างแปลก แต่ก็แตกต่างจากแนวคิด RCS แบบคลาสสิกของสาขาอีกครั้ง)
อย่างไรก็ตาม ... ฉันไม่แน่ใจว่าจะทำสิ่งที่ฉันทำตามปกติในรายการการเปลี่ยนแปลง p4 ด้วยกิ่งก้านของ git ได้อย่างไร ใน p4 ฉันสามารถทำสิ่งนี้ได้:
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
ณ จุดนี้ฉันมีตัวเปลี่ยนที่มี a.txt ฉันสามารถแก้ไขคำอธิบายและทำงานต่อได้โดยไม่ต้องส่งรายการการเปลี่ยนแปลง นอกจากนี้หากปรากฎว่าฉันจำเป็นต้องทำการเปลี่ยนแปลงบางอย่างกับไฟล์อื่น ๆ เช่นพูดว่า bugfix ในเลเยอร์อื่น ๆ ของโค้ดฉันสามารถทำได้ในไคลเอนต์เดียวกัน:
$ 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 add
เกี่ยวข้องกับสาขาปัจจุบัน เท่าที่ฉันสามารถบอกได้เมื่อฉันgit commit
จะคอมมิตไฟล์ทั้งหมดที่ I git add
-ed ไม่ว่าฉันจะอยู่ในสาขาใดในเวลานั้น:
$ 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
ที่เหมือนกันทุกประการและจากผลลัพธ์ของมันดูเหมือนว่าการกระทำในข้อใดข้อหนึ่งจะมีผลเหมือนกัน ฉันทำอะไรผิดหรือเปล่า?