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?


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”.


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

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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.