Нулиране на дистанционното управление до определен ангажимент
Искам да отхвърля всички промени, направени след commit <commit-hash>
.
Затова направих:
git reset --hard <commit-hash>
Сега искам да направя същото с моето отдалечено устройство. Как мога да го направя? Направил съм няколко commit-а (и push-а) след <commit-hash>
и искам просто да ги изхвърля всички. Дали просто нещо се е объркало ужасно по пътя и не искам да го влошавам повече, отколкото е. ;(
В общи линии искам да превъртя моя оригинал/мастър
до <commit-hash>
629
3
Ако приемем, че клонът ви се нарича
master
както тук, така и отдалечено, и че отдалеченото ви клонче се наричаorigin
, можете да направите следното:Трябва обаче да избягвате да правите това, ако някой друг работи с отдалеченото ви хранилище и е изтеглил вашите промени. В такъв случай би било по-добре да върнете ревизиите, които не искате, и след това да ги изпратите както обикновено.
Актуализация: По-долу сте обяснили, че други хора са изтеглили промените, които вие сте пуснали, така че е по-добре да създадете нов 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 например се казва "Пренаписването на историята на клона не е разрешено". Има квадратче за отметка, наречено
Презаписване на историята на клона
, което трябва да отбележите.Използвайте другите отговори, ако нямате нищо против загубата на локални промени. Този метод все пак може да разруши отдалеченото ви устройство, ако изберете грешен хеш на предаването, към който да се върнете.
Ако просто искате отдалеченото устройство да съвпадне с коммит, който вече е в локалния клон:
Не правете никакво нулиране.
Използвайте
git log
, за да намерите хеша на ангажимента, който искате да бъде в отдалечения клон.git log -p
, за да видите промените, илиgit log --graph --all --oneline --decorate
, за да видите компактно дърво. (Да имате последното като псевдоним в шела си е много удобно.)Копирайте хеша.
Изпълнете команда като:
напр.
Реших проблем като вашия с помощта на тези команди: