Czy istnieje sposób rozwiązania konfliktu dla wszystkich plików przy użyciu wyewidencjonowania --ours
i --theirs
? Wiem, że możesz to zrobić dla pojedynczych plików, ale nie mogłeś znaleźć sposobu, aby zrobić to dla wszystkich.
Czy istnieje sposób rozwiązania konfliktu dla wszystkich plików przy użyciu wyewidencjonowania --ours
i --theirs
? Wiem, że możesz to zrobić dla pojedynczych plików, ale nie mogłeś znaleźć sposobu, aby zrobić to dla wszystkich.
Odpowiedzi:
Po prostu przejrzyj katalog roboczy i wyślij dane wyjściowe za pomocą polecenia xargs:
grep -lr '<<<<<<<' . | xargs git checkout --ours
lub
grep -lr '<<<<<<<' . | xargs git checkout --theirs
Jak to działa: grep
przeszuka każdy plik w bieżącym katalogu (the .
) i podkatalogach rekurencyjnie ( -r
flaga), szukając znaczników konfliktu (ciąg '<<<<<<<')
-l
lub --files-with-matches
flagi powoduje grep do wyjścia tylko nazwę pliku, gdzie łańcuch został znaleziony. Skanowanie zatrzymuje się po pierwszym dopasowaniu, więc każdy dopasowany plik jest wyprowadzany tylko raz.
Dopasowane nazwy plików są następnie przesyłane potokiem do xargs , narzędzia, które dzieli potokowany strumień wejściowy na indywidualne argumenty dla git checkout --ours
lub--theirs
Więcej pod tym linkiem .
Ponieważ wpisywanie tego za każdym razem w wierszu poleceń byłoby bardzo niewygodne, jeśli często go używasz, utworzenie aliasu dla wybranej powłoki może nie być złym pomysłem : Bash jest zwykle używany .
Ta metoda powinna działać przez co najmniej Git w wersji 2.4.x.
git diff --name-only --diff-filter=U
.
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]
. Szybsze niż grepowanie, jeśli masz duży projekt.
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.
Można -Xours
albo -Xtheirs
z git merge
tak dobrze. Więc:
git reset --hard HEAD
)git merge -Xours
lub git merge -Xtheirs
)OŚWIADCZENIE: oczywiście można wybrać tylko jedną opcję, albo -Xours
albo -Xtheirs
, czy użyć innej strategii należy oczywiście pójść plik po pliku.
Nie wiem, czy jest na to sposób checkout
, ale szczerze nie sądzę, że jest to strasznie przydatne: wybór strategii poleceniem checkout jest przydatny, jeśli chcesz różnych rozwiązań dla różnych plików, w przeciwnym razie po prostu wybierz podejście strategii scalania.
--theirs
lub --ours
-Option do git v1.9.4. Byłoby podejście git merge -s recursive -Xtheirs BRANCH
.
--theirs
i --ours
nie są dostępne ani z git 2.2.0
. Albo moja odpowiedź nie była precyzyjna, albo były dostępne w starszej wersji gita (ta odpowiedź jest dość stara w epoce IT). Właściwe podejście to -X
. Aktualizuję odpowiednio
git checkout --[ours/theirs] .
zrobisz, co zechcesz, o ile jesteś u źródła wszystkich konfliktów. nasze / ich dotyczą tylko niescalonych plików, więc nie powinieneś specjalnie wyszukiwać konfliktów grep / find / etc.
error: path 'foo/bar/blah' does not have our version
.
git diff --name-only --diff-filter=U | xargs git checkout --theirs
Wydaje się, że wykonuje swoją pracę. Zauważ, że aby to osiągnąć, musisz przejść do katalogu głównego repozytorium git.
Jeśli ktoś inny chce po prostu nadpisać wszystko z jednej gałęzi (powiedzmy master) zawartością innej, jest łatwiejszy sposób:
git merge origin/master --strategy=ours
Dzięki https://stackoverflow.com/a/1295232/560114
Lub na odwrót, zobacz: Czy istnieje „ich” wersja „git merge -s nasza”?
git checkout --ours -- .
? Te.
środki w bieżącym katalogu, gdy stosowana od korzenia katalogu roboczego, więc to w zasadzie oznacza całą katalogu roboczego. Nie jestem pewien, czy to zadziała z--ours
flagą i nie jestem pewien, jak poradzi sobie z konfliktami usuniętych lub zmienionych nazw plików.