git zamień wersję lokalną na wersję zdalną

148

Jak mogę powiedzieć gitowi, aby ignorował mój plik lokalny i pobierał ten z mojej zdalnej gałęzi bez próby scalenia i powodowania konfliktów?

ryudice
źródło
1
Zobacz odpowiedź SO „ polecenie git, aby uczynić jedną gałąź podobną do innej ”, aby zapoznać się ze wszystkimi aktualnymi sposobami symulacjigit merge -s their .
VonC
Byłoby pomocne, gdybyś mógł podać więcej szczegółów. Czy chcesz przejąć zawartość wszystkich plików ze zdalnego oddziału, czy tylko niektórych plików (tj. Zachować niektóre lokalne wersje / zmiany)? Czy masz jakąś lokalną historię, którą chcesz zachować? (Może to być ważne, jeśli istnieją inne gałęzie lub repozytoria, które już włączyły Twoją historię lokalną). Jeśli chcesz zachować historię lokalną, co planujesz z nią zrobić później? (Możesz zostawić znacznik wskazujący na lokalną historię i po prostu zresetować oddział do tego, co ma pilot, lub możesz chcieć „scalić ich”).
Chris Johnsen,

Odpowiedzi:

169

To najbezpieczniejsze rozwiązanie:

git stash

Teraz możesz robić, co chcesz, bez obawy o konflikty.

Na przykład:

git checkout origin/master

Jeśli chcesz uwzględnić zdalne zmiany w gałęzi głównej, możesz zrobić:

git reset --hard origin/master

Spowoduje to, że gałąź „master” wskaże na „początek / wzorzec”.

Olivier Verdier
źródło
90
Warto zauważyć, że spowoduje to odłączenie HEAD - pytający może wolałby zostać na gałęzi zgit stash; git fetch origin; git reset --hard origin/master
Markiem Longair
10
Myślę, że komentarz Marka Longaira jest właściwą odpowiedzią na to pytanie
to była dla mnie najbardziej użyteczna odpowiedź +1
Andres
Jak wrócić do stanu sprzed git stash? git stash listjest pusty.
Leo
Chcę cię przytulić
Ugur Kazdal
45

Rozumiem to pytanie tak: chcesz całkowicie zastąpić zawartość jednego pliku (lub zaznaczenia) z nadrzędnego. Nie chcesz bezpośrednio wpływać na indeks (więc jak zwykle przechodzisz przez add + commit).

Po prostu zrób

git checkout remote/branch -- a/file b/another/file

Jeśli chcesz to zrobić dla obszernych poddrzew i zamiast tego chcesz bezpośrednio wpływać na indeks, użyj

git read-tree remote/branch:subdir/

Następnie możesz (opcjonalnie) zaktualizować swoją kopię roboczą, wykonując

git checkout-index -u --force
sehe
źródło
2
Właśnie tego chciałem. Dzięki.
AutonomousApps
11

Rozumiem, że na przykład błędnie zapisałeś plik, który zaktualizowałeś tylko do celów testowych. Następnie, kiedy uruchomisz "git status", plik pojawi się jako "Zmodyfikowany" i wypowiesz kilka złych słów. Chcesz po prostu przywrócić starą wersję i kontynuować normalną pracę.

W tym scenariuszu możesz po prostu uruchomić następujące polecenie:

git checkout -- path/filename
Almir Campos
źródło
10

Pobrałbym zdalny plik z "master" (repozytorium zdalnego / pochodzenia) w następujący sposób:

git checkout master <FileWithPath>

Przykład: git checkout master components / indexTest.html

Birol Efe
źródło
Dla mnie działało w ten sposób "git checkout zdalne / pochodzenie / mistrz <my-file>"
saravanakumar
4

Użyj opcji -slub --strategypołączonej z -Xopcją. W swoim konkretnym pytaniu chcesz zachować wszystkie zdalne pliki i zastąpić pliki lokalne o tej samej nazwie.

Zastąp konflikty wersją zdalną

git merge -s recursive -Xtheirs upstream/master  

użyje wersji repozytorium zdalnego wszystkich plików będących w konflikcie.

Zastąp konflikty wersją lokalną

git merge -s recursive -Xours upstream/master

użyje wersji lokalnego repozytorium wszystkich plików będących w konflikcie.

csi
źródło