git - ผสานความขัดแย้งเมื่อโลคัลถูกลบ แต่มีไฟล์อยู่ในระยะไกล


116

ฉันใหม่มากในการคอมไพล์และสงสัยว่าฉันควรจะไปเกี่ยวกับการผสานที่ใดใน repo ในเครื่องฉันได้ลบไฟล์หลายไฟล์ในสาขาหลัก แต่ไฟล์เหล่านี้มีอยู่ในสาขาหลักระยะไกล

หลังจากทำการผสานคอมไพล์แล้วจะแสดงความขัดแย้งที่เกิดขึ้น

การใช้ git gui แสดงว่าไฟล์ในเครื่องถูกลบในขณะที่ไฟล์สาขาระยะไกลมีเนื้อหา

คุณจะหยุดไม่ให้ไฟล์เหล่านี้ขัดแย้งกันได้อย่างไร? มีวิธีง่ายๆในการใช้ git gui หรือไม่?

ขอบคุณมาก


ที่ผ่านมาสิ่งหนึ่งที่ฉันเคยทำคือปล่อยให้ไฟล์ "ลบ" อยู่ในการควบคุมแหล่งที่มา แต่ไม่รวมไฟล์เหล่านั้นจากโปรเจ็กต์ / makefile / อะไรก็ตาม เป็นวิธีแก้ปัญหาชั่วคราวสำหรับการผสานความขัดแย้งอย่างน้อยที่สุด
Mark Rushakoff

2
คุณแก้ไขด้วยวิธีเดียวกับที่คุณแก้ไขข้อขัดแย้งในการผสาน: เพิ่มเวอร์ชันที่ต้องการ (ไม่ว่าจะเป็นไฟล์หรือไม่มีไฟล์) ลงในดัชนีแล้วคอมมิต คุณต้องการอันไหน?
Cascabel


@MarkRushakoff ฉันจะเขียนคำแนะนำของคุณใหม่เป็น "เมื่อฉันเจอสถานการณ์ที่ฉันต้องการแก้ไขความขัดแย้งฉันก็ไม่ได้แก้ไขปัญหาเหล่านั้นด้วยความจริงเพียงแค่ปิดบังพวกเขาเพื่อที่พวกเขาจะกัดใครบางคน (อาจไม่ใช่ฉัน) ในอนาคต" นี่เป็นคำแนะนำที่ดีมากสำหรับผู้ที่ต้องการนำปัญหาเพิ่มเติมเข้ามาในโครงการ
Victor Yarema

คำตอบ:


155

คุณควรแก้ไขข้อขัดแย้งตามที่เห็นสมควร หากไฟล์นั้นควรจะถูกลบจริงๆและคุณกำลังจะเผยแพร่ที่เปลี่ยนไปเป็นต้นทางให้ลบออกอีกครั้ง:

git rm path/to/file

หากยังคงติดตามไฟล์อยู่ให้เพิ่ม (เวอร์ชันในแผนผังงานจะเป็นเวอร์ชันต้นทาง):

git add path/to/file

หลังจากดำเนินการอย่างใดอย่างหนึ่งเพื่อแก้ไขความขัดแย้งแล้วให้ทำการผสาน


ฉันมีไฟล์หลายไฟล์ทั้งหมดอยู่ในไดเร็กทอรีเดียวกันและทั้งหมดมีคำต่อท้ายเหมือนกัน มีทางลัดในการลบทั้งหมดในครั้งเดียวในขณะที่รักษาไฟล์ที่เหลือใน dir หรือไม่?
chiborg

@chiborg: นั่นเป็นเพียงคำถามเปลือก ๆ cdไปยังไดเร็กทอรีและgit rm *.ext. เชลล์ของคุณ(ไม่ใช่ Git) ขยาย*.extไปยังชื่อไฟล์ที่ตรงกันทั้งหมด
Cascabel

และถ้าฉันต้องการรักษาไฟล์บางไฟล์ไว้? git rmไม่มี-iธง
chiborg

@chiborg: คุณบอกว่าคุณต้องการลบทุกอย่างด้วยคำต่อท้ายที่กำหนดและปล่อยให้ทุกอย่างเหมือนเดิม นั่นคือสิ่งที่ฉันบอกคุณว่าต้องทำอย่างไร หรือคุณหมายถึงgit rm *-suffix.ext? ความแตกต่างเดียวกัน หากคุณมีปัญหาในการหาวิธีใช้เชลล์ไวลด์การ์ดโปรดสอบถามใน unix.stackexchange.com หากคุณทราบข้อเท็จจริงว่าสิ่งที่คุณต้องการไม่สามารถทำได้ด้วย globbing ให้ใช้rm -iและตามด้วยgit add -uเพื่อรับการลบ
Cascabel

2
@Jefromi ถ้าฉันระบุ-s recursive -X oursทำไมถึงยังจำเป็นgit rmและgit add?
Noel Yap

27

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

git diff ...origin/master -- path/to/file

หากเป็นสถานการณ์"ลบโดยพวกเขา"และคุณต้องการเห็นการเปลี่ยนแปลงเพื่อนำไปใช้ที่อื่นคุณสามารถใช้:

git diff origin/master... -- path/to/file

6
ใช่! นี่เป็นสิ่งสำคัญหากคุณไม่ต้องการเพียงแค่ทำลายการเปลี่ยนแปลงที่คุณกำลังรวมเข้าด้วยกันเช่นเมื่อฉันเพิ่งเปลี่ยนชื่อไฟล์หรือเนื้อหาถูกย้ายก่อนที่ไฟล์จะถูกลบ
Edward Anderson

8
เป็นคำเตือน: นี้ไม่ทำงานเมื่อความขัดแย้งเกิดขึ้นในระหว่างrebasing ต้องชัดเจนเช่นgit diff mybranch@{1}...origin/master -- path/to/file
nschum

@nschum ขอบคุณ! นี่คือสิ่งที่ฉันกำลังมองหา
Chuim

2
คุณยังสามารถใช้git diff --base(ดูคำตอบอื่นของฉัน)
Dorian Marchal

สวัสดีโจเซฟฉันยังติดอยู่แม้ว่าคำตอบนี้จะดูดี หากคุณมีเวลาฉันอยากให้คุณตอบที่นี่: stackoverflow.com/q/63044843/470749ขอบคุณ!
Ryan

9

ใน Git GUI คุณเลือกไฟล์ที่ขัดแย้งแล้วคลิกขวาบนพื้นที่ข้อความหลักที่แสดงข้อความที่ขัดแย้งกัน

ในเมนูบริบทที่ปรากฏขึ้นคุณสามารถเลือกได้ว่าจะใช้ "Remote" หรือไปด้วย "Local" ดังนั้นหากไฟล์ถูกลบจากระยะไกลคุณสามารถเลือก "ระยะไกล" เพื่อเผยแพร่การลบในเครื่องและในทางกลับกัน

ฉันใช้เวลาหนึ่งเดือนในการคิดออก ... คงจะดีถ้า Git GUI มีเอกสารประกอบจริงๆ ...


4

คำตอบที่ได้คะแนนสูงสุดมุ่งเน้นไปที่วิธีการแก้ไขความขัดแย้ง

ก่อนหน้านั้นคุณอาจต้องการทราบว่ารีโมตเปลี่ยนแปลงอะไรบ้างในไฟล์ที่ถูกลบในเครื่อง

ในการทำเช่นนั้นคุณสามารถดูการเปลี่ยนแปลงได้ดังนี้

git diff --base

จาก https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

เปรียบเทียบโครงสร้างการทำงานกับ "ฐาน" เวอร์ชัน [... ] ดัชนีประกอบด้วยขั้นตอนเหล่านี้สำหรับรายการที่ไม่ได้ผสานเท่านั้นเช่นในขณะที่แก้ไขความขัดแย้ง


นี่คือคำอธิบายที่ดีของgit diff --base stackoverflow.com/a/60484874/470749
Ryan

0

ใน EGit ฉันยังพบปัญหา วิธีแก้ปัญหาของฉันคือ:

  • ใช้มุมมอง Git Staging
  • ดับเบิลคลิกที่แต่ละไฟล์ที่แสดงในการเปลี่ยนแปลงที่ไม่มีการจัดเตรียมเพื่อเปิดตัวเปรียบเทียบ
  • คลิกไอคอน "คัดลอกทั้งหมดจากซ้ายไปขวา"
  • บันทึกไฟล์ (จะหายไปจากรายการที่ไม่มีการจัดเตรียม)

0

ตามที่ระบุไว้ในคำตอบที่เป็นประโยชน์สำหรับคำถามที่เกี่ยวข้องนี้คุณสามารถใช้git mergetoolเพื่อเริ่มกล่องโต้ตอบซึ่งคุณสามารถเลือกได้ว่าคุณต้องการใช้ไฟล์เวอร์ชันที่แก้ไขแล้วหรือเวอร์ชันที่ถูกลบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.