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

자식 상태는 충분하다
Amruth A

1
충돌 병합 세션에서 git merge --continue는 충돌하는 목록 파일을 표시합니다.
Jayan

git rebase --continue충돌을 나열하지 않았고, 단지 그 문제를 해결하라고 지시했습니다 (git 버전 2.21.0)
Gary

답변:


1211
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
@Pacerier, 그것은 더 지저분합니다. 백만 개의 충돌하지 않는 병합과 하나의 충돌하는 병합이있는 경우 출력을 위해 간결한 것이 필요합니다.
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 --checkA는, 그래서 공백을 후행처럼, 너무 다른 (덜 심각한) 문제에 대해 말해 git diff --check | grep -i conflict영업 이익의 경우 순서에있을 수 있습니다
CCJ

37

내 질문에 대답하려고합니다.

아니요, 질문에 나와있는 것보다 더 간단한 방법은 없습니다.

그것을 너무 많이 입력 한 후, 짧은 파일을 'git-conflicts'라는 실행 파일에 붙여 넣고 git에 액세스 할 수있게되었으므로 이제는 git conflicts원하는 목록을 얻을 수 있습니다 .

업데이트 : Richard가 제안한 것처럼 실행 파일의 대안으로 git 별칭을 설정할 수 있습니다

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

별칭보다 실행 파일을 사용하면 팀 구성원과 해당 스크립트를 공유 할 수 있습니다 (리포지토리의 bin 디렉토리에 있음).


1
나는 그 시점에서 사람들이 어떻게 이것을 필요로하지 않는지를 생각하고 그것이 해결하기가 얼마나 사소한 지 알았습니다. 그러나, 나는 2 년 동안 git을 사용해 왔으며 솔직히 그 "한계"에 다시 한번 뛰어 들지 않았습니다. 어쩌면 그것은 일반적인 유스 케이스가 아닐까요?
inger

4
별명을 설정할 수있을 정도로 간단합니다 git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(!는 git 명령이 아니라이 쉘 명령을 실행 함을 의미합니다).
Richard

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
Alexander의 의견과 함께 이것을 옵션으로 보는 것이 여전히 유용합니다. :) 삭제하지 마십시오.
WoodenKitty

3
또는 현재 작업 디렉토리 내에서 실행하려면 경로에 점을 사용하십시오.grep -H -r "<<<<<<< HEAD" .
David Douglas

Hehe, 이것도 저의 방식입니다. c멋지게 추가하면 충돌 횟수도 증가합니다! 한 가지 참고 사항은 플래그를 사용하여 -Hrn행 번호 정보를 제공 한다는 것 입니다.
ShellFish

3
정규식을 사용하는 경우 [<=>]{7}이것을 대신 제안 합니다. -Egrep에서 작동 하려면 플래그 가 필요할 수 있습니다. 또는 <{7}병합 마커를 매달려 걱정하지 않거나 충돌을 계산하려는 경우. (또한 사용할 수 있습니다 git grep- -r깃발이 필요하지 않습니다 .)
celticminstrel

22

git status "수정 됨"또는 "새 파일"대신 충돌이있는 파일 옆에 "수정 됨"을 표시합니다.


3
사실입니다. 그러나이 특별한 질문은 충돌 된 파일의 일반 목록에 관한 것이 었습니다 .. 이것은 XY 문제 일 수 있습니다 (실제로 충돌 목록이 필요한 이유는 기억 나지 않지만 이후에 필요하지 않은 사실은 내가해야한다고 제안 할 수 있습니다 그때도 다른 접근 방식을 따랐습니다. 지금 확실하지 않습니다. 또한이 목록을 필요로하는 java-import 충돌을 자동으로 해결하는 스크립트를 작성하고있었습니다 (예 : 비 대화식 사용).
inger

아, 이해 못 했어 "정상"사용을위한 "정상"목록을 원한다고 생각했습니다. 그렇기 때문에 나는 당신 자신의 코드와 자기 답으로 놀랐습니다 ... 그런 다음에 "수정 된"것이 나를 위해 일한 것을 깨달았습니다. P) upvote 주셔서 감사합니다 :)
Rafa

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

4
참고 : ^ UA 및 ^ UD도 검색해야 할 수 있으므로 다음 패턴이 더 완벽합니다. "^ U [UAD]"
mda

또는 ^UU로 시작하는 모든 것을 얻기 위해
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
충돌에는이 솔루션에서 다루지 않는 수정 된 파일과 삭제 된 파일이 포함될 수 있습니다.
Mär


3

커밋을 시도하고 충돌이있는 경우 git은 현재 해결되지 않은 충돌 목록을 제공하지만 일반 목록은 아닙니다. 충돌을 해결하면 목록이 더 짧아지기 때문에 일반적으로 대화식으로 작업 할 때 원하는 것입니다.


2
"충돌을 해결하면 목록이 짧아지기 때문에 대화식으로" 흥미 롭군 나는 항상 그 목적으로 mergetool을 사용했습니다.
inger

3

아마도 이것은 Git에 추가되었지만 아직 해결되지 않은 파일은 다음과 같이 상태 메시지 (git status)에 나열됩니다.

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

이것은 병합되지 않은 경로 섹션입니다.


1

git root 디렉토리 $ {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 rebase --continue를 사용하여 추가하고 커밋 할 수 있습니다.


-1

자세한 정보를 제공하는 Charles Bailey의 답변이 약간 변형되었습니다.

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

-2

다른 답변에서 강조 표시된 것처럼 git status 명령을 사용 하고 병합되지 않은 경로 아래에 나열된 파일을 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.