Jak zresetować „master” do „origin / master”?

215

Czy mogę wykonać następujące czynności w prostszy sposób?

git checkout origin/master
git branch -D master
git branch master
git checkout master
Xiè Jìléi
źródło
Czasami można to zrobić bez dotykania działającego drzewa: stackoverflow.com/a/12343727/586086
Andrew Mao
6
Zaktualizuj zaakceptowaną odpowiedź: Odpowiedź KindDragon jest poprawna i krótsza.
Robert Siemer

Odpowiedzi:

310

Jak KindDragon „s odpowiedź wspomina, można odtworzyć masterbezpośrednio origin/masterz:

git checkout -B master origin/master

git checkoutStrona man wspomina:

Jeśli -Bpodano, <new_branch>jest tworzony, jeśli nie istnieje; w przeciwnym razie jest resetowany . Jest to transakcyjny odpowiednik

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

Pierwotnie sugerowane:

Coś jak:

$ git checkout master

# remember where the master was referencing to
$ git branch previous_master

# Reset master back to origin/master
$ git reset --hard origin/master

przy czym krok 2 jest opcjonalny.

VonC
źródło
1
Możesz to zrobić za pomocą jednej linii.
Robert Siemer
93

Git obsługuje to polecenie:

git checkout -B master origin/master

Sprawdź origin/mastergałąź, a następnie zresetuj mastertam gałąź.

KindDragon
źródło
4
Jedyna prawdziwa odpowiedź.
Robert Siemer
3
zapisz cztery naciśnięcia klawiszy - nie potrzebujesz cudzysłowów. Po prostu: git checkout -B master origin / master
zumalifeguard
powiedzmy, że popełniłem 2 rzeczy, pierwsza to połączenie z gałęzią, a druga jest regularna. Co stanie się ze scaleniem, jeśli wrócę do źródła / wzorca?
utdev
1
nie musisz git fetch origin masterwcześniej, aby mieć pewność, że origin/masterjest aktualizowany?
pedrozath
Tak, oczywiście ze wszystkimi rozwiązaniami, które powinieneś zrobić git fetchnajpierw
KindDragon
29

Myślę, że nawet odpowiedź VonC ma złożoność w porównaniu z tą opcją:

git update-ref refs/heads/master origin/master
git reset --hard master

git automatycznie rejestruje każdą wartość ref (poprzez reflog). Więc po uruchomieniu tej komendy master@{1}odnosi się do poprzedniej wartości master.

Odpowiedź VonC jest poprawna, ale marnuje czas na sprawdzanie starej wartości master w systemie plików.

Jeśli zależy Ci na osieroconych obiektach w repozytorium, możesz uruchomić git gc

Alexander Bird
źródło
1
Brzmi interesująco. +1
VonC
Nadal dostajęAlready on 'master'
yourfriendzak
@tworzony_framdzak, zapomniałem wziąć pod uwagę, że być może już sprawdziłeś wzorzec przed aktualizacją wzorca. Zaktualizowałem odpowiedź, aby była taka, która powinna działać również w tym przypadku.
Alexander Bird
Działa to nawet, jeśli nie jesteś na masterie (jak odłączony stan HEAD, który w rzeczywistości wskazuje na początek / master końcówki). Następnie możesz zrealizować transakcję master bez konieczności przerzucania starych plików przez repozytorium. Wspaniały!
Andrew Mao,
20

Jeśli jesteś już włączony master, możesz wykonać następujące czynności:

git reset --hard origin/master

Wskaże masteroddział lokalny na pilota origin/masteri odrzuci wszelkie modyfikacje działającego katalogu.

Fuad Saud
źródło
I usunie pliki! Jeśli utworzyłeś / edytujesz pliki i uruchomiłeś na nich „git add”, to polecenie je usunie. Być ostrzeżonym.
Cheeso,
Czy to podejście jest lepsze niż git checkout -B master origin/master?
Jim Aho