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.
113
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.Odpowiedzi:
Po prostu przejrzyj katalog roboczy i wyślij dane wyjściowe za pomocą polecenia xargs:
lub
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.
źródło
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
zgit merge
tak dobrze. Więc:git reset --hard HEAD
)git merge -Xours
lubgit 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.źródło
--theirs
lub--ours
-Option do git v1.9.4. Byłoby podejściegit merge -s recursive -Xtheirs BRANCH
.--theirs
i--ours
nie są dostępne ani z git2.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ę odpowiedniogit 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.źródło
error: path 'foo/bar/blah' does not have our version
.Wydaje się, że wykonuje swoją pracę. Zauważ, że aby to osiągnąć, musisz przejść do katalogu głównego repozytorium git.
źródło
Jeśli ktoś inny chce po prostu nadpisać wszystko z jednej gałęzi (powiedzmy master) zawartością innej, jest łatwiejszy sposób:
Dzięki https://stackoverflow.com/a/1295232/560114
Lub na odwrót, zobacz: Czy istnieje „ich” wersja „git merge -s nasza”?
źródło
Dodałem tę funkcję w pliku .zshrc .
Używaj ich w ten sposób:
gitcheckoutall theirs
lubgitcheckoutall ours
źródło