Jaki jest najprostszy sposób na listę skonfliktowanych plików w Git?

Potrzebuję tylko zwykłej listy skonfliktowanych plików.

Czy jest coś prostszego niż:

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

Lub:

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

Myślę, że mógłbym ustawić poręczny alias do tego, jednak zastanawiałem się, jak profesjonaliści to robią. Użyłbym go do pisania pętli powłoki np. do automatycznego rozwiązywania konfliktów itp. Może zastąpić tę pętlę przez podłączenie do mergetool.cmd?

Author: Paulo Mattos, 2010-06-17

18 answers

git diff --name-only --diff-filter=U
 1309
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-03 23:43:59

git diff --check

Wyświetli listę plików zawierających znaczniki konfliktu wraz z numerami linii .

Na przykład:

> 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

Źródło: https://ardalis.com/detect-git-conflict-markers

 93
Author: cnlevy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-08 13:29:36

Próbuje odpowiedzieć na moje pytanie:

Nie, Nie ma prostszego sposobu niż ten w pytaniu, out of box.

Po wpisaniu tego zbyt wiele razy, po prostu wkleiłem krótszy do pliku wykonywalnego o nazwie 'git-conflicts', udostępnionego dla git, teraz mogę po prostu: git conflicts aby zdobyć listę, którą chciałem.

Update: jak sugeruje Richard, możesz skonfigurować alias git jako alternatywę dla pliku wykonywalnego

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

Zaletą używania programu wykonywalnego nad alias polega na tym, że możesz udostępnić ten skrypt członkom zespołu(w części bin dir repo).

 38
Author: inger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-06 21:43:55

Oto sposób na głupotę:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir
 31
Author: Jones Agyemang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-16 11:50:16

git status wyświetla "both modified" obok plików, które mają konflikty zamiast "modified" lub "new file", itd

 23
Author: Rafa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 09:55:46
git status --short | grep "^UU "
 19
Author: mda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-10 16:33:15

To działa dla mnie:

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

Lub

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

 14
Author: user218867,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-06 20:01:11

Możesz nacisnąć git ls-files -u w linii poleceń wyświetla listę plików z konfliktami

 12
Author: Emil Reña Enriquez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-11 07:34:55

Jeśli spróbujesz się zaangażować i jeśli są konflikty, to git poda ci listę aktualnie nierozwiązanych konfliktów... ale nie jako zwykła lista. Zazwyczaj jest to to, co chcesz podczas interaktywnej pracy, ponieważ lista staje się krótsza w miarę rozwiązywania konfliktów.

 3
Author: Tel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-04 07:20:28

Może to zostało dodane do Git, ale pliki, które nie zostały jeszcze rozwiązane, są wymienione w wiadomości o statusie (Git status) w następujący sposób:

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

Zauważ, że jest to sekcja niezapisane ścieżki.

 3
Author: Patrick O'Hara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-21 15:04:27

Zakładając, że wiesz, gdzie jest Twój katalog główny git, ${GIT_ROOT}, możesz to zrobić,

 cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'
 1
Author: Tzunghsing David Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 00:16:26

Zawsze używałem git status.

Można dodać awk na końcu, aby uzyskać tylko nazwy plików

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

 0
Author: Ascherer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 18:06:36

Moje 2 grosze tutaj (nawet gdy jest dużo fajnych / roboczych odpowiedzi)

I created this alias in my .gitconfig

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

Który pokaże mi tylko nazwy plików z konfliktami... nie cała ich droga :)

 0
Author: Manu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-10 15:35:13

Oto, czego używam do listy zmodyfikowanych plików odpowiednich do podstawiania wiersza poleceń w bash

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

Aby edytować listę użyj substytucji $(cmd).

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

Nie działa, jeśli nazwy plików mają spacje. Próbowałem użyć sed do ucieczki lub cytowania spacji, a lista wyjściowa wyglądała dobrze, ale substytucja $() nadal nie zachowywała się tak, jak chciała.

 0
Author: Darrel Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-14 15:19:45

Narzędzie Git wizard https://github.com/makelinux/git-wizard liczy oddzielnie nierozwiązane skonfliktowane zmiany (kolizje) i niezapisane pliki. Konflikty muszą być rozwiązywane ręcznie lub za pomocą mergetool. Resolved unmerged changes can me added and committed usually with Git rebase --continue.

 0
Author: Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-05 09:51:00

Odpowiedź autorstwa Jones Agyemang jest prawdopodobnie wystarczająca dla większości przypadków użycia i była świetnym punktem wyjścia dla mojego rozwiązania. Do tworzenia skryptów w Git Bent, stworzonej przeze mnie bibliotece wrapperów git, potrzebowałem czegoś bardziej solidnego. Zamieszczam napisany przeze mnie prototyp, który nie jest jeszcze całkowicie przyjazny dla skryptów

Uwagi

  • połączona odpowiedź sprawdza <<<<<<< HEAD, która nie działa w przypadku konfliktów merge z użyciem git stash apply, która ma <<<<<<< Updated Upstream
  • moje rozwiązanie potwierdza obecność ======= & >>>>>>>
  • [18]}linked answer jest z pewnością bardziej wydajny, ponieważ nie musi robić tak wiele [19]}
  • moje rozwiązanie nie podaje numerów linii

Drukowanie plików z konfliktami scalania

Potrzebujesz funkcji str_split_line od dołu.

# Root git directory
dir="$(git rev-parse --show-toplevel)"
# Put the grep output into an array (see below)
str_split_line "$(grep -r "^<<<<<<< " "${dir})" files
bn="$(basename "${dir}")"
for i in "${files[@]}"; do 
    # Remove the matched string, so we're left with the file name  
    file="$(sed -e "s/:<<<<<<< .*//" <<< "${i}")"

    # Remove the path, keep the project dir's name  
    fileShort="${file#"${dir}"}"
    fileShort="${bn}${fileShort}"

    # Confirm merge divider & closer are present
    c1=$(grep -c "^=======" "${file}")
    c2=$(grep -c "^>>>>>>> " "${file}")
    if [[ c1 -gt 0 && c2 -gt 0 ]]; then
        echo "${fileShort} has a merge conflict"
    fi
done

Wyjście

projectdir/file-name
projectdir/subdir/file-name

Podziel ciągi przez funkcję linii

Możesz po prostu skopiować blok kodu, jeśli nie chcesz tego jako oddzielnej funkcji

function str_split_line(){
# for IFS, see https://stackoverflow.com/questions/16831429/when-setting-ifs-to-split-on-newlines-why-is-it-necessary-to-include-a-backspac
IFS="
"
    declare -n lines=$2
    while read line; do
        lines+=("${line}")
    done <<< "${1}"
}
 0
Author: Reed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-25 23:56:21

Niewielka zmiana odpowiedzi Charlesa Baileya, która daje więcej informacji:

git diff --name-only --diff-filter=U | xargs git status
 -1
Author: taj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 01:44:29

Jak zaznaczono w innych odpowiedziach, możemy po prostu użyć polecenia Git status, a następnie poszukać plików znajdujących się pod nieaktywnymi ścieżkami:

 -2
Author: sandesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 10:44:27