Viac na
Obnovenie diaľkového ovládania na určitú revíziu
Chcem zahodiť všetky zmeny vykonané po revízii <commit-hash>
.
Tak som urobil:
git reset --hard <commit-hash>
Teraz chcem urobiť to isté s mojím vzdialeným. Ako to môžem urobiť? Urobil som niekoľko revízií (a pushov) po <commit-hash>
a chcem ich jednoducho všetky zahodiť. Je proste niečo strašne pokazené na ceste a nechcem to robiť horšie, ako to už je ;(.
V podstate chcem preklopiť svoj origin/master
na <commit-hash>
629
3
Za predpokladu, že vaša vetva sa volá
master
tu aj na diaľku a že vaša vzdialená vetva sa voláorigin
, môžete urobiť:Tomuto postupu by ste sa však mali vyhnúť, ak niekto iný pracuje s vaším vzdialeným repozitárom a stiahol vaše zmeny. V takom prípade by bolo lepšie vrátiť revízie, ktoré nechcete, a potom ich normálne odoslať.
Aktualizácia: Nižšie ste vysvetlili, že ostatní ľudia stiahli zmeny, ktoré ste posunuli, takže je lepšie vytvoriť novú revíziu, ktorá vráti všetky tieto zmeny. V tejto odpovedi od Jakuba Narębského je pekne vysvetlené, aké máte možnosti, ako to urobiť. Ktorá z nich je najvhodnejšia, závisí od toho, koľko revízií chcete vrátiť a ktorá metóda vám dáva najväčší zmysel.
Keďže z vašej otázky je'jasné, že ste už použili
git reset --hard
na resetovanie vetvymaster
, možno budete musieť začať použitímgit reset --hard ORIG_HEAD
, aby ste vetvu presunuli tam, kde bola predtým. (Ako vždy prigit reset --hard
sa uistite, žegit status
je čistý, že ste na správnej vetve a že viete ogit reflog
ako nástroji na obnovu zjavne stratených revízií). Mali by ste tiež skontrolovať, čiORIG_HEAD
ukazuje na správnu revíziu, pomocougit show ORIG_HEAD
.Riešenie problémov:
Ak sa zobrazí správa typu "! [remote rejected] a60f7d85 -> master (pre-receive hook declined)"
potom musíte povoliť prepisovanie histórie vetiev pre konkrétnu vetvu. V BitBucket to napríklad hovorí "Prepisovanie histórie vetvy nie je povolené". Je tam zaškrtávacie políčko s názvom
Povoliť prepisovanie histórie vetvy
, ktoré musíte zaškrtnúť.Použite iné odpovede, ak vám nevadí, že stratíte lokálne zmeny. Táto metóda môže aj tak zničiť váš vzdialený súbor, ak si vyberiete nesprávny hash revízie, ku ktorému sa chcete vrátiť.
Ak chcete len dosiahnuť, aby sa vzdialený súbor zhodoval s revíziou, ktorá'sa už nachádza vo vašej lokálnej vetve:
Nevykonávajte **žiadne obnovovanie.
Pomocou
git log
nájdite hash revízie, na ktorej chcete, aby sa vzdialená revízia nachádzala.git log -p
na zobrazenie zmien alebogit log --graph --all --oneline --decorate
na zobrazenie kompaktného stromu. (Mať poslednú možnosť ako alias v shelli je veľmi praktické.)Skopírujte hash.
Spustite príkaz ako napr:
napr.
Problém, ako je ten váš, som vyriešil pomocou týchto príkazov: