Rozwiązywanie konfliktów Git merge na rzecz ich zmian podczas pull
Jak rozwiązać konflikt Git merge na rzecz ściągniętych zmian?
Zasadniczo muszę usunąć wszystkie sprzeczne zmiany z działającego drzewa bez konieczności przechodzenia przez wszystkie konflikty z git mergetool
, zachowując wszystkie bezkonfliktowe zmiany. Najlepiej robić to podczas ciągnięcia, nie później.
8 answers
Możesz użyć opcji rekurencyjnej" ich " strategii :
git merge --strategy-option theirs
From the man :
ours
This option forces conflicting hunks to be auto-resolved cleanly by
favoring our version. Changes from the other tree that do not
conflict with our side are reflected to the merge result.
This should not be confused with the ours merge strategy, which does
not even look at what the other tree contains at all. It discards
everything the other tree did, declaring our history contains all that
happened in it.
theirs
This is opposite of ours.
Uwaga: jak mówi strona podręcznika, opcja strategii" nasza "merge bardzo różni się od strategii" nasza " merge .
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
2016-05-06 17:31:40
git pull -s recursive -X theirs <remoterepo or other repo>
Lub po prostu dla domyślnego repozytorium:
git pull -X theirs
Jeśli jesteś już w stanie konfliktu...
git checkout --theirs path/to/file
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-06 00:21:06
Jeśli jesteś już w stanie konfliktu i chcesz zaakceptować wszystkie z nich:
git checkout --theirs .
git add .
Jeśli chcesz zrobić odwrotnie:
git checkout --ours .
git add .
To jest dość drastyczne, więc upewnij się, że naprawdę chcesz wymazać wszystko w ten sposób, zanim to zrobisz.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-11-06 15:18:44
Ok, wyobraź sobie scenariusz, w którym właśnie byłem:
Próbujesz merge
, a może cherry-pick
, i jesteś zatrzymany przez
$ git cherry-pick 1023e24
error: could not apply 1023e24... [Commit Message]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
Teraz przeglądasz skonfliktowany plik i naprawdę nie chcesz zachować swoich zmian. W moim przypadku powyżej, plik był skonfliktowany NA tylko nowej linii mój IDE miał automatycznie dodane. Aby cofnąć zmiany i zaakceptować ich, najprostszym sposobem jest:
git checkout --theirs path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php
Konwersja tego (aby nadpisać nadchodzącą wersję z twoją wersją) To
git checkout --ours path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php
Zaskakująco, I nie mogłem znaleźć tej odpowiedzi bardzo łatwo w sieci.
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-08-01 12:11:25
Aby rozwiązać wszystkie konflikty z wersją w danej gałęzi:
git diff --name-only --diff-filter=U | xargs git checkout ${branchName}
Tak więc, jeśli jesteś już w stanie scalania i chcesz zachować wersję główną konfliktujących plików:
git diff --name-only --diff-filter=U | xargs git checkout master
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-12-06 08:54:47
Odpowiedzi git pull -X theirs
mogą utworzyć brzydki commit scalający lub wydać
Błąd: Twoje lokalne zmiany w następujących plikach zostaną nadpisane przez scalenie:
Jeśli chcesz po prostu zignorować lokalne modyfikacje plików z repo, na przykład na kliencie, który zawsze powinien być serwerem lustrzanym pochodzenia, uruchom to (zastąp master
z wybraną gałęzią):
git fetch && git reset --hard origin/master
Jak to działa? git fetch
Czy git pull
ale bez połączenia . Wtedy git reset --hard
sprawia, że Twoje działające drzewo pasuje do ostatniego commita. Wszystkie lokalne zmiany w plikach w repo zostaną odrzucone , ale nowe pliki lokalne zostaną pozostawione same.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-01-23 11:00:32
Proszę nie żeby czasem to nie działało : {]}
Git checkout --ours path/to / file Lub Git checkout --their path / to / file Zrobiłem to zamiast tego, zakładając, że HEAD jest nasz i MERGE_HEAD jest ich Lub: Po tym jak to zrobimy i będziemy dobrzy: Jeśli chcesz zrozumieć więcej, Zobacz wspaniały post torek tutaj :
git checkout --nasz nie usuwa pliki z listy unmerged files
git checkout HEAD -- path/to/file
git checkout MERGE_HEAD -- path/to/file
git add .
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-05-23 12:10:44
Z https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging
To w zasadzie zrobi fałszywe połączenie. Zarejestruje nowy commit scalający z obydwoma gałęziami jako rodzicami, ale nawet nie spojrzy na gałąź łączysz się. Będzie po prostu nagrywać w wyniku połączenia dokładny kod w bieżącej gałęzi.
$ git merge -s ours mundo
Merge made by the' ours ' strategy.
$ git diff HEAD HEAD~
Widać, że nie ma różnicy między branch we were on i wynik połączenia.
To często może być przydatne, aby w zasadzie oszukać Gita, myśląc, że branch jest już scalany podczas późniejszego scalania. Na przykład, powiedzmy rozgałęziłeś gałąź release i wykonałeś nad nią trochę pracy, która w pewnym momencie będziesz chciał ponownie połączyć się ze swoją gałęzią master. W w międzyczasie jakaś poprawka na master musi zostać ponownie zaimportowana do twojego uwolnij gałąź. Możesz scalić gałąź bugfix do wydania oddział a także połącz-s naszą tę samą gałąź z Twoją główną gałąź (mimo, że poprawka już tam jest), więc kiedy później połączysz ponownie wydaj gałąź, nie ma konfliktów z poprawką.
Sytuacja, którą uznałem za przydatną, jeśli chcę, aby master odzwierciedlał zmiany nowej gałęzi tematycznej. Zauważyłem ,że-Xtheirs nie łączy się bez konfliktów w pewnych okolicznościach... np.
$ git merge -Xtheirs topicFoo
CONFLICT (modify/delete): js/search.js deleted in HEAD and modified in topicFoo. Version topicFoo of js/search.js left in tree.
W tym przypadku znalazłem rozwiązanie
$ git checkout topicFoo
From topicFoo, najpierw połącz w master używając strategii-s ours, stworzy to fałszywy commit, który jest tylko stanem topicFoo. $ git merge-s ours master
Sprawdź utworzony commit merge
$ git log
Teraz sprawdź gałąź master
$ git checkout master
Połącz gałąź topic z powrotem, ale tym razem użyj rekurencyjnej strategii-Xtheirs, to teraz przedstawi Ci gałąź master ze stanem topicFoo.
$ git merge -X theirs topicFoo
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-10-05 17:29:38