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.

Author: sanmai, 2012-05-22

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 .

 613
Author: Ikke,
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
 705
Author: Pascal Fares,
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.
 294
Author: lots-to-learn,
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.

 203
Author: Theodore R. Smith,
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
 15
Author: Ariel Alvarez,
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.
 11
Author: Dan Dascalescu,
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

git checkout HEAD -- path/to/file

Lub:

git checkout MERGE_HEAD -- path/to/file

Po tym jak to zrobimy i będziemy dobrzy:

git add .

Jeśli chcesz zrozumieć więcej, Zobacz wspaniały post torek tutaj : git checkout --nasz nie usuwa pliki z listy unmerged files

 9
Author: Nicolas D,
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
 -1
Author: Amos Folarin,
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