Apa cara paling sederhana untuk mendaftar file yang konflik di Git?


693

Saya hanya perlu daftar file yang konflik .

Apakah ada yang lebih sederhana daripada:

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

atau:

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

Saya kira saya bisa mengatur yang berguna aliasuntuk itu, namun bertanya-tanya bagaimana pro melakukannya. Saya akan menggunakannya untuk menulis loop shell misalnya untuk menyelesaikan konflik secara otomatis, dll. Mungkin mengganti loop itu dengan cara menghubungkannya mergetool.cmd?


2
git rebase --continueakan mencantumkan file dengan konflik (jika ada)
jacob

Status git sudah cukup
Amruth A

1
Dalam sesi penggabungan yang berkonflik `git merge --continue` akan menampilkan daftar file dengan konflik.
Jayan

git rebase --continuetidak mencantumkan konflik, hanya mengatakan kepada saya untuk memperbaikinya (git versi 2.21.0)
Gary

Jawaban:


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

131
Saya membuat alias untuk ini:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy

1
@CharlesBailey, Apakah saya melewatkan sesuatu? Ada apa dengan ini git status?
Pacerier

8
@ Peracerier, ini hanya berantakan. Jika Anda memiliki sejuta gabungan yang tidak konflik dan satu gabungan yang saling bertentangan, Anda ingin sesuatu yang ringkas untuk hasil.
xster

8
@sAguinaga: Cukup jalankangit conflicts
Jimothy

1
Ini terus menunjukkan file bahkan setelah menyelesaikan konflik. git diff --checkbekerja lebih baik.
user3812377

64

git diff --check

akan menampilkan daftar file yang mengandung penanda konflik termasuk nomor baris .

Sebagai contoh:

> 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

sumber: https://ardalis.com/detect-git-conflict-markers


1
Saya telah menemukan git diff --checkmengatakan kepada saya tentang masalah lain (kurang serius) juga, seperti tertinggal spasi, jadi git diff --check | grep -i conflictmungkin dalam rangka untuk kasus OP
CCJ

37

Mencoba menjawab pertanyaan saya:

Tidak, sepertinya tidak ada cara yang lebih sederhana daripada yang ada di pertanyaan, out of box.

Setelah mengetik itu terlalu sering, hanya menyisipkan yang lebih pendek ke dalam file yang dapat dieksekusi bernama 'git-konflik', dibuat dapat diakses oleh git, sekarang saya bisa saja: git conflictsuntuk mendapatkan daftar yang saya inginkan.

Pembaruan: seperti yang disarankan Richard, Anda dapat mengatur alias git, sebagai alternatif untuk dieksekusi

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

Keuntungan menggunakan executable di atas alias adalah Anda dapat berbagi skrip itu dengan anggota tim (di bagian bin dir repo).


1
Saya merasakan hal yang sama pada saat itu - memikirkan bagaimana orang-orang tidak membutuhkan ini, dan melihat betapa sepele penyelesaiannya. Namun, saya telah menggunakan git selama 2 tahun sekarang dan jujur ​​belum mengalami "batasan" itu sekali lagi. Jadi, mungkin itu bukan usecase yang umum?
inger

4
Ini cukup sederhana sehingga Anda dapat mengatur alias untuknya git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(! Artinya menjalankan perintah shell ini, bukan hanya perintah git).
Richard

1
Layak disebutkan bahwa Anda sebenarnya menginginkan 'tanda kutip tunggal' alih-alih "tanda kutip ganda." Kalau tidak, !akan ditafsirkan oleh shell Anda:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop

26

Ini cara yang sangat mudah:

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

9
Tidak. Indeks Git masih akan secara internal menandai file-file tertentu sebagai konflik bahkan setelah penanda tekstual dalam file dihapus.
Alexander Bird

7
Bersamaan dengan komentar Alexander, masih berguna untuk melihat ini sebagai opsi :) Tolong jangan hapus.
WoodenKitty

3
Atau untuk menjalankan dalam direktori kerja saat ini, gunakan titik untuk jalur -grep -H -r "<<<<<<< HEAD" .
David Douglas

Hehe, ini cara saya melakukannya juga. Menambahkan chasil konflik dengan baik juga! Satu catatan adalah bahwa saya akan menggunakan bendera -Hrnini juga akan memberikan informasi nomor baris.
ShellFish

3
Jika Anda menggunakan regex, saya sarankan [<=>]{7}daripada ini. (Mungkin perlu -Ebendera untuk itu bekerja di grep.) Atau, <{7}jika Anda tidak khawatir tentang menggantung penanda gabungan atau ingin menghitung konflik. (Anda juga dapat menggunakan git grep- maka Anda tidak perlu -rbendera.)
celticminstrel

22

git status menampilkan "keduanya dimodifikasi" di sebelah file yang memiliki konflik alih-alih "dimodifikasi" atau "file baru", dll


3
Itu benar. Namun pertanyaan khusus ini adalah tentang daftar sederhana dari file yang bertentangan .. ini mungkin masalah XY (saya tidak ingat mengapa saya benar-benar membutuhkan daftar konflik itu, tetapi kenyataan bahwa saya belum membutuhkannya karena mungkin menyarankan bahwa saya harus telah mengikuti pendekatan yang berbeda pada waktu itu. Tidak yakin sekarang .. Saya juga sedang menulis skrip untuk autoresolving konflik java-impor yang memerlukan daftar ini, yaitu penggunaan non-interaktif) ..
inger

Oh, aku tidak mengerti itu. Saya pikir Anda menginginkan daftar "normal" untuk penggunaan "normal". Itulah sebabnya saya panik dengan kode Anda sendiri dan jawaban-diri Anda ... lalu saya menyadari bahwa "keduanya dimodifikasi" berhasil bagi saya (dan saya berasumsi Anda hanya menginginkan hal yang sama seperti saya, mengapa tidak Anda?; - P) Terima kasih atas upvote :)
Rafa

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

4
Catatan: Anda mungkin perlu mencari ^ UA dan ^ UD juga, sehingga pola berikut ini lebih lengkap: "^ U [UAD]"
mda

atau hanya ^Uuntuk memulai semuanya dengan U
Ascherer

7
Ini tidak cukup. File yang bertentangan dapat memiliki kombinasi berikut:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile

1
@AnthonySottile: Bisakah Anda menjelaskan skenario? Saya memposting apa yang berhasil untuk kasus saya.
mda

@mda Satu contoh: Konflik di mana hulu dimodifikasi, saya hapus akan berstatusDU
Anthony Sottile

13

Ini bekerja untuk saya:

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

atau

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


2
Konflik dapat mencakup file yang dimodifikasi vs. dihapus yang tidak akan dicakup solusi ini.
Mär


3

Jika Anda mencoba untuk melakukan, dan jika ada konflik, maka git akan memberi Anda daftar konflik yang saat ini belum terselesaikan ... tetapi tidak sebagai daftar biasa. Ini biasanya yang Anda inginkan ketika bekerja secara interaktif karena daftar semakin pendek saat Anda memperbaiki konflik.


2
"Secara interaktif karena daftarnya semakin pendek ketika Anda memperbaiki konflik." Menarik. Saya selalu menggunakan mergetool untuk tujuan itu.
inger

3

Mungkin ini telah ditambahkan ke Git, tetapi file yang belum diselesaikan tercantum dalam pesan status (status git) seperti ini:

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

Perhatikan bahwa ini adalah bagian lintasan Unmerged.


1

Dengan asumsi Anda tahu di mana direktori root git Anda, $ {GIT_ROOT}, adalah, Anda dapat melakukannya,

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

0

Saya selalu hanya digunakan git status.

dapat menambahkan awkdi akhir untuk mendapatkan hanya nama file

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


0

2 sen saya di sini (bahkan ketika ada banyak respons keren / kerja)

Saya membuat alias ini di blog saya .gitconfig

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

yang akan menunjukkan kepada saya hanya nama-nama file dengan konflik ... bukan seluruh jalur mereka :)


0

Inilah yang saya gunakan untuk daftar file yang dimodifikasi yang cocok untuk substitusi baris perintah di bash

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

Untuk mengedit daftar gunakan $(cmd)substitusi.

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

Tidak berfungsi jika nama file memiliki spasi. Saya mencoba menggunakan seduntuk melarikan diri atau mengutip spasi dan daftar output tampak benar, tetapi $()substitusi masih tidak berperilaku seperti yang diinginkan.


0

Utilitas git wizard https://github.com/makelinux/git-wizard menghitung secara terpisah perubahan yang bentrok (tabrakan) dan file yang tidak terpecahkan secara terpisah. Konflik harus diselesaikan secara manual atau dengan mergetool. Menyelesaikan perubahan yang tidak dihapus dapat saya tambahkan dan lakukan biasanya dengan git rebase --continue.


-1

sedikit variasi dari jawaban Charles Bailey yang memberikan informasi lebih lanjut:

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

-2

Seperti yang disorot dalam jawaban lain, kita cukup menggunakan status perintah git dan kemudian mencari file yang terdaftar di bawah lintasan yang tidak diolah:

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.