Zresetuj lokalną gałąź repozytorium tak, aby była jak zdalna Głowica repozytorium

Jak zresetować lokalną gałąź tak, aby była taka sama jak w zdalnym repozytorium?

Zrobiłem:

git reset --hard HEAD

Ale kiedy uruchamiam 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 dotykałem tych akt? Jeśli tak, to chcę je usunąć.
 2641
Author: isherwood, 2009-10-27

19 answers

Ustawienie gałęzi tak, aby dokładnie pasowała do gałęzi zdalnej można wykonać w dwóch krokach:

git fetch origin
git reset --hard origin/master

Jeśli chcesz zapisać stan bieżącej gałęzi przed wykonaniem tego zadania (na wszelki wypadek), możesz to zrobić:

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

Teraz Twoja praca jest zapisywana w gałęzi "my-saved-work" W przypadku, gdy zdecydujesz, że chcesz ją odzyskać (lub chcesz spojrzeć na nią później lub porównać ją ze zaktualizowaną gałęzią).

Zauważ, że pierwszy przykład zakłada, że nazwa zdalnego repo to "origin", a gałąź o nazwie " master" w zdalnym repo pasuje do aktualnie pobranego oddziału w Twoim lokalnym repo.

BTW, ta sytuacja, w której się znajdujesz, wygląda strasznie jak zwykły przypadek, w którym push został wykonany do aktualnie sprawdzonej gałęzi nie-gołego repozytorium. Czy ostatnio wepchnąłeś się do lokalnego repo? Jeśli nie, to nie martw się-coś innego musiało spowodować nieoczekiwane modyfikacje tych plików. W przeciwnym razie powinieneś mieć świadomość, że nie zaleca się wpychania do nie-gołego repozytorium (a w szczególności nie do aktualnie sprawdzonego oddziału).

 4697
Author: Dan Moulding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-19 15:59:20

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

git fetch origin
git reset --hard origin/master

, po którym następuje:

git clean -f

Aby usunąć Pliki lokalne

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

git clean -n -f
 260
Author: Akavall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 17:59:34

Najpierw zresetuj do poprzednio pobranej HEAD odpowiedniej gałęzi upstream:

git reset --hard @{u}

Zaletą określenia @{u} lub jego wyrazistej formy @{upstream} jest to, że nazwa zdalnego repo i branch nie muszą być jawnie określone.

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

git clean -df

Wreszcie, w razie potrzeby, pobierz najnowsze zmiany:

git pull
 136
Author: A-B-B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-07 15:30:47

git reset --hard HEAD w rzeczywistości resetuje się tylko do ostatniego stanu zaangażowanego. W tym przypadku głowa odnosi się do głowy oddziału.

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

To, co prawdopodobnie chcesz zrobić, to zresetować do głowicy origin lub jak to się nazywa zdalne repozytorium. Prawdopodobnie zrobiłbym coś w stylu

git reset --hard origin/HEAD
Bądź ostrożny. Twardych resetów nie można łatwo cofnąć. Lepiej jest zrobić to, co sugeruje Dan, i odgałęzić kopię zmian przed zresetowaniem.
 94
Author: Mikael Ohlson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 09:49:35

Wszystkie powyższe sugestie są słuszne, ale często aby naprawdę zresetować projekt, musisz również usunąć nawet pliki, które znajdują się w twoim .gitignore.

Aby uzyskać moralny odpowiednik wymazania katalogu projektu i ponownego klonowania z pilota jest:

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

Ostrzeżenie: git clean -x -d -f jest nieodwracalne i możesz stracić pliki i dane(np. rzeczy, które zignorowałeś używając .gitignore).

 59
Author: Christopher Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 21:46:59

Pytanie miesza tu dwie kwestie:

  1. jak zresetować lokalną gałąź do punktu, w którym znajduje się pilot
  2. Jak wyczyścić miejsce postojowe (i ewentualnie katalog roboczy), aby git status powiedział nothing to commit, working directory clean.

Odpowiedź to:

  1. git fetch --prune (opcjonalnie) aktualizuje lokalną migawkę zdalnego repo. Dalsze polecenia są tylko lokalne.
    git reset --hard @{upstream}umieszcza wskaźnik lokalnej gałęzi w miejscu, w którym migawka zdalnego jest, a także ustawić indeks i katalog roboczy do plików tego commita.
  2. git clean -d --force usuwa pliki i katalogi, które uniemożliwiają gitowi napisanie "working directory clean".
 30
Author: Robert Siemer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 01:29:30

To jest coś, z czym mam do czynienia regularnie , i uogólniłem powyższy skrypt do pracy z dowolną gałęzią

Dodałem również monit "czy jesteś pewien" i kilka informacji zwrotnych

#!/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
 21
Author: Andrew Tulloch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-30 15:32:37

Pod warunkiem, że zdalnym repozytorium jest origin, i że jesteś zainteresowany branch_name:

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

Możesz także zresetować bieżącą gałąź origin na HEAD.

git fetch origin
git reset --hard origin/HEAD

Jak to działa:

git fetch origin pobiera najnowsze z pilota bez próby scalania lub rebase czegokolwiek.

Następnie git reset resetuje <branch_name> gałąź do tego, co właśnie pobrałeś. Opcja --hard zmienia wszystkie pliki w drzewie roboczym, aby pasowały do plików w origin/branch_name.

 12
Author: eigenharsha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 02:40:33

Oto skrypt, który automatyzuje to, co sugeruje najpopularniejsza odpowiedź ... Zobacz 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
Author: Wolfgang Fahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:01

Zrobiłem:

git branch -D master
git checkout master

Aby całkowicie zresetować gałąź


Uwaga, Należy przejść do innego oddziału, aby móc usunąć wymaganą gałąź

 10
Author: user2846569,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 11:18:06

Jeśli miałeś problem jako ja, że już wprowadziłeś pewne zmiany, ale teraz, z jakiegokolwiek powodu chcesz się go pozbyć, najszybszym sposobem jest użycie git reset w ten sposób:

git reset --hard HEAD~2

Miałem 2 nie potrzebne commity, stąd Liczba 2. Możesz zmienić go na swój własny numer commitów do zresetowania.

Więc odpowiadając na twoje pytanie - jeśli masz 5 commitów przed zdalną głowicą repozytorium, powinieneś uruchomić tę komendę:

git reset --hard HEAD~5

Zauważ, że stracisz wprowadzone zmiany, więc bądź ostrożnie!

 7
Author: Karol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 18:15:40

Jeśli chcesz wrócić do stanu HEAD zarówno dla katalogu roboczego, jak i indeksu, powinieneś git reset --hard HEAD, zamiast HEAD^. (Może to być literówka, podobnie jak pojedynczy kontra podwójny dash dla --hard.)

Jeśli chodzi o twoje konkretne pytanie, dlaczego te pliki pojawiają się w statusie jako zmodyfikowane, wygląda na to, że wykonałeś miękki reset zamiast twardego resetu. Spowoduje to, że pliki, które zostały zmienione w zatwierdzeniu HEAD, będą wyglądały tak, jakby były wystawione, co jest prawdopodobnie to, co tu widzisz.

 5
Author: Emil Sit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 02:10:21

Poprzednie odpowiedzi zakładają, że gałąź do zresetowania jest bieżącą gałęzią (sprawdzoną). W komentarzach op hap497 wyjaśniło, że branch jest rzeczywiście sprawdzony, ale nie jest to wyraźnie wymagane w pierwotnym pytaniu. Ponieważ istnieje co najmniej jedno pytanie "duplikat", Zresetuj gałąź całkowicie do stanu repozytorium , co nie zakłada, że gałąź jest sprawdzona, oto alternatywa:

Jeśli branch "mybranch" jest nie aktualnie Sprawdzony, to zresetuj go do zdalnej gałęzi "myremote/mybranch", możesz użyć komendy low-level:

git update-ref refs/heads/mybranch myremote/mybranch

Ta metoda pozostawia sprawdzoną gałąź w niezmienionym stanie, a działające drzewo nietknięte. Po prostu przenosi głowę mybrancha do innego commita, cokolwiek jest podane jako drugi argument. Jest to szczególnie przydatne, gdy wiele gałęzi wymaga aktualizacji do nowych głowic zdalnych.

Zachowaj ostrożność podczas robienia tego i użyj gitk lub podobnego narzędzia do podwójnego sprawdzania źródła i miejsce. Jeśli przypadkowo zrobisz to na bieżącej gałęzi (a git nie będzie cię od tego powstrzymywał), możesz się pomylić, ponieważ nowa zawartość gałęzi nie pasuje do działającego drzewa, które się nie zmieniło(aby naprawić, zaktualizuj gałąź ponownie, do miejsca, w którym była wcześniej).

 5
Author: Rainer Blome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:01

Żadna ilość resetowania i czyszczenia nie miała żadnego wpływu na nie śledzone i zmodyfikowane pliki w moim lokalnym repo git (próbowałem wszystkich opcji powyżej). Moim jedynym rozwiązaniem było rm lokalnego repo i ponowne sklonowanie go z pilota.

Na szczęście nie miałem innych oddziałów, na których mi zależało.

Xkcd: Git

 3
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 13:46:55

Jedynym rozwiązaniem, które działa we wszystkich przypadkach, które widziałem, jest usunięcie i ponowne usunięcie. Może jest inny sposób, ale oczywiście ten sposób nie pozostawia szans na pozostawienie starego stanu, więc wolę go. Bash one-liner możesz ustawić jako makro, jeśli często psujesz rzeczy w git:

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* zakłada Twoje .pliki git nie są uszkodzone

 0
Author: sudo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 05:59:06

Jeśli chcesz zresetować lokalną gałąź do najnowszego commita w gałęzi upstream, na razie działa mi to:

Sprawdź swoje piloty, upewnij się, że Twój upstream i origin są tym, czego oczekujesz, jeśli nie tak jak oczekiwałeś, użyj git remote add upstream <insert URL>, np. oryginalnego repo GitHub, z którego się rozwidlałeś, i/lub git remote add origin <insert URL of the forked GitHub repo>.

git remote --verbose

git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;

Lub:

git fetch upstream master;
git reset --hard upstream/master;
git clean -d --force;

Na GitHub, możesz również sprawdzić gałąź o tej samej nazwie, co lokalna, aby zapisać tam pracę, chociaż nie jest to konieczne, jeśli origin develop ma takie same zmiany jak lokalna gałąź saved-work. Jako przykład używam gałęzi develop, ale może to być dowolna istniejąca nazwa gałęzi.

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop

Następnie, jeśli chcesz połączyć te zmiany z inną gałęzią, gdy występują konflikty, zachowując zmiany w develop, użyj:

git merge -s recursive -X theirs develop

Podczas używania

git merge -s recursive -X ours develop

Aby zachować sprzeczne zmiany branch_name. W przeciwnym razie użyj mergetool z git mergetool.

Ze wszystkimi zmianami razem:

git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;

Zauważ, że zamiast upstream/develop możesz użyć skrótu zatwierdzania, innej nazwy gałęzi itp. Użyj narzędzia CLI, takiego jak Oh My Zsh, aby sprawdzić, czy Twoja gałąź jest zielona, co oznacza, że nie ma nic do zatwierdzenia, a katalog roboczy jest czysty (co jest potwierdzone lub możliwe do zweryfikowania przez git status). Zauważ, że może to w rzeczywistości dodawać commity w porównaniu do dewelopera, jeśli jest coś automatycznie dodane przez commit, np. diagramy UML, nagłówki licencji, itp., więc w takim razie, w razie potrzeby można przeciągnąć zmiany na origin develop do upstream develop.

 0
Author: James Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-16 04:59:23

Użyj reset --soft origin/ spowoduje to zresetowanie z powrotem do głowicy origin i da Ci możliwość pracy ze zmianami. można je wyrzucić lub

 0
Author: Bilal Hamid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 02:40:18

Jeśli nie masz nic przeciwko zapisaniu lokalnych zmian, ale nadal chcesz zaktualizować swoje repozytorium tak, aby pasowało do origin/HEAD, możesz po prostu ukryć swoje lokalne zmiany, a następnie wyciągnąć:

git stash
git pull
 -2
Author: Micah Walter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-10 13:49:19

Jeśli chcesz, aby bieżące zmiany zostały użyte później, Schowaj zmiany inne mądre można użyć tych dwóch poleceń,

git fetch origin
git reset --hard origin/master
 -5
Author: Sarang A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 12:51:05