มีวิธีแก้ไขข้อขัดแย้งสำหรับไฟล์ทั้งหมดโดยใช้การชำระเงิน--oursและ--theirsหรือไม่ ฉันรู้ว่าคุณสามารถทำได้สำหรับไฟล์แต่ละไฟล์ แต่ไม่สามารถหาวิธีทำได้ทั้งหมด
มีวิธีแก้ไขข้อขัดแย้งสำหรับไฟล์ทั้งหมดโดยใช้การชำระเงิน--oursและ--theirsหรือไม่ ฉันรู้ว่าคุณสามารถทำได้สำหรับไฟล์แต่ละไฟล์ แต่ไม่สามารถหาวิธีทำได้ทั้งหมด
คำตอบ:
เพียง grep ผ่านไดเร็กทอรีการทำงานและส่งเอาต์พุตผ่านคำสั่ง xargs:
grep -lr '<<<<<<<' . | xargs git checkout --ours
หรือ
grep -lr '<<<<<<<' . | xargs git checkout --theirs
วิธีการทำงาน: grepจะค้นหาทุกไฟล์ในไดเร็กทอรีปัจจุบัน (the .) และไดเร็กทอรีย่อยแบบวนซ้ำ ( -rแฟล็ก) ค้นหาเครื่องหมายความขัดแย้ง (สตริง '<<<<<<<')
-lหรือ--files-with-matchesธงสาเหตุที่ทำให้การส่งออก grep เพียงชื่อไฟล์ที่ถูกพบสตริง การสแกนจะหยุดลงหลังจากการจับคู่ครั้งแรกดังนั้นไฟล์ที่ตรงกันแต่ละไฟล์จะถูกส่งออกเพียงครั้งเดียว
จากนั้นชื่อไฟล์ที่ตรงกันจะถูกส่งไปยังxargsซึ่งเป็นยูทิลิตี้ที่แบ่งสตรีมอินพุตแบบ piped เป็นอาร์กิวเมนต์สำหรับgit checkout --oursหรือ--theirs
เพิ่มเติมได้ที่ลิงค์นี้ .
เนื่องจากมันจะไม่สะดวกมากที่จะต้องพิมพ์สิ่งนี้ทุกครั้งที่บรรทัดคำสั่งหากคุณพบว่าตัวเองใช้งานบ่อยมากการสร้างนามแฝงสำหรับเชลล์ที่คุณเลือกอาจไม่ใช่ความคิดที่ดี: Bashเป็นแบบปกติ .
วิธีนี้ควรใช้ได้กับ Git เวอร์ชัน2.4.x เป็นอย่างน้อย
git diff --name-only --diff-filter=Uผมคิดว่ามันเป็นไปได้ที่จะใช้
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]ด้วย เร็วกว่าการจับคู่ถ้าคุณมีโครงการขนาดใหญ่
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
คุณสามารถ-Xoursหรือ-Xtheirsด้วยgit mergeเช่นกัน ดังนั้น:
git reset --hard HEAD)git merge -Xoursหรือgit merge -Xtheirs)การปฏิเสธความรับผิด: แน่นอนว่าคุณสามารถเลือกได้เพียงตัวเลือกเดียว-Xoursหรือ-Xtheirsใช้กลยุทธ์อื่นที่คุณควรไปทีละไฟล์
ฉันไม่รู้ว่ามีวิธีใดcheckoutบ้าง แต่ฉันไม่คิดว่ามันมีประโยชน์อย่างยิ่ง: การเลือกกลยุทธ์ด้วยคำสั่งการชำระเงินมีประโยชน์หากคุณต้องการโซลูชันที่แตกต่างกันสำหรับไฟล์ที่แตกต่างกันมิฉะนั้นให้ใช้วิธีการผสานกลยุทธ์
--theirsหรือ - --oursตัวเลือกสำหรับ git v1.9.4 git merge -s recursive -Xtheirs BRANCHวิธีการที่จะเป็น
--theirsและจะไม่สามารถใช้ได้กับค่าคอมไพล์--ours 2.2.0คำตอบของฉันไม่แม่นยำหรือมีอยู่ใน git เวอร์ชันเก่า (คำตอบนี้ค่อนข้างเก่าในยุคไอที) -Xวิธีการที่เหมาะสมอยู่กับ ฉันอัปเดตตามนั้น
git checkout --[ours/theirs] .จะทำในสิ่งที่คุณต้องการตราบเท่าที่คุณอยู่ที่ต้นตอของความขัดแย้งทั้งหมด ของเรา / ของพวกเขามีผลกับไฟล์ที่ไม่ได้ผสานเท่านั้นดังนั้นคุณไม่ควรต้อง grep / find / etc ความขัดแย้งโดยเฉพาะ
error: path 'foo/bar/blah' does not have our versionแล้ว
git diff --name-only --diff-filter=U | xargs git checkout --theirs
ดูเหมือนจะทำงาน โปรดทราบว่าคุณต้อง cd'ed ไปยังไดเร็กทอรีรากของ git repo เพื่อให้บรรลุสิ่งนี้
ในกรณีที่คนอื่นต้องการเพียงแค่เขียนทับทุกอย่างจากสาขาหนึ่ง (พูดว่า master) ด้วยเนื้อหาของอีกสาขาหนึ่งมีวิธีที่ง่ายกว่า:
git merge origin/master --strategy=ours
ขอบคุณข้อมูลhttps://stackoverflow.com/a/1295232/560114
หรือในทางกลับกันโปรดดู"git merge -s ของเรา" เวอร์ชัน "พวกเขา" หรือไม่
function gitcheckoutall() {
git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}
ฉันได้เพิ่มฟังก์ชันนี้ในไฟล์. zshrc
ใช้วิธีนี้:
gitcheckoutall theirsหรือgitcheckoutall ours
git checkout --ours -- .ทำงานหรือไม่.หมายถึงไดเรกทอรีปัจจุบันเมื่อนำมาใช้จากรากไดเรกทอรีการทำงานจึงโดยทั่วไปหมายถึงไดเรกทอรีการทำงานทั้งหมด ไม่แน่ใจว่าจะใช้ได้กับ--oursแฟล็กหรือไม่และฉันไม่แน่ใจว่าจะจัดการกับความขัดแย้งของไฟล์ที่ถูกลบหรือเปลี่ยนชื่อได้อย่างไร