Gitで競合するファイルを一覧表示する最も簡単な方法は何ですか?


693

競合しているものの単純なリストが必要ですするファイルのです。

より簡単なものはありますか:

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 14

gitステータスは十分です
Amruth A '8/08/18

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 2013年

1
@CharlesBailey、私は何かが足りないのですか?何が問題になっていgit statusますか?
Pacerier、2015年

8
@Pacerier、それは単に厄介です。100万の競合しないマージと1つの競合するマージがある場合は、出力を簡潔にする必要があります。
2016年

8
@sAguinaga:単に実行git conflicts
Jimothy '13 / 07/13

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 conflictOPの場合のためにあるかもしれない
CCJ

37

私の質問に答えようとしています:

いいえ、最初から問題の方法より簡単な方法はないようです。

それを何度も入力した後、短いものを「git-conflicts」という名前の実行可能ファイルに貼り付け、gitからアクセスできるようにしました。 git conflictsにしました。必要なリストを取得。

更新:Richardが示唆するように、実行可能ファイルの代わりにgitエイリアスを設定できます

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

エイリアスよりも実行可能ファイルを使用する利点は、そのスクリプトをチームメンバーと(リポジトリのbin dir部分で)共有できることです。


1
私はその時点で同じことを感じました-地獄の人々がこれをどのように必要としないのかを考え、回避策がいかに些細なことかを見ました。ただし、私はgitを2年間使用しており、正直に言って、その「制限」にもう一度遭遇していません。結局のところ、それはそれほど一般的なユースケースではないのでしょうか?
歌手

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
アレクサンダーのコメントと並んで、これをオプションとして見ると便利です:)削除しないでください。
WoodKitty 2014年

3
または、現在の作業ディレクトリ内で実行するには、パスにドットを使用しますgrep -H -r "<<<<<<< HEAD" .
David Douglas

へへ、これも私のやり方です。cうまく追加すると、競合の数も増えます!1つの注意点は、フラグを使用する-Hrnと、行番号情報も提供されることです。
ShellFish

3
正規表現を使用している場合[<=>]{7}は、これの代わりに使用することをお勧めします。(-Egrepで機能するためにはフラグが必要な<{7}場合があります。)または、マージマーカーをぶら下げることについて心配していない場合、または競合をカウントする場合。(使用することもできgit grepます-r。フラグは必要ありません。)
celticminstrel

22

git status 「変更された」または「新しいファイル」の代わりに、競合のあるファイルの横に「両方が変更された」を表示します。


3
それは本当だ。ただし、この特定の質問は、競合するファイルの単純なリストに関するものでした。これはXYの問題である可能性があります(実際にその競合リストが必要だった理由を思い出せませんが、それを必要としなかったという事実から、当時異なるアプローチを踏襲しているわけではありません確認してください今..私はまた、このリストを必要とするJavaインポートの競合をautoresolvingためのスクリプトを書いていた、すなわち非対話型使用)..。
インガー

ああ、私はそれを理解していませんでした。「通常の」使用のための「通常の」リストが必要だと思いました。これが私があなた自身のコードとあなた自身の答えでびっくりした理由です...そして、私は「修正された」両方が私のためにうまくいくことに気付きました(そして私はあなたが私と同じように望んでいると思いました、なぜあなたはそうすべきではないのですか?;- P)賛成票をありがとう:)
Rafa

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

4
注:^ UAおよび^ UDも検索する必要がある場合があるため、次のパターンはより完全です: "^ U [UAD]"
mda

または^U、Uで始まるすべてのものを取得するため
Ascherer 2014年

7
これでは不十分です。競合するファイルは、次の組み合わせを持つことができます:DD, AU, UD, UA, DU, AA, UU
アンソニーSottile

1
@AnthonySottile:シナリオを説明できますか?私は自分のケースでうまくいったことを投稿しました。
mda 2014年

@mda 1つの例:アップストリームが変更され、私が削除した場合のステータスが競合するDU
Anthony Sottile '22

13

これは私にとってはうまくいきます:

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

または

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


2
競合には、このソリューションではカバーされない変更済みファイルと削除済みファイルが含まれる可能性があります。
MAR


3

コミットを試み、競合がある場合、gitは現在解決されていない競合のリストを表示しますが、単純なリストではありません。競合を修正するとリストが短くなるため、これは通常、インタラクティブに作業するときに必要です。


2
「競合を修正するとリストが短くなるため、インタラクティブに。」面白い。そのために私はいつもmergetoolを使ってきました。
歌手

3

これはGitに追加された可能性がありますが、まだ解決されていないファイルは、次のようにステータスメッセージ(git status)にリストされます。

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

これはマージされていないパスのセクションであることに注意してください。


1

あなたのgitルートディレクトリ$ {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

詳細情報を提供するチャールズベイリーの回答のわずかなバリエーション:

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

-2

他の回答で強調表示されているように、コマンドgit statusを使用して、マージされていないパスの下にリストされているファイルを探すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.