ไฟล์ git เวอร์ชันใดที่จะใช้ในที่สุด: LOCAL, BASE หรือ REMOTE


174

เมื่อมีการโคในช่วงgit mergeที่ผมเปิด mergetool ที่เรียกว่าMeld มันเปิดสามไฟล์ LOCAL, BASE และ REMOTE ขณะที่ฉันอ่าน LOCAL เป็นสาขาในพื้นที่ของฉัน BASE เป็นบรรพบุรุษร่วมกันและ REMOTE เป็นสาขาที่จะรวมเข้าด้วยกัน

ทีนี้คำถามของฉัน: ในที่สุดไฟล์เวอร์ชันไหนจะถูกใช้ในที่สุด? มันคือระยะไกล? ถ้าเป็นเช่นนั้นฉันสามารถแก้ไขได้ตามที่ต้องการไม่ว่าจะเป็นสาขาใดใน BASE

คำตอบ:


142

มันอยู่ตรงกลาง: BASE.

ในความเป็นจริงBASEไม่ได้เป็นบรรพบุรุษร่วมกัน แต่ผสานครึ่งเสร็จที่ความขัดแย้งจะมีเครื่องหมายและ>>>><<<<

คุณสามารถดูชื่อไฟล์ที่ด้านบนของหน้าต่างการแก้ไขแบบผสมผสาน

ดูภาพหน้าจอที่นี่

หลอมรวมฐาน

คุณสามารถแก้ไขBASEไฟล์ตามที่คุณต้องการโดยใช้หรือไม่ใช้คำสั่ง meld
นอกจากนี้คุณยังสามารถกำจัดไฟล์ meld และแก้ไขไฟล์ด้วยโปรแกรมแก้ไขข้อความที่คุณโปรดปราน

  • รหัสระหว่าง<<<< HEADและ=====เครื่องหมายเป็นหนึ่งในไฟล์ในเครื่องของคุณก่อนทำการผสาน
  • รหัสระหว่าง====และ>>>> <branch name>เป็นหนึ่งในไฟล์ระยะไกล

3
บางคนได้รับการเข้าใจที่ดีขึ้นของชิ้นที่ขัดแย้งกันในแฟ้มที่ล้มเหลวในการผสานอัตโนมัติหากพวกเขามีmerge.conflictstyleชุดตัวเลือกการกำหนดค่าแทนการเริ่มต้นdiff3 merge
kostix

3
ที่จริงฉันไม่เห็น HEAD, <<< และ === ร้องเพลง ในกรณีที่คุณให้หน้าต่างกลางจะว่างเปล่า แต่นั่นเป็นเพียงบันทึกสำหรับคนอื่น ๆ ขอบคุณสำหรับคำตอบของคุณ
tsusanka

หากคุณไม่เห็นHEAD, <<<<<และ=====สัญญาณก็หมายความว่าไม่มีความขัดแย้งในทุก ในกรณีนี้หน้าต่างตรงกลางจะไม่ว่างเปล่ามันจะแสดงผลลัพธ์การรวม แต่จะไม่มีส่วน "สีแดง"
Fabien Quatravaux

10
เมื่อฉันทำผสานกับ Meld ผมไม่เห็นใด ๆ<<<<<<, ======หรือ>>>>>>เครื่องหมายในบานหน้าต่างกลาง (IE รุ่นฐาน) ทั้ง; และบางครั้งบานหน้าต่างกลางจะว่างเปล่าเช่นที่รายงาน aGr บางทีความแตกต่างนี้อาจเกิดจากการตั้งค่าที่แตกต่างกัน เมื่อผมเริ่มเครื่องมือ Meld ไฟล์ต่อไปนี้จะมีอยู่สมมติว่าชื่อของไฟล์ในพื้นที่เก็บข้อมูลที่เป็นX.java: X.java, X.java.orig, X.java.BACKUP.#, X.java.BASE.#, X.java.LOCAL.#, X.java.REMOTE.#ที่#เป็นจำนวนบาง การเรียกผลลัพธ์การผสานเวอร์ชัน BASE จะทำให้เกิดความสับสน MERGED จะดีกว่า
Teemu Leisti

3
ในความเป็นจริงแล้ว BASE นั้นเป็นบรรพบุรุษของคนทั่วไป MERGED เป็นชื่อของไฟล์ที่มีข้อมูลการผสานบางส่วนอยู่ โปรดดูคำถามและคำตอบของฉันการตั้งค่าและใช้ Meld เป็น gft difftool และ mergetool ของคุณซึ่งอธิบายว่ามันทำงานอย่างไร HTH
mattst

107

Meld มีคุณลักษณะการผสานแบบ 3 ทิศทางที่ซ่อนอยู่ซึ่งเปิดใช้งานโดยผ่านพารามิเตอร์ที่ 4:

meld $LOCAL $BASE $REMOTE $MERGED

บานหน้าต่างด้านขวาและซ้ายจะเปิดขึ้นในโหมดอ่านอย่างเดียวดังนั้นคุณจึงไม่สามารถผสานวิธีที่ผิดไปได้โดยไม่ตั้งใจ บานหน้าต่างตรงกลางแสดงผลลัพธ์ของการผสาน สำหรับความขัดแย้งจะแสดงเวอร์ชันพื้นฐานเพื่อให้คุณเห็นบิตที่สำคัญทั้งหมด: ข้อความต้นฉบับที่อยู่ตรงกลางและการแก้ไขที่ขัดแย้งกันทั้งสองด้าน สุดท้ายเมื่อคุณกดปุ่ม "บันทึก" ไฟล์ $ MERGED จะถูกเขียน - ตามที่คาดไว้โดย git

ไฟล์ ~ / .gitconfig ที่ฉันใช้มีการตั้งค่าต่อไปนี้:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

สิ่งนี้จะเปิดขึ้นพร้อมกับ 3 แท็บแท็บที่ 1 และที่ 2 ที่มี diffs ง่าย ๆ ที่ฉันพยายามผสานและแท็บที่ 3 เปิดตามค่าเริ่มต้นจะแสดงมุมมองการรวม 3 ทิศทาง

ตอนนี้เหตุผลที่ทำให้ฟีเจอร์ถูกซ่อนอยู่ก็คือมันยังไม่ขัดพอ มันมีประโยชน์อย่างมากในขณะนี้ แต่ Kai Willadsen ผู้แต่ง meld ชี้ไปที่รอยย่นเล็กน้อยที่ต้องรีดออก ตัวอย่างเช่นไม่มี GUI เพื่อเริ่มโหมดการผสาน 3 ทิศทางไวยากรณ์ของบรรทัดคำสั่งเป็นบิต arcane และเช่นนั้น หากคุณพูดภาษาไพ ธ อนและมีเวลาพอสมควรคุณก็รู้ว่าต้องทำอะไร

แก้ไข: ใน Meld เวอร์ชันใหม่ synax มีการเปลี่ยนแปลงเล็กน้อย นี่คือความคิดเห็น แต่มันอยู่ในคำตอบ

คำสั่ง meld ใช้ตัวเลือก --output ดังนั้นบรรทัดสุดท้ายจากตัวอย่างด้านบนควรเป็น:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

7
@Jesse, @lumbric ดูเหมือนว่า meld เวอร์ชันใหม่จะใช้แฟ--outputล็กสำหรับผลลัพธ์ $ MERGED ฉันค้นพบสิ่งนี้ในขณะที่ดูสคริปต์เรียกใช้ meld ที่มาพร้อมกับเวอร์ชัน git ของฉัน: github.com/git/git/blob/master/mergetools/meld
โยฮัน

1
@lumbric ผมเชื่อว่ามันไม่สำหรับ Meld 1.7.x + --output optionกับ ดูบรรทัดนี้ในสคริปต์เรียกใช้:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
โยฮัน

12
ใน meld ล่าสุด (เวอร์ชั่น> 1.8.4) เราต้องใช้ตัวเลือก - อัตโนมัติผสาน cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE - ผสานอัตโนมัติ $ LOCAL $ BASE $ REMOTE - เอาท์พุท $ MERGED
RoboAlex

7
ฉันมีปัญหาเช่นเดียวกับ @pingpongboss โดยใช้ Meld 1.8.4: Meld กำลังเปิดสิ่งต่าง ๆ ในบานหน้าต่างแยกต่างหากแทนที่จะเปิดแท็บที่ 3 cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGEDคำสั่งปรับการทำงานในที่สุดก็คือ ดังนั้นสิ่งนี้จะเปิด 3 แท็บ (แบบเก่าดี) การผสานอัตโนมัติจะเป็นการผสานที่ไม่ขัดแย้งเข้ามาตรงกลางโดยที่ตรงกลางคือ $ MERGED และจะใช้เป็นเอาต์พุตการแก้ไขข้อขัดแย้ง
farmir

2
ไวยากรณ์สำหรับผลลัพธ์อาจเป็น--output=<file>หรือ-o <file>ดูmeld --help
levsa

57

มี 4 ไฟล์ที่เกี่ยวข้อง:

  1. $LOCALไฟล์ในสาขาที่คุณกำลังผสาน มิได้ถูกแตะต้องโดยกระบวนการผสานเมื่อแสดงให้คุณเห็น

  2. $REMOTEไฟล์ในสาขาที่คุณรวมเข้าด้วยกัน; มิได้ถูกแตะต้องโดยกระบวนการผสานเมื่อแสดงให้คุณเห็น

  3. $BASEบรรพบุรุษร่วมกันของ $ LOCAL และ $ REMOTE คือ จุดที่ทั้งสองสาขาเริ่มโอนไฟล์ที่พิจารณา มิได้ถูกแตะต้องโดยกระบวนการผสานเมื่อแสดงให้คุณเห็น

  4. $MERGEDไฟล์ที่ผสานบางส่วนโดยมีข้อขัดแย้ง นี่เป็นไฟล์เดียวที่สัมผัสโดยกระบวนการผสานและจริงๆแล้วไม่เคยแสดงให้คุณเห็นmeld


$MERGEDไฟล์เป็นคนที่มี<<<<<<, >>>>>>, =====(และอาจจะ||||||) เครื่องหมาย (ความขัดแย้งคั่น) นี่คือไฟล์ที่คุณแก้ไขด้วยตนเองเพื่อแก้ไขข้อขัดแย้ง

การแก้ไขข้อขัดแย้งด้วยตนเองและการแก้ไขข้อขัดแย้งด้วยภาพจะกระทำในไฟล์ที่แตกต่างกันและนำเสนอข้อมูลที่แตกต่างกัน

เมื่อใช้ mergetool นี้ (สมมติmeld) แฟ้มที่เห็นนั้นคือ: $LOCAL, ,$BASE $REMOTEโปรดทราบว่าคุณไม่เห็น$MERGEDไฟล์แม้ว่าจะถูกส่งเป็นพารามิเตอร์ที่ซ่อนไว้meldเพื่อเขียนผลลัพธ์ของการแก้ไขที่นั่น

ในคำอื่น ๆ ในการmeldที่คุณจะแก้ไขไฟล์ที่อยู่ตรงกลางที่$BASEไฟล์และคุณรับการเปลี่ยนแปลงทั้งหมดจากซ้ายหรือจากขวาด้วยตนเอง มันเป็นไฟล์ที่สะอาดไม่ได้สัมผัสโดยกระบวนการผสาน ข้อผิดพลาดเพียงอย่างเดียวคือเมื่อคุณบันทึกแล้วคุณจะไม่บันทึกลงใน$BASEไฟล์ แต่ในพารามิเตอร์ที่ซ่อนที่สี่ของmeldนั่นคือ$MERGEDไฟล์ (ซึ่งคุณไม่เห็นด้วย) $BASEไฟล์ไม่ได้มีความขัดแย้งใด ๆ หรือการผสานประสบความสำเร็จบางส่วนเพราะมันไม่ได้เป็น$MERGEDไฟล์

ในการแก้ไขด้วยสายตาเมื่อนำเสนอ$BASEไฟล์ให้คุณ(แทนที่จะเป็น$MERGEDไฟล์) gitโดยทั่วไปจะทิ้งความพยายามทั้งหมดที่จะทำการผสาน (ความพยายามเหล่านั้นจะปรากฏให้เห็นหากคุณต้องการในไฟล์ $ MERGED) และช่วยให้คุณทำการผสานได้อย่างสมบูรณ์จากรอยขีดข่วน

บรรทัดล่างคือว่าในความขัดแย้งการผสานด้วยตนเองและการมองเห็นคุณไม่ได้ดูไฟล์เดียวกัน แต่ผลลัพธ์สุดท้ายจะถูกเขียนในไฟล์เดียวกัน (นั่นคือ$MERGEDไฟล์)

การแก้ไขด้วยตนเองของความขัดแย้งจะทำบน$MERGEDเพราะgit ไม่เคยมีใครเฉลี่ยจะนำเสนอคุณสามไฟล์จึง squashes ข้อมูลจากสามไฟล์ ( $LOCAL, $BASE, $REMOTE) ในการที่$MERGEDไฟล์

แต่เครื่องมือที่ภาพมีวิธีการที่จะแสดงให้คุณสามไฟล์: พวกเขาแสดงให้คุณเห็น$LOCAL, $BASE, $REMOTEไฟล์ คุณกำลังเลือกการเปลี่ยนแปลงจาก$LOCALและ$REMOTEไฟล์และคุณกำลังนำสิ่งเหล่านั้นมาสู่$BASEไฟล์สร้างใหม่อย่างสมบูรณ์และแม้แต่เขียนทับความพยายามที่ล้มเหลวของการรวมที่เป็น$MERGEDไฟล์


ฉันแค่อยากให้มีเครื่องมือ (เช่นการเปรียบเทียบ) ที่แสดงไฟล์ทั้ง 4
yoniLavi

@yoniYalovitsky: ใช่หรือ p4merge
user1284631

ฉันเคยใช้เครื่องมือผสานจากแพ็คเกจ ClearCase
mishmashru

@yoniLavi - เครื่องมือเหล่านี้แสดง 4 บานหน้าต่างแต่ไม่จำเป็นต้องมีทั้งสี่ไฟล์ดังที่อธิบายไว้ในคำตอบนี้ โดยเฉพาะอย่างยิ่งคุณสามารถตั้งค่าเครื่องมือ 4 บานหน้าต่างเหล่านี้จะแสดงให้คุณ$LOCAL, $REMOTE, $BASEและการส่งออกในขั้นต้นเท่ากับ$BASEแต่ที่แตกต่างจาก$MERGEDในการที่จะไม่ได้มีความพยายามที่คอมไพล์ที่จะรวมไฟล์และเครื่องหมายความขัดแย้งและอื่น ๆ ในความเป็นจริงนั้นจะเป็นวิธีการใช้เครื่องมือเหล่านี้ที่คล้ายกับวิธี 3 บานหน้าต่างของ LOCAL / REMOTE / BASE + OUTPUT ซึ่งไม่แสดงการผสาน บานหน้าต่างที่ 4 ช่วยให้คุณสามารถแยกฐานออกจากเอาต์พุต
BeeOnRope

16

วิธีการแก้ปัญหา Cosmin ทำงาน แต่BASE $ไฟล์ปรับปรุง - ไม่$ ผสาน นี่จะอัปเดตไฟล์$ MERGED :

meld: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

ฉันสามารถยืนยันสิ่งนี้โซลูชันของ Saad ใช้ได้กับฉันใน Ubuntu เท่าที่คำถามเดิมไปนี่คือคำตอบที่ถูกต้องในปัจจุบัน
cosmin

3
ในเวอร์ชัน meld ของฉัน - 3.11 คำสั่งนี้ใช้ได้ดี:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM

ทำไมคุณถึงต้องการ--diff $BASE $LOCAL --diff $BASE $REMOTEในตอนท้าย? สำหรับฉันใน 1.8.4 นี้ใช้งานได้ดี (เท่าที่ฉันสามารถเห็น):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
farmir

1
@farmir: มันไม่จำเป็น มันเปิดแท็บอีกสองแท็บเป็นกลุ่มเพื่อให้คุณเห็น LOCAL และ REMOTE เทียบกับ BASE แยกกัน
Sam Kauffman

1
ไม่ว่าฉันจะพยายามเรียงตามลำดับแบบใดแท็บสามทางจะเป็นแท็บที่สามเสมอในขณะที่แท็บแรกจะถูกเลือกตามค่าเริ่มต้นเสมอ มีวิธีในการเลือกแท็บสามทางเป็นค่าเริ่มต้นหรือไม่
Sam Kauffman

13

ด้วยMeld 1.7การแก้ปัญหาโดย Tomek Bury ไม่ทำงานอีกต่อไป

การตั้งค่าเริ่มต้นไม่เป็นไปตามฉัน:

การตั้งค่าเริ่มต้น

สำหรับMeld> = 1.7ฉันแนะนำหนึ่งในสองวิธีอื่น ๆ

วิธีแก้ปัญหาแรก :

 meld $LOCAL $BASE $REMOTE --auto-merge

ทางออกแรก

ทางออกที่สอง :

 meld $LOCAL $MERGED $REMOTE

ทางออกที่สอง

.gitconfig

คัดลอกและวางสิ่งนี้ลงใน.gitconfigไฟล์ของคุณเพื่อรับการแก้ปัญหาตามที่อธิบายไว้ข้างต้น:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

คัดลอกและวางสิ่งนี้ใน.gitconfig.localไฟล์เพื่อตั้งค่า meld17 หรือ meld16 เฉพาะสำหรับเครื่องนี้ในกรณีที่คุณใช้. gitconfig ของคุณบนเครื่องหลายเครื่อง:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

สิ่งนี้ใช้ไม่ได้กับ Meld 1.8.4 หากคุณเรียกใช้cmd = meld $LOCAL $BASE $REMOTE --auto-mergeบานหน้าต่างตรงกลางจะเป็น $ BASE และไม่ใช่ $ MERGE ที่ใช้เป็นผลลัพธ์ของการแก้ไขข้อขัดแย้ง
farmir

1
@farmir คุณเลือก $ BASE เป็นแท็บที่สอง
Alex78191

11

ฉันพบว่าไม่มีไฟล์เริ่มต้นที่แสดงอยู่ที่ถูกบันทึกไว้ ผสมได้แสดง$LOCAL, $REMOTEและ$BASEโดยค่าเริ่มต้น เพื่อให้มันใช้งานได้ฉันต้องทำรายการผสมผสาน$MERGED$BASEแทน นำสิ่งนี้ไปใช้กับฉันแล้ว~/.gitconfigแก้ไขให้ฉัน:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

ฉันใช้ Arch กับ:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

ขอโทษนะการกำหนดค่า inux นี้ใช้งานร่วมกันได้หรือไม่?
MadMad666

2

ด้วยเหตุผลบางอย่าง meld รุ่นใหม่ล่าสุดจะไม่แสดงบรรทัดของตัวทำเครื่องหมายที่เพิ่มสำหรับความขัดแย้ง (<<<<<<<, =======, >>>>>>>) หากคุณต้องการเห็นบรรทัดเหล่านั้นคุณควรติดตั้ง meld v 1.3.3 หรือก่อนหน้า


ฉันพบว่ามีประโยชน์คำตอบของ @lumbric stackoverflow.com/a/22911793/641892
wnasich

2

โปรดดูคำตอบของ Saad สำหรับคำตอบที่ถูกต้อง

ด้วย meld 1.8.1 บน Ubuntu ฉันได้รับ

จำนวนอาร์กิวเมนต์ที่จ่ายให้กับ --diff ไม่ถูกต้อง

และการเพิ่ม - เอาท์พุทก่อนที่ MERGED จะแก้ไขให้ฉัน:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.