Git, jak zresetować origin / master do zatwierdzenia?

245

Zresetowałem mojego lokalnego wzorca do zatwierdzenia za pomocą tego polecenia:

git reset --hard e3f1e37

kiedy wprowadzę $ git statuspolecenie, terminal mówi:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Ponieważ chcę zresetować także origin / nagłówek, kasuję do origin / master:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

i zresetuj nagłówek za pomocą tego polecenia:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Następnie próbowałem dodać zatwierdzenie do źródła / nagłówka, że ​​nie udało mi się.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Wreszcie, kasę do mojego lokalnego mistrza.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Ponieważ zresetowałem szefa źródła / wzorca, oczekuję, że lokalny i pochodzenie powinny być w tym samym kierunku, ale jak widzisz, git mówi, że mój lokalny / wzorzec jest za początkiem / wzorzec o 7 zatwierdzeń.

Jak mogę rozwiązać ten problem? To, czego szukam, to szef local / master i origin / master wskazują na to samo zatwierdzenie. Poniższy obraz pokazuje, co zrobiłem. Dzięki.

wprowadź opis zdjęcia tutaj

Hesam
źródło
Przede wszystkim upewnij się, że możesz wymusić kod push do chronionego oddziału w swoim projekcie, w przeciwnym razie nie będziesz w stanie ...
DarmVillegas

Odpowiedzi:

563

origin/xxxgałęzie są zawsze wskaźnikiem do pilota. Nie możesz ich wyrejestrować, ponieważ nie są one wskaźnikiem do lokalnego repozytorium (pobierasz tylko zatwierdzenie. Dlatego nie zobaczysz nazwy zapisanej w znaczniku gałęzi interfejsu wiersza poleceń, a jedynie skrótu zatwierdzenia).

To, co musisz zrobić, aby zaktualizować pilota, to wymusić wypchnięcie lokalnych zmian w celu opanowania:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master
Simon Boudrias
źródło
9
wykonuje żądaną operację, ale należy pamiętać, że spowoduje to niezadowolenie osób, które już pobrały zatwierdzenia od mistrza.
mnagel
Postępowałem zgodnie z tymi krokami i wycofał się. Ale źródło / HEAD wskazuje teraz na gałąź inną niż master. Co mogę zrobić, aby to naprawić?
Daniil Shevelev,
1
Nie powinieneś przejmować się pochodzeniem / HEAD, po prostu
weź
Zgodził się, musiał to zrobić dzisiaj po przypadkowym połączeniu niewłaściwych gałęzi ze sobą, a następnie popchnięciu do źródła. Działa dobrze, ale może być bardzo destrukcyjne, jeśli inne osoby sprawdzą oddziały, których to dotyczy, od pochodzenia. Używaj ostrożnie.
Nick W.,
1
Nie działa remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0
52

Znalezione tutaj rozwiązanie pomogło nam zaktualizować wzorzec do poprzedniego zatwierdzenia, które już zostało wypchnięte:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

Kluczową różnicą w stosunku do przyjętej odpowiedzi jest skrót zatwierdzenia „e3f1e37:” przed master w poleceniu push.

jkovacs
źródło
1
Nie działa:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0
@ m0skit0 jak mówi wiadomość you should pull first:)
intuitivepixel
Odpowiedź na to jest na stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falseale tak naprawdę ustawiłem to ręcznie w moim lokalnym repozytorium git, /opt/gitktóre utworzyłem, aby bawić się pomysłami tutaj. Nie jestem pewien, jak i czy można to zrobić dla bitbucket, github itp. I @intuitivepixel, co jest bezcelowe, ponieważ odwraca to, co próbujesz osiągnąć przy twardym resecie.
HankCa
Cześć @jkovacs, Nie chcę, aby nowe zmiany w Master były usuwane. Chcę tylko przekazać ten hash zatwierdzania „e3f1e37” do źródła master. Czy jest to możliwe, pomijając drugą komendę git reset --hard "e3f1e37"?
KarenAnne,
Cześć @jkovacs, właśnie potwierdziłem, że mogę pominąć drugi krok. :)
KarenAnne,
2

Zakładając, że twoja gałąź jest wywoływana masterzarówno tutaj, jak i zdalnie, i że twój pilot jest nazywany, originmożesz:

git reset --hard <commit-hash>
git push -f origin master

Należy jednak tego unikać, jeśli ktoś inny pracuje ze zdalnym repozytorium i wyciągnął zmiany. W takim przypadku lepiej cofnąć niepotrzebne zmiany, a następnie wcisnąć jak zwykle.

Mahmoud Zaher
źródło
1

Ponieważ miałem podobną sytuację, pomyślałem, że podzielę się swoją sytuacją i jak te odpowiedzi mi pomogły (dziękuję wszystkim).

Postanowiłem więc pracować lokalnie, zmieniając moje ostatnie zatwierdzenie za każdym razem, gdy chciałem zapisać swoje postępy w głównej gałęzi (wiem, że powinienem był rozgałęzić się, zaangażować się w to, dalej naciskać, a później połączyć się z powrotem do master).

Pewnej późnej nocy, w paranoicznym strachu przed utratą postępów w awarii sprzętu lub czegoś poza eterem, postanowiłem popchnąć mistrza do pochodzenia. Później ciągle zmieniałem swój lokalny oddział główny i kiedy zdecydowałem, że nadszedł czas, aby przejść dalej, miałem do czynienia z różnymi gałęziami głównymi i odkryłem, że nie mogę zmienić źródła / wyższego poziomu ( duh! ), Tak jak mogę lokalne gałęzie rozwoju.

Więc nie zameldowałem się lokalnie, ponieważ już byłem po zatwierdzeniu. Mistrz pozostał niezmieniony. Nie musiałem nawet resetować - twardo, moje obecne zatwierdzenie było OK.

Po prostu wymusiłem push do początku, nawet nie określając, jakie zobowiązanie chciałem wymusić na mistrzu, ponieważ w tym przypadku jest to cokolwiek HEAD. Sprawdzone, git diff master..origin/masterwięc nie było żadnych różnic i to wszystko. Wszystko naprawione. Dzięki! (Wiem, jestem początkującym, proszę wybaczyć!).

Więc jeśli już masz lokalną gałąź główną, po prostu:

git push --force origin master
git diff master..origin/master
Paul-Sebastian Manole
źródło