Rozwiązuj konflikty przy użyciu zdalnych zmian podczas pobierania z Git Remote

297

Próbuję pobrać kod z mojego repozytorium GitHub na mój serwer, ale ciągnięcie nie powiedzie się z powodu konfliktów scalania. Nie chcę zachować żadnych zmian, które mogły wystąpić na moim serwerze lokalnym od czasu ostatniego ściągnięcia.

Czy jest więc sposób, w jaki mogę zmusić Git do zastąpienia dowolną wersją w GitHub, zamiast martwić mnie konfliktami?

David Tuite
źródło
4
@nvm: Nie. Chodzi o prawdziwe konflikty scalania, a nie nieśledzone pliki, które zostałyby nadpisane.
Cascabel

Odpowiedzi:

491

Jeśli naprawdę chcesz odrzucić zatwierdzenia , które poczyniłeś lokalnie, tj. Nigdy nie będziesz ich mieć w historii, nie pytasz, jak wyciągnąć - pull oznacza scalenie i nie musisz scalać. Wszystko, co musisz zrobić, to:

# fetch from the default remote, origin
git fetch
# reset your current branch (master) to origin's master
git reset --hard origin/master

Osobiście poleciłbym najpierw utworzyć gałąź zapasową w bieżącym HEAD, aby jeśli zdałeś sobie sprawę, że był to zły pomysł, nie straciłeś go z oczu.

Z drugiej strony, jeśli chcesz zachować te zatwierdzenia i sprawić, by wyglądało to tak, jakbyś połączył się z początkiem, i spowodowałoby, że scalanie nie zachowałoby wersji tylko od początku, możesz użyć oursstrategii scalania:

# fetch from the default remote, origin
git fetch
# create a branch at your current master
git branch old-master
# reset to origin's master
git reset --hard origin/master
# merge your old master, keeping "our" (origin/master's) content
git merge -s ours old-master
Cascabel
źródło
1
Czy w drugim bloku komend git powinno być „git fetch origin” po drugim poleceniu?
David Tuite
@David: Tak, w pewnym momencie powinieneś pobrać z miejsca pochodzenia. Przepraszam, uważałem to za dorozumiane.
Cascabel
2
Nie ma nic, co można by sugerować, jeśli chodzi o mnie i git ;-). Poważnie, dziękuję milion. Twoje odpowiedzi są dokładnie tym, czego szukałem.
David Tuite
1
Czy to zadziała, jeśli pochodzenie jest rzeczywiście przed nami? jak w, czy mogę go również użyć, jeśli nie mam żadnych zatwierdzeń z wyprzedzeniem, a w rzeczywistości oddział można szybko przewinąć?
Jared Forsyth,
1
Dzięki! Sprawiło, że wydawało się to łatwe.
sholsinger
137

Możesz użyć odpowiedzi z duplikatu linku wskazanego przez nvm.

Lub możesz rozwiązać konflikty za pomocą ich zmian (ale niektóre z twoich zmian mogą zostać zachowane, jeśli nie powodują konfliktu z wersją zdalną):

git pull -s recursive -X theirs
Antoine Pelisse
źródło
3
Wydaje się, że nie działa dla mnie. Pojawia się komunikat „błąd: nieznany przełącznik„ X ”” przy użyciu git git w wersji 1.5.6.5. Czy muszę uaktualnić do wersji niestabilnej?
David Tuite
Ponadto, Antoine, jeśli chcesz wziąć wersję źródłową wszystkiego, nie tylko sprzecznych treści, możesz - zobacz moją odpowiedź.
Cascabel
2
@David Możesz pobrać najnowszą wersję git dla
debiana
2
Właśnie tego szukałem!
micahblu
2
@CeesTimmerman Nieprawda, przynajmniej w najnowszym git. Xopcja jest przekazywana do scalania strategii, która jest tylko recursivewtedy, gdy scalisz dwie głowy, więc twoje polecenie będzie narzekać "Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree."- szkoda, ponieważ Xmożna ustawić w config (np. git config pull.twohead theirs), ale snie można.
OJFord