TL; DR;
เพื่อสรุป (เป็นความคิดเห็นBenubird ) เมื่อ:
git checkout A
git rebase B # rebase A on top of B
local
คือB
(rebase สู่ )
remote
คือ A
และ:
git checkout A
git merge B # merge B into A
local
คือA
(รวมเข้าไป )
remote
คือ B
สวิตช์ rebase ours
(สาขาปัจจุบันก่อนที่จะเริ่ม rebase) และtheirs
(สาขาที่ด้านบนที่คุณต้องการ rebase)
kutschkemชี้ให้เห็นว่าในบริบท GUI mergetool :
- การอ้างอิงโลคัลที่กระทำต่อที่ถูกปฏิเสธบางส่วน : "
ours
" (สาขาต้นน้ำ)
- ระยะไกลหมายถึงการเปลี่ยนแปลงที่เข้ามา : "
theirs
" - สาขาปัจจุบันก่อนที่จะ rebase
ดูภาพประกอบในส่วนสุดท้ายของคำตอบนี้
ผกผันเมื่อรีบูต
ความสับสนที่อาจจะเกี่ยวข้องกับการผกผันของours
และtheirs
ในช่วง rebase
(สารสกัดที่เกี่ยวข้อง)
git rebase
หน้าคน :
โปรดทราบว่าการรวม rebase จะทำงานโดยการเล่นซ้ำแต่ละการกระทำจากสาขาที่ทำงานอยู่ด้านบนของ<upstream>
สาขา
ด้วยเหตุนี้เมื่อเกิดข้อขัดแย้งในการผสาน:
- ด้านรายงานว่า '
ours
' คือ rebased ดังนั้นไกลชุดเริ่มต้นด้วย<upstream>
,
- และ '
theirs
' เป็นสาขาที่ทำงาน กล่าวอีกนัยหนึ่งคือสลับข้าง
ภาพประกอบการผกผัน
เมื่อรวมกัน
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
และจากนั้นการรีบูตจะเล่นซ้ำ 'การกระทำของพวกเขาในสาขา 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
หมายเหตุ: แนวคิด"อัพสตรีม"เป็นชุดข้อมูลอ้างอิง (repo ทั้งหมดหรือเช่นที่นี่สาขาซึ่งอาจเป็นสาขาท้องถิ่น ) ซึ่งข้อมูลจะถูกอ่านหรือมีการเพิ่ม / สร้างข้อมูลใหม่
' local
' และ ' remote
' กับ ' mine
' และ ' theirs
'
Pandawoodเพิ่มในความคิดเห็น :
สำหรับฉันคำถามยังคงอยู่ซึ่งเป็น "ท้องถิ่น" และใครคือ "ระยะไกล" (เนื่องจากข้อกำหนด "ของเรา" และ "ของพวกเขา" ไม่ได้ใช้เมื่อรีบูตในคอมไพล์หมายถึงพวกเขาดูเหมือนจะทำให้คำตอบสับสนมากขึ้น) .
GUI git mergetool
kutschkemเพิ่มและถูกต้องดังนั้น:
เมื่อแก้ไขข้อขัดแย้ง git จะพูดดังนี้:
local: modified file and remote: modified file.
ฉันค่อนข้างมั่นใจว่าคำถามนี้มีจุดมุ่งหมายที่คำจำกัดความของท้องถิ่นและระยะไกล ณ จุดนี้ ณ จุดนั้นดูเหมือนว่าฉันจากประสบการณ์ของฉันที่:
- การอ้างอิงโลคัลที่กระทำต่อที่ถูกปฏิเสธบางส่วน : "
ours
" (สาขาต้นน้ำ)
- ระยะไกลหมายถึงการเปลี่ยนแปลงที่เข้ามา : "
theirs
" - สาขาปัจจุบันก่อนที่จะ rebase
git mergetool
ไม่พูดถึง 'ท้องถิ่น' และ 'ระยะไกล' อย่างแน่นอน :
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
ตัวอย่างเช่นKDiff3จะแสดงความละเอียดผสานดังนี้:
และmeldก็จะแสดงมันเช่นกัน:
เหมือนกันสำหรับvimdiff , ซึ่งแสดง :
เรียกใช้ Vimdiff เป็น mergetool ด้วย git mergetool -t gvimdiff Git เวอร์ชันล่าสุดเรียกใช้ Vimdiff ด้วยเค้าโครงหน้าต่างต่อไปนี้:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
LOCAL
:
ไฟล์ชั่วคราวที่มีเนื้อหาของไฟล์ในสาขาปัจจุบัน
BASE
:
ไฟล์ชั่วคราวที่มีฐานร่วมสำหรับการผสาน
REMOTE
:
ไฟล์ชั่วคราวที่มีเนื้อหาของไฟล์ที่จะผสาน
MERGED
:
ไฟล์ที่มีเครื่องหมายข้อขัดแย้ง
Git ดำเนินการแก้ไขข้อขัดแย้งโดยอัตโนมัติให้ได้มากที่สุดเท่าที่จะเป็นไปได้และสถานะของไฟล์นี้เป็นการรวมกันของทั้งคู่LOCAL
และREMOTE
กับตัวทำเครื่องหมายความขัดแย้งที่ล้อมรอบสิ่งใดก็ตามที่ Git ไม่สามารถแก้ไขได้ ควรเขียนผลมาจากมติให้ไฟล์นี้
mergetool