ดูเหมือนว่าจะสอดคล้องกับสิ่งที่ rebase ทำ
git svn rebase
จะดึงข้อมูลการแก้ไขจากพาเรนต์ SVN ของ HEAD ปัจจุบันและปรับฐานปัจจุบัน (ไม่ถูกคอมมิตกับ SVN) ทำงานกับมัน
git rebase
ไม่กล่าวถึง:
โปรดทราบว่าการผสาน rebase ทำงานโดยการเล่นซ้ำแต่ละคอมมิตจากสาขาการทำงานที่ด้านบนของ<upstream>
สาขา
ด้วยเหตุนี้เมื่อเกิดความขัดแย้งในการผสาน:
- ด้านที่มีการรายงานเป็นของเราเป็น rebased ดังนั้นไกลชุดเริ่มต้นด้วย
<upstream>
,
- และพวกเขาเป็นสาขาที่ทำงาน
กล่าวอีกนัยหนึ่งก็คือสลับด้าน
git rebase เล่นซ้ำแต่ละคอมมิตจากสาขาการทำงานที่ด้านบนของ<upstream>
สาขา
หากคุณกระทบยอดคำจำกัดความทั้งสอง:
- คอมมิตที่มาจาก SVN คือคอมมิตที่คอมมิตในเครื่องจะเล่นซ้ำ ซึ่งเป็นส่วนหนึ่งของ "ซีรีส์ที่มีการปรับปรุงใหม่" และอ้างอิงว่า "ของเรา" (ในกรณีของคุณคือ
test.txt
ไฟล์ที่มีbar
เนื้อหา)
- สาขาการทำงาน (ที่มี Git คอมมิตที่ SVN ไม่รู้จักในกรณีของคุณ
test.txt
ไฟล์ที่มีbaz
เนื้อหา) คือ "ของพวกเขา" และแต่ละคอมมิต Git ในเครื่องเหล่านั้นจะถูกเล่นซ้ำ
กล่าวอีกนัยหนึ่ง SVN หรือไม่:
- ว่า "
<upstream>
สาขา" (ด้านบนของที่อะไรจะย้อนและซึ่งเป็นส่วนหนึ่งของการกระทำ rebased เพื่อให้ห่างไกล ") คือ" เรา "
- สิ่งที่กำลังเล่นซ้ำ (สาขาการทำงาน) คือ "ของพวกเขา "
เคล็ดลับช่วยในการจำที่ดีโดยCommaToast :
สิ่งที่ HEAD ชี้ไปคือ "ของเรา"
(และสิ่งแรกคือการgit rebase upstream
ชำระเงินupstream
สาขาที่คุณต้องการ rebase: HEAD หมายถึงupstream
- ours
ตอนนี้)
git merge
ความสับสนที่มีแนวโน้มที่จะมาจากบทบาทของสาขาการทำงานในแบบคลาสสิก
เมื่อคุณกำลังรวม:
- "สาขาการทำงาน" คือสาขาที่มีสิ่งที่ "รวมกันแล้ว" และถือเป็น "ของเรา"
- ในขณะที่การกระทำอื่น ๆ แสดงถึงสิ่งที่กำลังเป็นอยู่ - ไม่ได้เล่นซ้ำ แต่ - รวมอยู่ด้านบนของสาขาการทำงานและถือว่าเป็น "ของพวกเขา"
ตามที่git rebase
หน้าคนกล่าวถึงการผสานระหว่าง rebase หมายถึงการสลับด้าน
อีกวิธีหนึ่งในการพูดสิ่งเดียวกันคือการพิจารณาว่า:
- สิ่งที่เรามีในสาขาที่เช็คเอาท์คือ 'ของเรา '
- สิ่งที่เรามี (และกำลังถูกรวมหรือเล่นซ้ำ) คือ 'ของพวกเขา '
ในการรวม :
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
เราไม่ได้เปลี่ยนสาขาปัจจุบัน 'B' ดังนั้นสิ่งที่เรามียังคงเป็นสิ่งที่เรากำลังดำเนินการอยู่ (และรวมจากสาขาอื่น)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
แต่ใน rebaseเราสลับข้างเพราะสิ่งแรกที่ rebase ทำคือการชำระเงินที่สาขาต้นน้ำ! (เพื่อเล่นซ้ำการกระทำปัจจุบันที่อยู่ด้านบน)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstream
จะเปลี่ยนHEAD
B เป็นสาขาต้นน้ำก่อนHEAD
(ดังนั้นการสลับของ 'ของเรา' และ 'ของพวกเขา' เมื่อเทียบกับสาขาการทำงาน "ปัจจุบัน" ก่อนหน้านี้)
x--x--x--x--x <- former "current" branch, new "theirs"
\
\
\--y--y--y(*) <- upstream branch with B reset on it,
new "ours", to replay x's on it
จากนั้น rebase จะเล่นซ้ำ 'การกระทำของพวกเขา' ใน 'สาขา B' ใหม่ของเรา:
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream branch
ขั้นตอนพิเศษเพียงอย่างเดียวgit svn rebase
คือ svn "fetch" จะถูกดำเนินการก่อนบน Git remote branch ที่เป็นตัวแทนของ SVN commits
ในตอนแรกคุณมี:
x--x--x--x--x(*) <- current branch B, "ours" for now.
\
\
\--y--y--y <- SVN tracking branch, "theirs for now"
ก่อนอื่นคุณอัปเดตสาขาการติดตาม SVN ด้วยคอมมิตใหม่ที่มาจาก SVN
x--x--x--x--x(*) <- current branch B, still "ours", not for long
\
\
\--y--y--y--y'--y' <- SVN tracking branch updated
จากนั้นคุณเปลี่ยนสาขาปัจจุบันเป็นด้าน SVN (ซึ่งกลายเป็น "ของเรา")
x--x--x--x--x <- for "B", now "their" during the rebase
\
\
\--y--y--y--y'--y'(*) <- SVN tracking branch updated, and branch B:
now "ours" (this is "what we now have")
ก่อนที่จะเล่นคอมมิตที่คุณกำลังทำซ้ำ (แต่ตอนนี้เป็น "ของพวกเขา" ในระหว่างการรีเบสนั้น)
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--y'--y'--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream SVN tracking branch