Нулиране на дистанционното управление до определен ангажимент

Искам да отхвърля всички промени, направени след commit <commit-hash> . Затова направих:

git reset --hard <commit-hash>

Сега искам да направя същото с моето отдалечено устройство. Как мога да го направя? Направил съм няколко commit-а (и push-а) след <commit-hash> и искам просто да ги изхвърля всички. Дали просто нещо се е объркало ужасно по пътя и не искам да го влошавам повече, отколкото е. ;(

В общи линии искам да превъртя моя оригинал/мастър до <commit-hash>

Решение

Ако приемем, че клонът ви се нарича master както тук, така и отдалечено, и че отдалеченото ви клонче се нарича origin, можете да направите следното:

 git reset --hard 
 git push -f origin master

Трябва обаче да избягвате да правите това, ако някой друг работи с отдалеченото ви хранилище и е изтеглил вашите промени. В такъв случай би било по-добре да върнете ревизиите, които не искате, и след това да ги изпратите както обикновено.

Актуализация: По-долу сте обяснили, че други хора са изтеглили промените, които вие сте пуснали, така че е по-добре да създадете нов commit, който да върне всички тези промени. В този отговор от Jakub Narębski има хубаво обяснение на възможностите за това. Кой от тях е най-удобен, зависи от това колко коммита искате да върнете и кой метод има най-голям смисъл за вас.

Тъй като от въпроса ви става ясно, че вече сте използвали git reset --hard, за да върнете клона си master, може би ще трябва да започнете с използването на git reset --hard ORIG_HEAD, за да върнете клона си там, където е бил преди. (Както винаги при git reset --hard, уверете се, че git status е чист, че сте на правилния клон и че сте наясно с git reflog като инструмент за възстановяване на очевидно изгубени коммити.) Също така трябва да проверите дали ORIG_HEAD сочи към правилния commit с помощта на git show ORIG_HEAD.

Разследване на проблеми:

Ако получите съобщение от типа "! [remote rejected] a60f7d85 -> master (pre-receive hook declined)"

тогава трябва да разрешите презаписването на историята на клона за конкретния клон. В BitBucket например се казва "Пренаписването на историята на клона не е разрешено". Има квадратче за отметка, наречено Презаписване на историята на клона, което трябва да отбележите.

Коментари (12)

Използвайте другите отговори, ако нямате нищо против загубата на локални промени. Този метод все пак може да разруши отдалеченото ви устройство, ако изберете грешен хеш на предаването, към който да се върнете.

Ако просто искате отдалеченото устройство да съвпадне с коммит, който вече е в локалния клон:

  1. Не правете никакво нулиране.

  2. Използвайте git log, за да намерите хеша на ангажимента, който искате да бъде в отдалечения клон. git log -p, за да видите промените, или git log --graph --all --oneline --decorate, за да видите компактно дърво. (Да имате последното като псевдоним в шела си е много удобно.)

  3. Копирайте хеша.

  4. Изпълнете команда като:

     git push --force  :

    напр.

     git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
Коментари (11)

Реших проблем като вашия с помощта на тези команди:

git reset --hard  
git push -f  : 
Коментари (0)