อะไรคือวิธีที่ดีที่สุดในการเลิกทำการผสาน Git ที่ลบไฟล์ออกจาก repo


13

ดังนั้นจินตนาการต่อไปนี้เกิดขึ้น (และเราทุกคนใช้ SourceTree):

  1. พวกเราทุกคนล้วนทำงานจากแหล่งกำเนิด / พัฒนา
  2. ฉันไปพักผ่อนวันหยุดเป็นเวลาหนึ่งสัปดาห์
  3. เพื่อนร่วมงานของฉันทำงานในพื้นที่หลายวันที่ผ่านมาโดยไม่ต้องผสานแหล่งกำเนิด / พัฒนากลับไปที่สาขาพัฒนาท้องถิ่นของเขา
  4. เขาพยายามที่จะผลักดันได้รับการบอกว่าเขาจะต้องรวมก่อนแล้วจึงดึง
  5. เขาได้รับความขัดแย้งหยุดการคอมมิทอัตโนมัติหลังจากดำเนินการต่อ
  6. สมมติว่า Git เป็นเหมือน SVN เพื่อนร่วมงานของฉันจะทิ้งไฟล์ "ใหม่" ในสำเนาการทำงานของเขาและจากนั้นคอมมิวนิตี้ผสาน - เช็ดไฟล์ "ใหม่" เหล่านั้นจากหัวต้นทาง / พัฒนา
  7. การทำงานสัปดาห์ที่มีค่าของการพัฒนาดำเนินต่อไป
  8. ฉันกลับมาจากวันหยุดและพบว่างานของฉันหายไปหลายวัน

พวกเราทุกคนใหม่มากสำหรับ Git (นี่เป็นโครงการแรกของเราที่ใช้มัน) แต่สิ่งที่ฉันทำเพื่อแก้ไขคือ:

  1. เปลี่ยนชื่อ "พัฒนา" เป็น "develop_old"
  2. ผสาน develop_old เข้ากับสาขาใหม่ "develop_new"
  3. รีเซ็ตสาขา develop_new เป็นคอมมิชชันล่าสุดก่อนการผสานที่ไม่ดี
  4. เชอร์รี่เลือกแต่ละการกระทำตั้งแต่นั้นมาแก้ไขความขัดแย้งด้วยตนเอง
  5. กด develop_old และ develop_new ไปยังจุดเริ่มต้น

เมื่อถึงจุดนี้ develop_new คือฉันหวังว่าสำเนา "ดี" ของการเปลี่ยนแปลงทั้งหมดของเราที่มีมูลค่าการทำงานสัปดาห์ต่อมาจะถูกนำมาใช้ใหม่ ฉันยังสมมติว่า "ย้อนกลับกระทำ" จะทำสิ่งที่แปลกในการผสานโดยเฉพาะอย่างยิ่งตั้งแต่ไม่กี่สัปดาห์ข้างหน้ามูลค่าของการทำงานอยู่บนพื้นฐานของมัน - และตั้งแต่ผสานที่มีจำนวนมากของสิ่งที่เราไม่ต้องการพร้อมกับสิ่งที่เราไม่' เสื้อ

ฉันหวังว่าสิ่งนี้จะไม่เกิดขึ้นอีก แต่ถ้ามันเกิดขึ้นอีกครั้งฉันอยากรู้วิธีที่ง่ายกว่า / ดีกว่าในการแก้ไขสิ่งต่าง ๆ มีวิธีที่ดีกว่าในการยกเลิกการรวม "ไม่ดี" เมื่อมีงานจำนวนมากดำเนินการใน repo ตามการผสานนั้นหรือไม่


1
คุณสามารถโพสต์ภาพหน้าจอของต้นไม้ git (ทำรายการใหม่อย่างเหมาะสม) หรือเอาท์พุทgit logรูปแบบที่คุณชื่นชอบพร้อมคำอธิบายประกอบที่เหมาะสมเกี่ยวกับสิ่งที่เกิดขึ้นในคอมมิชชันต่างๆ (ฉันจะทำซ้ำ / ใส่คำอธิบายประกอบgit log --graph --pretty=oneline --abbrev-commitและไปจากที่นั่น)

1
มันสายเกินไปสำหรับคุณ แต่การทดสอบหน่วยจะเป็นแบบนั้น
ใกล้

1
@nalply: ไม่ใช่ถ้าการรวมที่ไม่ดีได้ลบการทดสอบหน่วยด้วยเช่นกัน
Aaronaught

ว้าวนั่นเป็นโชคร้ายที่ร้ายกาจจริงๆ
ใกล้

คำตอบ:


6

หากฉันเข้าใจถูกต้องนี่เป็นสถานการณ์ของคุณ:

    ,-c--c--c--c--M--a--a--X ← develop
o--o--y--y--y--y-´

หลังจากประวัติทั่วไปบางอย่าง (o) คุณมุ่งมั่นและผลักดันงานของคุณ (y) เพื่อนร่วมงานของคุณ (c) ทำงานในที่เก็บข้อมูลในพื้นที่ของเขาและทำการรวมที่ไม่ดี (M) หลังจากนั้นอาจมีการกระทำเพิ่มเติม (a) ที่ด้านบนของ M

git reset --hard develop M^2
git branch coworker M^1

ตอนนี้กราฟของคุณดูเหมือนกับก่อนหน้าการผสานที่ไม่ดี:

    ,-c--c--c--c ← coworker
o--o--y--y--y--y ← develop

ทำการผสานที่ดี (G):

git checkout develop
git merge coworker

ที่เกิดขึ้นใน:

    ,-c--c--c--c-、
o--o--y--y--y--y--G ← develop

ตอนนี้การปลูกถ่ายความมุ่งมั่นเพิ่มเติม:

git reset --hard X
git rebase --onto G M develop

สิ่งนี้จะให้ผลลัพธ์สุดท้าย:

    ,-c--c--c--c-、
o--o--y--y--y--y--G--a--a--X ← develop

โปรดทราบว่าสิ่งนี้อาจส่งผลให้เกิดการรวมที่ขัดแย้งกันมากขึ้น นอกจากนี้คุณเพิ่งเปลี่ยนประวัติเช่นเพื่อนร่วมงานของคุณควรโคลน / รีเซ็ต / rebase เป็นประวัติศาสตร์ใหม่

PS: แน่นอนว่าคุณควรเปลี่ยนG, MและXในคำสั่งของคุณโดยที่สอดคล้องกันกระทำ ID


ดูเหมือนว่าค่อนข้างชัดเจนในคำถามที่ว่าข้อผูกพันเหล่านี้ทั้งหมดได้ถูกผลักไปยังพื้นที่เก็บข้อมูลที่ใช้ร่วมกันแล้วดังนั้นฉันไม่คิดว่าการรีบูตเป็นทางเลือกที่ดี การคืนค่าการคอมมิชชันล่าสุดทั้งหมดและจากนั้นเลือกเชอร์รี่ที่ถูกเปลี่ยนกลับที่ไม่ขัดแย้งด้านบนของการผสานที่ดีนั้นปลอดภัยยิ่งขึ้น
Aaronaught

นั่นคือส่วนที่มี clone / reset / rebase - หากมีนักพัฒนาเพียงไม่กี่คนบอกให้พวกเขาอัปเดตที่เก็บของพวกเขาอาจเป็นตัวเลือกที่ถูกต้อง
มิชา

1

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

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

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

ดังนั้นให้อธิบายกับเพื่อนร่วมงานของคุณว่านี่เป็นความล้มเหลวครั้งยิ่งใหญ่ แต่ให้พิจารณาการตบวงช่วยเหลือก่อนที่จะทำการผ่าตัดใหญ่


ฉันเห็นด้วยถ้ามันเป็นไฟล์ทั้งหมดที่หายไปสิ่งหนึ่งที่คุณทำได้คือถ้าคุณไม่สนใจประวัติในไฟล์เก่า: 1. ทำให้สาขาใหม่จากสาขาที่ยุ่งเหยิงในปัจจุบัน 2. สลับกลับไปที่สาขาที่ไม่ดีและสร้างสาขาใหม่ที่เป็นสาขาช่วยเหลือของคุณ 3. จากสาขาช่วยเหลือของคุณกลับไปที่คำสั่งก่อนส่งมอบ 4. คัดลอกไฟล์ที่ถูกลบที่ไหนสักแห่งนอก git 5. สลับไปยังสาขาใหม่อื่น ๆ 6. คัดลอกเวอร์ชันใหม่ของไฟล์ที่ถูกลบไปยังสาขาใหม่และกระทำ มีวิธีที่ซับซ้อนมากขึ้นในการบันทึกประวัติที่โพสต์ชื่อดังของ Linus T.
Elin

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