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>

Riešenie

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ť:

 git reset --hard 
 git push -f origin master

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 vetvy master, možno budete musieť začať použitím git reset --hard ORIG_HEAD, aby ste vetvu presunuli tam, kde bola predtým. (Ako vždy pri git reset --hard sa uistite, že git status je čistý, že ste na správnej vetve a že viete o git reflog ako nástroji na obnovu zjavne stratených revízií). Mali by ste tiež skontrolovať, či ORIG_HEAD ukazuje na správnu revíziu, pomocou git 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úť.

Komentáre (12)

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:

  1. Nevykonávajte **žiadne obnovovanie.

  2. Pomocou git log nájdite hash revízie, na ktorej chcete, aby sa vzdialená revízia nachádzala. git log -p na zobrazenie zmien alebo git log --graph --all --oneline --decorate na zobrazenie kompaktného stromu. (Mať poslednú možnosť ako alias v shelli je veľmi praktické.)

  3. Skopírujte hash.

  4. Spustite príkaz ako napr:

     git push --force  :

    napr.

     git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
Komentáre (11)

Problém, ako je ten váš, som vyriešil pomocou týchto príkazov:

git reset --hard  
git push -f  : 
Komentáre (0)