Cách đơn giản nhất để liệt kê các tệp bị xung đột trong Git là gì?


693

Tôi chỉ cần một danh sách đơn giản các tập tin xung đột .

Có điều gì đơn giản hơn:

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

hoặc là:

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

Tôi đoán rằng tôi có thể thiết lập một tiện dụng aliascho việc đó, tuy nhiên đã tự hỏi làm thế nào thuận làm điều đó. Tôi sẽ sử dụng nó để viết các vòng lặp shell, ví dụ như để tự động giải quyết xung đột, v.v. Có thể thay thế vòng lặp đó bằng cách cắm vào mergetool.cmd?


2
git rebase --continuesẽ liệt kê các tệp có xung đột (nếu có)
jacob

trạng thái git là đủ
Amruth A

1
Trong phiên hợp nhất bị xung đột `git merge --continue` sẽ hiển thị các tệp danh sách có xung đột.
Jayan

git rebase --continuekhông liệt kê các xung đột, chỉ bảo tôi sửa chúng (phiên bản git 2.21.0)
Gary

Câu trả lời:


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

131
Tôi đã tạo một bí danh cho việc này:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy

1
@CharlesBailey, tôi có thiếu thứ gì không? Có gì sai với git status?
Pacerier

8
@Pacerier, nó chỉ lộn xộn hơn. Nếu bạn có một triệu kết hợp không xung đột và một hợp nhất xung đột, bạn sẽ muốn một cái gì đó cô đọng cho đầu ra.
xster

8
@sAguinaga: Đơn giản là chạygit conflicts
Jimothy

1
Điều này tiếp tục hiển thị các tập tin ngay cả sau khi giải quyết xung đột. git diff --checklàm việc tốt hơn
dùng3812377

64

git diff --check

sẽ hiển thị danh sách các tệp chứa các dấu xung đột bao gồm số dòng .

Ví dụ:

> 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

nguồn: https://ardalis.com/detect-git-conflict-markers


1
Tôi cũng thấy git diff --checktôi nói về các vấn đề khác (ít nghiêm trọng hơn), như khoảng trắng ở cuối, do đó, git diff --check | grep -i conflictcó thể là để phù hợp với trường hợp của OP
CCJ

37

Đang cố gắng trả lời câu hỏi của tôi:

Không, dường như không có cách nào đơn giản hơn câu hỏi trong câu hỏi.

Sau khi gõ nó quá nhiều lần, chỉ cần dán tệp ngắn hơn vào một tệp thực thi có tên 'git-Xung đột', có thể truy cập được để git, bây giờ tôi có thể chỉ cần: git conflicts để có được danh sách tôi muốn.

Cập nhật: như Richard gợi ý, bạn có thể thiết lập bí danh git, thay thế cho thực thi

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

Một lợi thế của việc sử dụng tệp thực thi trên bí danh là bạn có thể chia sẻ tập lệnh đó với các thành viên trong nhóm (trong phần bin dir của repo).


1
Tôi cũng cảm thấy như vậy vào thời điểm đó - nghĩ rằng mọi người không cần điều này như thế nào, và thấy nó thật tầm thường khi giải quyết. Tuy nhiên, tôi đã sử dụng git được 2 năm rồi và thực sự không gặp phải "giới hạn" đó nữa. Vì vậy, có lẽ đó không phải là nhiều usecase phổ biến?
inger

4
Điều này đủ đơn giản để bạn có thể thiết lập bí danh cho nó git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(! Có nghĩa là chạy lệnh shell này, thay vì chỉ một lệnh git).
Richard

1
Đáng nói là bạn thực sự muốn 'trích dẫn đơn' thay vì "trích dẫn kép". !git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
Mặt

26

Đây là một cách chứng minh ngu ngốc:

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

9
Không. Chỉ mục của Git vẫn sẽ đánh dấu nội bộ một số tệp nhất định là xung đột ngay cả sau khi các dấu văn bản trong các tệp bị xóa.
Alexander Bird

7
Bên cạnh nhận xét của Alexandre, vẫn hữu ích khi xem đây là một tùy chọn :) Vui lòng không xóa.
WoodKitty

3
Hoặc để chạy trong thư mục làm việc hiện tại, hãy sử dụng dấu chấm cho đường dẫn -grep -H -r "<<<<<<< HEAD" .
David Douglas

Hehe, đây là cách làm của tôi quá. Thêm một ckết quả độc đáo số lượng các xung đột quá! Một lưu ý là tôi sử dụng cờ -Hrnnày cũng sẽ cung cấp thông tin số dòng.
ShellFish

3
Nếu bạn đang sử dụng regex, tôi sẽ đề xuất [<=>]{7}thay vì điều này. (Có thể cần -Ecờ để điều đó hoạt động trong grep.) Hoặc, <{7}nếu bạn không lo lắng về việc đánh dấu hợp nhất hoặc muốn đếm các xung đột. (Bạn cũng có thể sử dụng git grep- sau đó bạn không cần -rcờ.)
celticminstrel

22

git status hiển thị "cả sửa đổi" bên cạnh các tệp có xung đột thay vì "sửa đổi" hoặc "tệp mới", v.v.


3
Đúng. Tuy nhiên câu hỏi đặc biệt này là về một danh sách đơn giản các tệp bị xung đột .. đây có thể là một vấn đề XY (tôi không thể nhớ tại sao tôi thực sự cần danh sách xung đột đó, nhưng thực tế là tôi không cần nó vì tôi có thể đề nghị rằng tôi nên đã theo một cách tiếp cận khác trước đó. Không chắc bây giờ .. Tôi cũng đang viết các kịch bản để tự động giải quyết các xung đột nhập java cần danh sách này, tức là sử dụng không tương tác) ..
inger

Ồ, tôi đã không hiểu điều đó. Tôi nghĩ bạn muốn có một danh sách "bình thường" để sử dụng "bình thường". Đó là lý do tại sao tôi bối rối với mã của riêng bạn và tự trả lời của bạn ... sau đó tôi nhận ra điều "cả hai sửa đổi" làm việc cho tôi (và tôi cho rằng bạn chỉ muốn giống như tôi, tại sao bạn không nên? P) Cảm ơn vì upvote mặc dù :)
Rafa

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

4
Lưu ý: Bạn có thể cần tìm kiếm ^ UA và ^ UD, vì vậy mẫu sau hoàn chỉnh hơn: "^ U [UAD]"
mda

hoặc chỉ ^Uđể có được mọi thứ bắt đầu với U
Ascherer

7
Điều này là không đủ. Các tệp xung đột có thể có các kết hợp sau:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile

1
@AnthonySottile: Bạn có thể giải thích các tình huống không? Tôi đã đăng những gì làm việc cho trường hợp của tôi.
mda

@mda Một ví dụ: Xung đột khi sửa đổi ngược dòng, tôi đã xóa sẽ có trạng tháiDU
Anthony Sottile

13

Điều này làm việc cho tôi:

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

hoặc là

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


2
Xung đột có thể bao gồm các tệp được sửa đổi so với các tệp đã xóa mà giải pháp này sẽ không bao gồm.
Mär

11

bạn có thể nhấn git ls-files -uvào dòng lệnh của mình, nó liệt kê các tệp có xung đột


3

Nếu bạn cố gắng cam kết và nếu có xung đột, thì git sẽ cung cấp cho bạn danh sách các xung đột hiện chưa được giải quyết ... nhưng không phải là một danh sách đơn giản. Đây thường là những gì bạn muốn khi làm việc tương tác vì danh sách sẽ ngắn hơn khi bạn khắc phục các xung đột.


2
"tương tác vì danh sách sẽ ngắn hơn khi bạn sửa các xung đột." Hấp dẫn. Tôi đã luôn sử dụng mergetool cho mục đích đó.
inger

3

Có thể điều này đã được thêm vào Git, nhưng các tệp chưa được giải quyết được liệt kê trong thông báo trạng thái (trạng thái git) như thế này:

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

Lưu ý rằng đây là phần đường dẫn không trộn.


1

Giả sử bạn biết thư mục gốc git của bạn, $ {GIT_ROOT}, bạn có thể làm gì,

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

0

Tôi đã luôn luôn sử dụng git status.

có thể thêm awkvào cuối để chỉ lấy tên tệp

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


0

2 xu của tôi ở đây (ngay cả khi có nhiều phản hồi hay / hiệu quả)

Tôi đã tạo bí danh này trong .gitconfig

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

sẽ hiển thị cho tôi tên của các tệp có xung đột ... không phải toàn bộ đường dẫn của chúng :)


0

Đây là những gì tôi sử dụng cho một danh sách các tệp sửa đổi phù hợp để thay thế dòng lệnh trong bash

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

Để chỉnh sửa danh sách sử dụng $(cmd)thay thế.

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

Không hoạt động nếu tên tệp có khoảng trắng. Tôi đã cố gắng sử dụng sedđể thoát hoặc trích dẫn các khoảng trắng và danh sách đầu ra có vẻ đúng, nhưng sự $()thay thế vẫn không hoạt động như mong muốn.


0

Trình hướng dẫn git tiện ích https://github.com/makelinux/git-wizard đếm riêng các thay đổi xung đột chưa được giải quyết (va chạm) và các tệp không được trộn. Xung đột phải được giải quyết bằng tay hoặc với mergetool. Tôi đã thêm và giải quyết các thay đổi chưa được xử lý có thể được thêm vào và cam kết thường với git rebase --continue.


-1

sự thay đổi nhỏ trong câu trả lời của Charles Bailey cung cấp thêm thông tin:

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

-2

Như được tô sáng trong (các) câu trả lời khác, chúng ta chỉ cần sử dụng trạng thái lệnh git và sau đó tìm các tệp được liệt kê trong đường dẫn Không được trộn:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.