มีวิธีแก้ไขข้อขัดแย้งสำหรับไฟล์ทั้งหมดโดยใช้การชำระเงิน--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
แฟล็กหรือไม่และฉันไม่แน่ใจว่าจะจัดการกับความขัดแย้งของไฟล์ที่ถูกลบหรือเปลี่ยนชื่อได้อย่างไร