Pytanie Zresetuj lokalny repozytorium tak, aby był jak HEAD zdalnego repozytorium


Jak zresetować moją lokalną gałąź, aby była jak gałąź na zdalnym repozytorium?

Zrobiłem:

git reset --hard HEAD

Ale kiedy biegnę git status,

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

Czy możesz mi powiedzieć, dlaczego mam te "zmodyfikowane"? Nie dotknąłem tych plików? Jeśli tak, chcę je usunąć.


2524
2017-10-27 00:27


pochodzenie


Według danych wyjściowych git status twoje drugie polecenie git reset --hard HEAD nie udało się. Jednak nie wkleiłeś jego danych wyjściowych. → Niekompletne pytanie. - Robert Siemer
Wymieszacie tutaj dwa problemy: 1) jak zresetować lokalny oddział do punktu, w którym znajduje się pilot i 2) jak wyczyścić obszar przemieszczania (i ewentualnie katalog roboczy), tak aby git statusmówi nothing to commit, working directory clean. - Proszę sprecyzuj! - Robert Siemer
@RobertSiemer To jest dokładnie to, co chcę. Jak zresetować moje lokalne repo, aby było jak ostatnie zatwierdzenie na zdalnym repo, ale też chcę wyczyścić moje lokalne repozytorium, nie chcę mieć zmian, które mam teraz i nie są w zdalnym repo. Chcę tylko, żeby moje lokalne repo dokładnie było takie samo jak na zdalnym. Czy możesz mi powiedzieć, jak to zrobić? - Alex Ventura


Odpowiedzi:


Ustawienie oddziału tak, aby dokładnie odpowiadał oddziałowi zdalnemu, można wykonać w dwóch krokach:

git fetch origin
git reset --hard origin/master

Jeśli chcesz zapisać bieżący stan oddziału przed wykonaniem tego (na wszelki wypadek), możesz:

git commit -a -m "Saving my work, just in case"
git branch my-saved-work

Teraz twoja praca jest zapisana w oddziale "my-saved-work" na wypadek, gdybyś zdecydował, że chcesz ją odzyskać (lub chcesz ją później sprawdzić lub porównać ze zaktualizowanym oddziałem).

Zauważ, że pierwszy przykład zakłada, że ​​zdalna repozytorium nazywa się "origin", a gałąź o nazwie "master" w zdalnym repo dopasowuje się do aktualnie wyrejestrowanego oddziału w lokalnym repozytorium.

BTW, ta sytuacja, w której się znajdujesz, wygląda jak zwykły przypadek, w którym naciśnięcie zostało wykonane w aktualnie wyodrębnionej gałęzi niezarejestrowanego repozytorium. Czy ostatnio wprowadziłeś swoje lokalne repozytorium? Jeśli nie, to nie martw się - coś innego musiało spowodować nieoczekiwane zmiany tych plików. W przeciwnym razie powinieneś wiedzieć, że nie jest zalecane przesyłanie do repozytorium, które nie jest puste (w szczególności do aktualnie wyrejestrowanego oddziału).


4474
2017-10-27 01:44



Dziękuję za Twoją odpowiedź. Powiedziałeś: "Zauważ, że pierwszy przykład zakłada, że ​​zdalna repozytorium nazywa się" origin ", a gałąź o nazwie" master "w zdalnym repo dopasowuje się do gałęzi lokalnego repo. Jak mogę dokładnie sprawdzić nazwę zdalnego repo i nazwę oddziału, aby się upewnić przed uruchomieniem "git reset --hard"? Dzięki jeszcze raz. - hap497
Jeśli nazwa pilota nie została jawnie określona, ​​nazwa ta prawdopodobnie jest "początkiem" (domyślnie). Możesz użyć "git remote", aby uzyskać listę wszystkich zdalnych nazw. Następnie możesz użyć "git remote <nazwa>", aby zobaczyć, które gałęzie push / pull ze sobą (np. Jeśli twoja gałąź "master" została sklonowana z "master" w zdalnym o nazwie "origin", to dostaniesz linię co oznacza, że ​​"master łączy się ze zdalnym wzorcem"). - Dan Moulding
"nie zaleca się wprowadzania do niezarejestrowanego repozytorium (a nie do obecnie wyrejestrowanego oddziału, w szczególności" Dlaczego tak jest? - LeeGee
Zaraz po ściągnięciu, wierzę, że możesz to zrobić git reset FETCH_HEAD --hard zamiast tego, to samo znaczenie. - Jean
Szkoda, że ​​mogę tylko upomnieć to raz. Przyszedłem do tej dokładnej odpowiedzi jak 20 razy. Prawdopodobnie więcej. - frosty


Musiałem to zrobić (rozwiązanie w zaakceptowanej odpowiedzi):

git fetch origin
git reset --hard origin/master

Śledzony przez:

git clean -f

aby usunąć lokalne pliki

Aby zobaczyć, jakie pliki zostaną usunięte (bez ich usuwania):

git clean -n -f

250
2017-12-27 06:20



również, git clean -d -f jeśli istnieją nieskrępowane katalogi. - garg
również git clean -fdx - Swapnil Kotwal
Jeśli potrzebujesz dokładnej kopii zdalnej gałęzi, musisz wykonać polecenie git clean -ffdx. Zauważ, że są to dwa f. - Trismegistos
The git clean -f był niezbędnym elementem, którego potrzebowałem. Dzięki! - dgo
zachowaj ostrożność, używając polecenia clean. może usuwać zignorowane pliki z innych gałęzi. - mikoop


Najpierw przywróć poprzednio pobrane HEAD odpowiedniego oddziału:

git reset --hard @{u}

Zaleta określania @{u} lub jego pełna forma @{upstream} jest to, że nazwa zdalnego repozytorium i oddziału nie musi być jawnie określona.

Następnie, w razie potrzeby, usuń niepotwierdzone pliki, opcjonalnie również za pomocą -x:

git clean -df

Wreszcie, w razie potrzeby, pobierz najnowsze zmiany:

git pull

119
2018-02-10 20:27



Wydaje się to być lepszą odpowiedzią niż akceptowaną, ponieważ dynamicznie resetuje się do bieżącej gałęzi nadrzędnej, a nie zawsze statycznej, takiej jak origin/master - Jon z


git reset --hard HEAD faktycznie tylko resetuje się do ostatniego zatwierdzonego stanu. W tym przypadku HEAD odnosi się do HEAD twojego oddziału.

Jeśli masz kilka commitów, to nie zadziała.

To, co prawdopodobnie chcesz zrobić, jest resetowane do głowy pochodzenia lub do dowolnego innego zdalnego repozytorium. Prawdopodobnie po prostu zrobiłbym coś takiego

git reset --hard origin/HEAD

Bądź jednak ostrożny. Trudnych resetów nie można łatwo cofnąć. Lepiej zrobić to, co sugeruje Dan, i odłączyć kopię swoich zmian przed zresetowaniem.


91
2017-10-27 01:08



W mojej odpowiedzi była błędna sugestia, że ​​Dan złapał wcześniej. Zmontowałem to, ponieważ nie chcę nikogo zwodzić. Co do pochodzenia / wzorca lub pochodzenia / HEAD rzeczy, spodziewam się, że zależy to od tego, czy faktycznie robisz pobranie najpierw. Jeśli po prostu sklonowałeś pochodzenie i nie miałeś innych gałęzi, które uważam za dość powszechne, to powinien to zresetować. Ale oczywiście, Dan ma rację. - Mikael Ohlson


Wszystkie powyższe sugestie są słuszne, ale często do naprawdę zresetuj swój projekt, musisz również usunąć nawet pliki, które są w twoim .gitignore.

Aby uzyskać moralny odpowiednik kasowanie katalogu projektu i ponowne klonowanie z pilota:

git fetch
git reset --hard
git clean -x -d -f

Ostrzeżenie: git clean -x -d -f jest nieodwracalny i możesz stracić pliki i dane (np. rzeczy, których ignorujesz używając .gitignore).


57
2017-07-23 17:48



Ostrzeżenie: "git clean -x -d -f" jest nieodwracalne i możesz utracić pliki i dane w .gitignore - Akarsh Satija
najlepsza odpowiedź; dzięki. - Bob Baxley


Pytanie łączy tutaj dwie kwestie:

  1. jak zresetować lokalny oddział do punktu, w którym znajduje się pilot
  2. jak wyczyścić obszar przemieszczania (i ewentualnie katalog roboczy), tak aby git statusmówi nothing to commit, working directory clean.

Jednorazowa odpowiedź brzmi:

  1. git fetch --prune  (opcjonalnie) Aktualizuje lokalną migawkę zdalnego repozytorium. Dalsze polecenia są tylko lokalne.
    git reset --hard @{upstream}Umieszcza wskaźnik lokalnej gałęzi w miejscu migawki pilota, a także ustawia indeks i katalog roboczy na pliki tego zatwierdzenia.
  2. git clean -d --force  Usuwa nieśledzone pliki i katalogi, które utrudniają git powiedzenie "Czyszczenie katalogu roboczego".

29
2018-01-31 01:29



The @{upstream} Składnia wymaga wcześniejszego ustawienia, co dzieje się domyślnie, jeśli git checkout <branchname>. - W przeciwnym razie należy go wymienić na origin/<branchname>. - Robert Siemer
Dodaj -x do git clean usunąć wszystko, czego nie ma w zatwierdzeniu (to znaczy nawet pliki zignorowane przez mechanizm .gitignore). - Robert Siemer


Jest to coś, z czym się regularnie spotykam i uogólniłem przedstawiony powyżej skrypt Wolfganga do pracy z dowolnym oddziałem

Dodałem również monit "jesteś pewien" i niektóre informacje zwrotne

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

20
2017-11-09 13:01



możesz użyć "git remote", aby uzyskać nazwę pilota. W niektórych przypadkach nie będzie to "pochodzenie" - Yurik


Oto skrypt, który automatyzuje to, co sugeruje najpopularniejsza odpowiedź ... Widzieć https://stackoverflow.com/a/13308579/1497139 dla ulepszonej wersji obsługującej gałęzie

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  git branch "auto-save-at-$timestamp" 
fi
git fetch origin
git reset --hard origin/master

11
2017-10-15 08:50





Pod warunkiem, że jest to repozytorium zdalne origini że jesteś zainteresowany branch_name:

git fetch origin
git reset --hard origin/<branch_name>

Ponadto, przejdź do resetowania bieżącej gałęzi origin do HEAD.

git fetch origin
git reset --hard origin/HEAD

Jak to działa:

git fetch origin pobiera najnowszą wersję z komputera zdalnego bez próby scalania lub rebase niczego.

A później git reset resetuje <branch_name> Oddział do tego, co właśnie przyniosłeś. The --hard opcja zmienia wszystkie pliki w drzewie roboczym, aby pasowały do ​​plików w origin/branch_name.


11
2018-05-08 11:12





Zrobiłem:

git branch -D master
git checkout master

całkowicie zresetować gałąź


należy zwrócić się do innego oddziału, aby móc usunąć wymagany oddział


10
2018-05-14 07:48



Powinieneś ponownie przeczytać pytanie, nie ma nic, co mogłoby wpłynąć na zdalne, ale ustawienie takie samo jak zdalne, więc nie powinieneś robić nic z zdalnym, a to pomogło w moim przypadku i nie wyżej. - user2846569
Jeśli chcesz ustawić go tak samo, jak zdalny, powinieneś przynajmniej wykonać pobieranie w pewnym momencie, nie zgadzasz się? - Tim Castelijns
powinieneś przynajmniej spróbować tego lub przeczytać dokumenty: kernel.org/pub/software/scm/git/docs/git-checkout.html - user2846569
Nie ma innej gałęzi ;-) Myślę, że dodatkowy krok to coś, co powinieneś edytować w swojej odpowiedzi, a jeśli to zrobisz, usuniemy downvote (nie mogę teraz, ponieważ jest zablokowany) - Tim Castelijns
Stwórz więc tymczasowy. - qaisjp


Jeśli miałeś problem jak ja, to już popełniłeś pewne zmiany, ale teraz, z jakiegokolwiek powodu, chcesz się go pozbyć, najszybszym sposobem jest użycie git reset lubię to:

git reset --hard HEAD~2

Miałem 2 niepotrzebne zatwierdzenia, stąd numer 2. Możesz go zmienić na własną liczbę zatwierdzeń do zresetowania.

Odpowiadając na twoje pytanie - jeśli jesteś 5 zobowiązaniami przed zdalnym repozytorium HEAD, powinieneś uruchomić to polecenie:

git reset --hard HEAD~5

Zauważ, że utracisz wprowadzone zmiany, więc bądź ostrożny!


7
2018-06-16 03:35