Git แก้ไขข้อขัดแย้งโดยใช้ --ours / - สำหรับไฟล์ทั้งหมด


113

มีวิธีแก้ไขข้อขัดแย้งสำหรับไฟล์ทั้งหมดโดยใช้การชำระเงิน--oursและ--theirsหรือไม่ ฉันรู้ว่าคุณสามารถทำได้สำหรับไฟล์แต่ละไฟล์ แต่ไม่สามารถหาวิธีทำได้ทั้งหมด


7
ไม่git checkout --ours -- .ทำงานหรือไม่ .หมายถึงไดเรกทอรีปัจจุบันเมื่อนำมาใช้จากรากไดเรกทอรีการทำงานจึงโดยทั่วไปหมายถึงไดเรกทอรีการทำงานทั้งหมด ไม่แน่ใจว่าจะใช้ได้กับ--oursแฟล็กหรือไม่และฉันไม่แน่ใจว่าจะจัดการกับความขัดแย้งของไฟล์ที่ถูกลบหรือเปลี่ยนชื่อได้อย่างไร

@ คัพเค้กเคยใช้สำเร็จ บางทีนั่นน่าจะเป็นคำตอบ?
Pedro Gimeno

คำตอบ:


90

เพียง 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 เป็นอย่างน้อย


15
แทนที่จะ grepping git diff --name-only --diff-filter=Uผมคิดว่ามันเป็นไปได้ที่จะใช้
ไทย

10
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]ด้วย เร็วกว่าการจับคู่ถ้าคุณมีโครงการขนาดใหญ่
joshbodily

1
@joshbodily ดี ฉันไม่มีโปรเจ็กต์ขนาดใหญ่มากจนฉันสังเกตเห็นความแตกต่าง แต่ฉันเห็นว่ามันจะเร็วขึ้นมากแค่ไหนโดยเฉพาะอย่างยิ่งถ้าไฟล์ไม่กี่ไฟล์มีการเปลี่ยนแปลงเมื่อเทียบกับจำนวนทั้งหมดในไดเร็กทอรี ---- ซึ่งควรเป็นกรณีปกติ กระทำ
Dmitri

1
โปรดทราบว่าสิ่งนี้ใช้ไม่ได้สำหรับการเปลี่ยนชื่อ / เปลี่ยนชื่อความขัดแย้งเช่นCONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard

1
อีกทางเลือกหนึ่ง: git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax

52

คุณสามารถ-Xoursหรือ-Xtheirsด้วยgit mergeเช่นกัน ดังนั้น:

  1. ยกเลิกการผสานปัจจุบัน (เช่นกับgit reset --hard HEAD)
  2. ผสานโดยใช้กลยุทธ์ที่คุณต้องการ ( git merge -Xoursหรือgit merge -Xtheirs)

การปฏิเสธความรับผิด: แน่นอนว่าคุณสามารถเลือกได้เพียงตัวเลือกเดียว-Xoursหรือ-Xtheirsใช้กลยุทธ์อื่นที่คุณควรไปทีละไฟล์

ฉันไม่รู้ว่ามีวิธีใดcheckoutบ้าง แต่ฉันไม่คิดว่ามันมีประโยชน์อย่างยิ่ง: การเลือกกลยุทธ์ด้วยคำสั่งการชำระเงินมีประโยชน์หากคุณต้องการโซลูชันที่แตกต่างกันสำหรับไฟล์ที่แตกต่างกันมิฉะนั้นให้ใช้วิธีการผสานกลยุทธ์


ขอบคุณไม่รู้ว่าพวกเขามี '- ของคุณ' และ '- ของพวกเขา' สำหรับการรวม ดูเหมือนว่าสำหรับการผสานพวกเขาไม่ได้เป็นส่วนหนึ่งของกลยุทธ์ '-s' แต่เป็นส่วนหนึ่งของตัวเลือกการเรียกซ้ำ '-X' เวอร์ชัน '-s' ของเราจริง ๆ แล้วเพียงแค่แทนที่ไฟล์ทั้งหมดโดยไม่รวมไฟล์และไม่มีอยู่
exe163

ไม่มี--theirsหรือ - --oursตัวเลือกสำหรับ git v1.9.4 git merge -s recursive -Xtheirs BRANCHวิธีการที่จะเป็น
fbmd

--theirsและจะไม่สามารถใช้ได้กับค่าคอมไพล์--ours 2.2.0คำตอบของฉันไม่แม่นยำหรือมีอยู่ใน git เวอร์ชันเก่า (คำตอบนี้ค่อนข้างเก่าในยุคไอที) -Xวิธีการที่เหมาะสมอยู่กับ ฉันอัปเดตตามนั้น
ThanksForAllTheFish

ตั้งแต่เวอร์ชัน 2.4.0 - ของเราและ - ของพวกเขายังคงมีอยู่มากgit-scm.com/docs/git-checkout
Dmitri

ลองแล้วและได้รับ "การผสานอัตโนมัติล้มเหลวแก้ไขข้อขัดแย้ง" คำสั่งนี้ใช้ไม่ได้ผลตามที่ตั้งใจไว้อย่างชัดเจนและฉันขอแนะนำให้หลีกเลี่ยง - บั๊กเกินไป
อดัม

38

git checkout --[ours/theirs] .จะทำในสิ่งที่คุณต้องการตราบเท่าที่คุณอยู่ที่ต้นตอของความขัดแย้งทั้งหมด ของเรา / ของพวกเขามีผลกับไฟล์ที่ไม่ได้ผสานเท่านั้นดังนั้นคุณไม่ควรต้อง grep / find / etc ความขัดแย้งโดยเฉพาะ


5
สำหรับฉันสิ่งนี้ดูเหมือนจะไม่ถูกสร้างขึ้นใหม่ในไดเรกทอรีย่อย
Daniel Baughman

5
ฉันเข้าใจerror: path 'foo/bar/blah' does not have our versionแล้ว
Robin Green

ฉันใช้ git เวอร์ชัน 2.16.2.windows.1 และทำงานได้ดีสำหรับฉัน ขอบคุณ!
Pankwood

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

ดูเหมือนจะทำงาน โปรดทราบว่าคุณต้อง cd'ed ไปยังไดเร็กทอรีรากของ git repo เพื่อให้บรรลุสิ่งนี้


3
ฉันคิดว่านี่เป็นคำตอบที่ดีกว่าที่ได้รับการโหวตสูงสุดเพราะ (1) ใช้กับไฟล์ทั้งหมดไม่ใช่แค่ไดเร็กทอรีการทำงาน และ (2) จะไม่มีความเปราะใด ๆ ในการดึงเครื่องหมายความขัดแย้ง คำสั่ง 'git diff' ที่นี่จะแสดงรายการพา ธ ที่ไม่ได้ผสานทั้งหมดซึ่งเป็นสิ่งที่เราต้องการชำระเงิน
bchurchill

ดี! ฉันกังวลเสมอเกี่ยวกับความน่าเชื่อถือของ grep เครื่องหมายความขัดแย้ง
00-BBB

7

ในกรณีที่คนอื่นต้องการเพียงแค่เขียนทับทุกอย่างจากสาขาหนึ่ง (พูดว่า master) ด้วยเนื้อหาของอีกสาขาหนึ่งมีวิธีที่ง่ายกว่า:

git merge origin/master --strategy=ours

ขอบคุณข้อมูลhttps://stackoverflow.com/a/1295232/560114

หรือในทางกลับกันโปรดดู"git merge -s ของเรา" เวอร์ชัน "พวกเขา" หรือไม่


2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

ฉันได้เพิ่มฟังก์ชันนี้ในไฟล์. zshrc

ใช้วิธีนี้: gitcheckoutall theirsหรือgitcheckoutall ours

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