วิธีที่ง่ายที่สุดในการแสดงรายการไฟล์ที่ขัดแย้งใน Git คืออะไร


692

ฉันต้องการรายการไฟล์ที่ขัดแย้งกันแบบธรรมดา

มีอะไรที่ง่ายกว่า:

git ls-files -u  | cut -f 2 | sort -u

หรือ:

git ls-files -u  | awk '{print $4}' | sort | uniq

ฉันเดาว่าฉันสามารถตั้งค่าให้สะดวกaliasสำหรับสิ่งนั้นได้ แต่ก็สงสัยว่ามือโปรทำได้อย่างไร ฉันต้องการใช้มันในการเขียนเปลือกลูปเช่นความขัดแย้งอัตโนมัติแก้ไข ฯลฯ อาจจะเปลี่ยนห่วงว่าด้วยการเสียบเข้าmergetool.cmd?


2
git rebase --continueจะแสดงรายการไฟล์ที่มีความขัดแย้ง (ถ้ามี)
jacob

สถานะ git เพียงพอแล้ว
Amruth A

1
ในเซสชั่นการผสานที่ขัดแย้งกัน 'git merge --continue' จะแสดงไฟล์รายการที่มีความขัดแย้ง
Jayan

git rebase --continueไม่ได้แสดงรายการข้อขัดแย้งเพียงบอกให้ฉันแก้ไข (รุ่น git 2.21.0)
Gary

คำตอบ:


1212
git diff --name-only --diff-filter=U

131
ฉันสร้างนามแฝงสำหรับสิ่งนี้:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy

1
@CharlesBailey, ฉันทำอะไรหายหรือเปล่า มีอะไรผิดปกติกับgit status?
Pacerier

8
@Pierier มันเป็นเพียง messier หากคุณมีการรวมที่ไม่มีข้อโต้แย้งนับล้านและการรวมที่ขัดแย้งกันอย่างใดอย่างหนึ่งคุณต้องมีสิ่งที่รวบรัดสำหรับผลผลิต
xster

8
@sAguinaga: เพียงแค่วิ่งgit conflicts
Jimothy

1
การดำเนินการนี้จะยังคงแสดงไฟล์แม้หลังจากแก้ไขข้อขัดแย้งแล้ว git diff --checkทำงานได้ดีขึ้น
user3812377

64

git diff --check

จะแสดงรายการของไฟล์ที่มีเครื่องหมายความขัดแย้งรวมถึงหมายเลขบรรทัด

ตัวอย่างเช่น:

> git diff --check
index-localhost.html:85: leftover conflict marker
index-localhost.html:87: leftover conflict marker
index-localhost.html:89: leftover conflict marker
index.html:85: leftover conflict marker
index.html:87: leftover conflict marker
index.html:89: leftover conflict marker

แหล่งที่มา: https://ardalis.com/detect-git-conflict-markers


1
ฉันได้พบgit diff --checkบอกฉันเกี่ยวกับปัญหาอื่น ๆ (ร้ายแรงน้อยกว่า) เช่นช่องว่างต่อท้ายดังนั้นgit diff --check | grep -i conflictอาจเป็นไปได้สำหรับกรณีของ OP
CCJ

37

พยายามตอบคำถามของฉัน:

ไม่ดูเหมือนจะไม่มีวิธีที่ง่ายกว่าวิธีอื่นในคำถามเลย

หลังจากพิมพ์สิ่งนั้นในหลาย ๆ ครั้งให้วางไฟล์ที่สั้นกว่าลงในไฟล์ปฏิบัติการที่ชื่อ 'git-ขัดแย้ง' ทำให้เข้าถึง git ได้ตอนนี้ฉันสามารถ: git conflictsรับรายการที่ฉันต้องการ

อัปเดต: ตามที่ริชาร์ดแนะนำคุณสามารถตั้งค่านามแฝงคอมไพล์แทนการปฏิบัติการได้

git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'

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


1
ฉันรู้สึกเหมือนกันในตอนนี้ - คิดว่าคนนรกไม่ต้องการสิ่งนี้และเห็นว่ามันไม่สำคัญสำหรับการแก้ปัญหา อย่างไรก็ตามฉันใช้คอมไพล์มา 2 ปีแล้วและโดยสุจริตไม่ได้พบกับ "ข้อ จำกัด " อีกครั้ง ดังนั้นบางทีนั่นอาจไม่ใช่การใช้งานทั่วไปที่มากนัก?
inger

4
นี่ง่ายพอที่คุณสามารถตั้งค่านามแฝงได้git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(!! หมายถึงเรียกใช้คำสั่งเชลล์นี้แทนที่จะเป็นเพียงคำสั่ง git)
ริชาร์ด

1
ควรพูดถึงว่าคุณต้องการ 'คำพูดเดียว' แทน "คำพูดสองคำ" มิฉะนั้น!เชลล์ของคุณจะตีความได้:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop

26

นี่เป็นวิธีที่พิสูจน์คนโง่:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir

9
ไม่ได้ดัชนีของ Git จะยังคงทำเครื่องหมายไฟล์บางไฟล์ว่ามีความขัดแย้งแม้ว่าหลังจากที่เครื่องหมายข้อความในไฟล์จะถูกลบออก
Alexander Bird

7
นอกจากความคิดเห็นของอเล็กซานเดอร์มันยังมีประโยชน์ที่จะเห็นสิ่งนี้เป็นตัวเลือก :) โปรดอย่าลบ
WoodenKitty

3
หรือเพื่อทำงานในผบที่ทำงานปัจจุบันใช้จุดสำหรับเส้นทาง -grep -H -r "<<<<<<< HEAD" .
David Douglas

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

3
หากคุณกำลังใช้ regex ฉันขอแนะนำให้[<=>]{7}ใช้สิ่งนี้แทน (อาจต้อง-Eตั้งค่าสถานะเพื่อให้มันทำงานใน grep) หรือ<{7}หากคุณไม่กังวลเกี่ยวกับการรวมเครื่องหมายที่ห้อยต่องแต่งหรือต้องการนับความขัดแย้ง (คุณสามารถใช้git grep- แล้วคุณไม่จำเป็นต้องใช้-rธง)
celticminstrel

22

git status แสดง "ทั้งแก้ไขแล้ว" ถัดจากไฟล์ที่มีข้อขัดแย้งแทน "แก้ไข" หรือ "ไฟล์ใหม่" ฯลฯ


3
นั่นเป็นเรื่องจริง อย่างไรก็ตามคำถามเฉพาะนี้เกี่ยวกับรายการธรรมดาของไฟล์ที่ขัดแย้งกัน .. นี่อาจเป็นปัญหา XY (ฉันจำไม่ได้ว่าทำไมฉันถึงต้องการรายการความขัดแย้งนั้น แต่ความจริงที่ฉันไม่ได้ต้องการเพราะอาจแนะนำว่าฉันควร ได้ทำตามวิธีการที่แตกต่างกันไปแล้วไม่แน่ใจตอนนี้ .. ฉันยังเขียนสคริปต์สำหรับการแก้ไขข้อขัดแย้งของการนำเข้า java แบบอัตโนมัติซึ่งต้องการรายการนี้เช่นการใช้แบบไม่โต้ตอบ) ..
inger

โอ้ฉันไม่เข้าใจ ฉันคิดว่าคุณต้องการรายการ "ปกติ" สำหรับการใช้ "ปกติ" ซึ่งเป็นสาเหตุที่ฉัน freaked ด้วยรหัสของคุณเองและคำตอบของคุณเอง ... จากนั้นฉันได้ตระหนักถึงสิ่งที่ "ทั้งแก้ไข" ทำงานให้ฉัน (และฉันคิดว่าคุณแค่ต้องการเหมือนกันกับฉันทำไมคุณไม่ควร? - P) ขอบคุณสำหรับการโหวต :) :)
Rafa

17
git status --short | grep "^UU "

4
หมายเหตุ: คุณอาจต้องค้นหา ^ UA และ ^ UD ด้วยดังนั้นรูปแบบต่อไปนี้จะสมบูรณ์มากขึ้น: "^ U [UAD]"
mda

หรือ^Uเพื่อให้ทุกอย่างเริ่มต้นด้วย U
Ascherer

7
มันไม่เพียงพอ ไฟล์ที่ขัดแย้งกันอาจมีการรวมกันดังต่อไปนี้:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile

1
@AnthonySottile: คุณช่วยอธิบายสถานการณ์ได้ไหม ฉันโพสต์สิ่งที่ได้ผลกับกรณีของฉัน
mda

@mda ตัวอย่างหนึ่ง: ความขัดแย้งที่อัปสตรีมที่แก้ไขฉันจะลบสถานะDU
Anthony Sottile

13

สิ่งนี้ใช้ได้กับฉัน:

git grep '<<<<<<< HEAD'

หรือ

git grep '<<<<<<< HEAD' | less -N


2
ความขัดแย้งอาจรวมถึงไฟล์ที่ถูกแก้ไขหรือถูกลบซึ่งโซลูชันนี้จะไม่ครอบคลุม
มี.ค.

11

คุณอาจกดgit ls-files -uบรรทัดคำสั่งของคุณมันจะแสดงรายการไฟล์ที่มีข้อขัดแย้ง


3

หากคุณพยายามที่จะกระทำและหากมีข้อขัดแย้ง git จะแสดงรายการข้อขัดแย้งที่ยังไม่ได้แก้ไขในปัจจุบัน ... แต่ไม่ใช่รายการธรรมดา นี่คือสิ่งที่คุณต้องการเมื่อทำงานแบบโต้ตอบเนื่องจากรายการจะสั้นลงเมื่อคุณแก้ไขข้อขัดแย้ง


2
"โต้ตอบเนื่องจากรายการจะสั้นลงเมื่อคุณแก้ไขข้อขัดแย้ง" น่าสนใจ ฉันใช้ mergetool เพื่อจุดประสงค์นั้นเสมอ
inger

3

อาจมีการเพิ่มไว้ใน Git แต่ไฟล์ที่ยังไม่ได้รับการแก้ไขจะแสดงรายการในข้อความสถานะ (สถานะ git) ดังนี้:

#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      syssw/target/libs/makefile
#

โปรดทราบว่านี่คือส่วนเส้นทางที่ไม่ได้ถูกรวม


1

สมมติว่าคุณทราบว่าไดเรกทอรีรากของคอมไพล์ของคุณคือ $ {GIT_ROOT} อยู่คุณสามารถทำได้

 cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'

0

ฉันใช้git statusเสมอ

สามารถเพิ่มawkตอนท้ายเพื่อรับเฉพาะชื่อไฟล์

git status -s | grep ^U | awk '{print $2}'


0

2 เซ็นต์ของฉันที่นี่ (แม้ว่าจะมีการตอบสนองที่ยอดเยี่ยม / ทำงานมาก)

ฉันสร้างนามแฝงนี้ในของฉัน .gitconfig

[alias]
 ...
 conflicts = !git diff --name-only --diff-filter=U | grep -oE '[^/ ]+$'

ซึ่งจะแสดงให้ฉันเห็นเพียงแค่ชื่อไฟล์ที่มีข้อขัดแย้ง ... ไม่ใช่เส้นทางทั้งหมดของพวกเขา :)


0

นี่คือสิ่งที่ฉันใช้กับรายการไฟล์ที่แก้ไขซึ่งเหมาะสมสำหรับการทดแทนบรรทัดคำสั่งใน bash

git diff --numstat -b -w | grep ^[1-9] | cut -f 3

เพื่อแก้ไขรายการใช้$(cmd)ทดแทน

vi $(git diff --numstat -b -w | grep ^[1-9] | cut -f 3)

ไม่ทำงานหากชื่อไฟล์มีช่องว่าง ฉันพยายามใช้sedเพื่อหลบหนีหรืออ้างอิงช่องว่างและรายการผลลัพธ์ถูกต้อง แต่การ$()ทดแทนยังไม่ทำงานตามที่ต้องการ


0

ตัวช่วยสร้าง git ของยูทิลิตี้https://github.com/makelinux/git-wizardจะนับการเปลี่ยนแปลงที่ขัดแย้งกันที่ยังไม่ได้แก้ไข (การชนกัน) และไฟล์ที่ไม่ได้ถูกแยก ความขัดแย้งต้องแก้ไขด้วยตนเองหรือด้วย mergetool การแก้ไขที่ยังไม่ได้แก้ไขที่มีการแก้ไขฉันสามารถเพิ่มและกระทำได้ตามปกติด้วยการรีบูท git - ยุติ


-1

ความแตกต่างเล็กน้อยของคำตอบของ Charles Bailey ที่ให้ข้อมูลเพิ่มเติม:

git diff --name-only --diff-filter=U | xargs git status

-2

ดังที่ไฮไลต์ไว้ในคำตอบอื่น ๆ เราสามารถใช้สถานะคำสั่งgitจากนั้นค้นหาไฟล์ที่อยู่ในพา ธ Unmerged:

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