Jak rozwiązać konflikt scalania git na korzyść wycofanych zmian?
Zasadniczo muszę usunąć wszystkie sprzeczne zmiany z działającego drzewa bez konieczności przechodzenia przez wszystkie konflikty z git mergetool
zachowaniem wszystkich zmian wolnych od konfliktów. Najlepiej robić to podczas ciągnięcia, a nie później.
git
git-merge
git-merge-conflict
sanmai
źródło
źródło
Odpowiedzi:
Lub po prostu dla domyślnego repozytorium:
Jeśli jesteś już w stanie konfliktu ...
źródło
-s recursive
tutaj jest to zbędne, ponieważ jest to domyślna strategia scalania. Możesz więc to uprościćgit pull -X theirs
, co w zasadzie jest równoważne zgit pull --strategy-option theirs
.MERGING
stanu. Mogę wtedygit merge --abort
i spróbować ponownie, ale za każdym razem kończę się połączeniem. … Wiem jednak, że został przekazany rebase do mojego górnego biegu, więc może to powoduje?git checkout --theirs path/to/file
. Użyłem go podczas rebase i uzyskałem nieoczekiwane wyniki. Znaleziono wyjaśnienie w dokumencie: Zauważ, że podczas git rebase i git pull --rebase, nasze i ich mogą się zamieniać; --ours podaje wersję z gałęzi, na której zmiany są oparte, a - theirs podaje wersję z gałęzi, która zawiera twoją pracę, która jest zmieniana.git checkout --theirs/--ours path
strona podręcznika man stwierdza, że działa dla nie połączonych ścieżek . Więc jeśli nie było konfliktu na ścieżce, jest już scalone, to polecenie nic nie zrobi. Może to powodować problemy, gdy chcesz na przykład „ich” wersję całego podfolderu. W takim przypadku bezpieczniej byłoby zrobićgit checkout MERGE_HEAD path
lub użyć skrótu zatwierdzenia.git pull -X theirs
tworzy zatwierdzenie scalania, jeśli występują konflikty (np. jeśli inny program uruchamiający podbiegłgit push -f
do pilota). Jeśli nie chcesz zatwierdzać scalania, uruchom zamiast tegogit fetch && git reset --hard origin/master
.Można użyć „ich” Strategia rekurencyjną opcji :
git merge --strategy-option theirs
Od mężczyzny :
Uwaga: ponieważ strona mężczyzna mówi, w „nasze” scalanie opcja strategia jest bardzo różni się od „nasze” seryjnej strategii .
źródło
git checkout --theirs
do obsługi pojedynczego pliku będącego w konflikciegit checkout <ref to theirs> -- the/conflicted.file
; a następniegit add
ich zmiany.Jeśli jesteś już w stanie konfliktu i chcesz po prostu zaakceptować wszystkie :
Jeśli chcesz zrobić odwrotnie:
Jest to dość drastyczne, więc upewnij się, że naprawdę chcesz wyczyścić wszystko w ten sposób, zanim to zrobisz.
źródło
.
i określ plik (i) zamiast kropki, którą chcesz pobrać. prawdopodobnie mniej „drastyczny” i dokładnie to, co chcesz zrobić.git add -u
zamiast tego, aby pominąć pliki, które nie są pod kontrolą wersji.OK, więc wyobraź sobie scenariusz, w którym właśnie byłem:
Próbujesz
merge
, a może icherry-pick
, i jesteś zatrzymanyTeraz widzisz plik będący w konflikcie i naprawdę nie chcesz zachować swoich zmian. W moim przypadku powyżej plik był w konflikcie tylko w nowej linii, którą moje IDE dodało automatycznie. Aby cofnąć zmiany i zaakceptować ich, najprostszym sposobem jest:
W przeciwieństwie do tego (aby zastąpić wersję przychodzącą wersją):
Zaskakujące, że nie mogłem znaleźć tej odpowiedzi bardzo łatwo w sieci.
źródło
git status
pomiędzycheckout
iadd
, plik nadal będzie wyświetlany jako „oba zmodyfikowane”.git reset --hard
a następniegit pull [remote server name] [branch name] -Xtheirs
(cofa scalanie, a następnie ciągnie nowe elementy na moje) - nie jestem pewien, czy tego właśnie chcesz.W
git pull -X theirs
odpowiedzi mogą tworzyć brzydkie scalającej, lub wydaniaJeśli chcesz po prostu zignorować wszelkie lokalne modyfikacje plików z repozytorium, na przykład na kliencie, który zawsze powinien być kopią lustrzaną źródła, uruchom to (zamień
master
na gałąź, którą chcesz):Jak to działa?
git fetch
robi,git pull
ale bez łączenia . Następniegit reset --hard
dopasowuje działające drzewo do ostatniego zatwierdzenia. Wszystkie lokalne zmiany w plikach w repozytorium zostaną odrzucone , ale nowe pliki lokalne pozostaną same.źródło
git fetch && git reset --hard {remote}/{branch}
rozwiązało mój problem. Musiałem całkowicie porzucić własne zmiany na korzyść „ich” stanu gałęzi, alegit pull -X theirs
dusiły się w niektórych plikach przeniesionych / o zmienionej nazwie. Dzięki!Po połączeniu git, jeśli masz konflikty i chcesz albo swoje, albo ich
źródło
Aby rozwiązać wszystkie konflikty z wersją w określonej gałęzi:
Tak więc, jeśli jesteś już w stanie scalenia i chcesz zachować wersję główną plików w konflikcie:
źródło
git cherry-pick --continue
czy jestgit commit --allow-empty
polecenie popełnienia tych zmian, i wydaje się, że żaden system, za którym wymagane jest polecenie, które sprawia, że automatyzację ten ból. Obecnie rozwiązuję ten problem, sprawdzając, czy.git/COMMIT_EDITMSG
plik istnieje , ale wydaje się to hacking i kruche, i nie jestem jeszcze przekonany, że zawsze działa.git add
), możesz przez to rozwiązać zbiorczo.git checkout --ours
/ teżgit checkout --theirs
jest przydatne.Proszę nie, że czasami to nie zadziała :
lub
Zrobiłem to zamiast tego, zakładając, że HEAD należy do nas, a MERGE_HEAD należy do nich
lub:
Gdy to zrobimy i będziemy dobrze:
Jeśli chcesz dowiedzieć się więcej, zobacz wspaniały wpis torek tutaj: git checkout - nasze pliki nie usuwają plików z listy nie połączonych plików
źródło
Użytkownicy IDE Code (zintegrowany Git):
Jeśli chcesz zaakceptować wszystkie nadchodzące zmiany w pliku konfliktu, wykonaj następujące czynności.
Podobnie możesz zrobić dla innych opcji, takich jak Akceptuj wszystkie oba, Akceptuj wszystkie bieżące itp.,
źródło
Miałem długo działającą
next-version
gałąź z mnóstwem usunięć plików, które się zmieniłydevelop
, plików dodanych w różnych miejscach obu gałęzi itp.Chciałem wziąć całą zawartość
next-version
oddziałudevelop
, wszystko w jednym wielkim zatwierdzeniu scalania.Kombinacja powyższych poleceń, która działała dla mnie, była:
Nie nowa odpowiedź, po prostu łączenie fragmentów z wielu odpowiedzi, częściowo po to, aby upewnić się, że możesz potrzebować wszystkich tych odpowiedzi.
źródło
Jeśli jesteś już w stanie konfliktu i nie chcesz pobierać ścieżki pojedynczo. Możesz spróbować
źródło
Sytuacja okazała się przydatna, jeśli chcę, aby master odzwierciedlał zmiany w nowej gałęzi tematów. Zauważyłem, że -Xtheirs nie łączą się bez konfliktów w niektórych okolicznościach ... np
W tym przypadku znalazłem rozwiązanie
from topicFoo, pierwsze scalenie w master przy użyciu strategii -s nasza, spowoduje to utworzenie fałszywego zatwierdzenia, które jest stanem topicFoo. $ git merge - nasz mistrz
sprawdź utworzone zatwierdzenie scalania
teraz sprawdź gałąź master
połącz gałąź tematów z powrotem, ale tym razem skorzystaj ze strategii rekurencyjnej -Xtheirs, teraz zobaczysz gałąź główną ze stanem topicFoo.
źródło