Как да върнем хранилището на Git на предишния фиксиране

Как мога да се върна от текущо състояние към моментна снимка, направена с конкретно поправка?

Ако направя git log , получавам следния изход:

 $ git log commit a867b4af366350be2e7c21b8de9cc6504678a61b' Author: Me <me@me.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <me@me.com> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah... commit 0766c053c0ea2035e90f504928f8df3c9363b8bd Author: Me <me@me.com> Date: Thu Nov 4 00:55:06 2010 -0400 And yet more blah blah... commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 Author: Me <me@me.com> Date: Wed Nov 3 23:56:08 2010 -0400 Yep, more blah blah. 

Как да се върнем към фиксацията от 3 ноември, т.е. да се определи 0d1d7fc ?

6500
06 нояб. зададен от Crazy Serb 06 ноември. 2010-11-06 19:58 '10 в 19:58 2010-11-06 19:58
ответ 41 отговора
  • 1
  • 2

Това зависи много от това, което искаш да кажеш с "връщане".

Временно преминете към друго поправка.

Ако искате временно да се върнете към него, да се заблудите и да се върнете на мястото, където се намирате, трябва само да проверите желаната фиксация:

 # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. 

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

Отказът на публикуваните коммитира с новите постъпления

От друга страна, ако публикувате тази работа, вероятно няма да искате да нулирате клона, тъй като той ефективно пренаписва историята. В този случай наистина можете да върнете ангажимента. С Git, връщането има много специфично значение: създайте ангажимент, използвайки обратен кръпка, за да го отмените. Така че не пренапишете никаква история.

git-revert страницата с описанието git-revert manpage наистина покрива много от това.  Друга полезна връзка е секцията git-scm.com, която обсъжда git-revert . 

Ако решите, че не искате да се върнете в края, можете да върнете обратното (както е описано тук) или да се върнете преди да се върнете (вижте предишния раздел).

Можете да намерите този отговор и в този случай:
Как да преместите главата обратно към предишното място? (Отделна глава)

8356
06 нояб. Отговорът е даден от Cascabel 06 ноември. 2010-11-06 20:04 '10 в 20:04 2010-11-06 20:04

Връща работно копие до последното фиксиране

За да се върнете към предишния ангажимент, пренебрегвайки всички промени:

 git reset --hard HEAD 

където HEAD е последното поправка в текущата ви тема.

border=0

Връщане на работно копие на по-стар ангажимент

За да се върнете към фиксиране, което е по-голямо от последното фиксиране:

1396
21 авг. boulder_ruby отговори Aug 21 2012-08-21 09:19 '12 в 9:19 2012-08-21 09:19

Има много трудни и опасни отговори, но всъщност е лесно:

 git revert --no-commit 0766c053..HEAD git commit 

Това ще върне всичко от HEAD до hash commit, което означава, че той пресъздава това състояние на поемане в работното дърво, като че ли всяко връщане вече е било извършено. След това можете да поправите текущото дърво и то ще създаде изцяло нов фикс, по същество еквивалентен на фикса, който сте „върнали“.

(Флагът --no-commit позволява git да върне всички корекции по едно и също време - в противен случай ще бъдете помолени да изпратите съобщение за всеки ангажимент в диапазона, изхвърляйки историята си с ненужни нови ангажименти.)

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

1361
12 февр. отговорът е даден от Ярин на 12 февруари. 2014-02-12 07:18 '14 в 7:18 AM 2014-02-12 07:18

Най-добрият вариант за мен и може би за другите е опцията за нулиране на Git:

 git reset --hard <commidId>  git clean -f 

Това беше най-добрият вариант за мен! Тя е проста, бърза и ефективна!


Забележка: Както е споменато в коментарите, не правете това, ако споделяте вашия клон с други хора, които имат копия на стари коммити.

Също така от коментарите, ако искате да използвате по-малко "ballzy" метод, можете да използвате

git clean -i

173
22 окт. Отговорът е даден от Pogrindis на 22 октомври. 2013-10-22 14:53 '13 в 14:53 2013-10-22 14:53

Преди да отговорите, добавете малко фон, като обясните какво е HEAD .

First of all what is HEAD?

HEAD е просто препратка към текущия (последен) ангажимент в текущата нишка. По всяко време може да има само една HEAD (с изключение на git worktree ).

Съдържанието на HEAD съхранява вътре в .git/HEAD и съдържа 40 байта от SHA-1 на текущия фиксатор.


detached HEAD

Ако не използвате последното фиксиране, това означава, че HEAD сочи към предишния ангажимент в историята, той се нарича detached HEAD .

2019

06 февр. Отговорът е даден CodeWizard 06 февруари. 2015-02-06 00:56 '15 в 0:56 2015-02-06 00:56

Ако искате да овърклокнете, изтриете последното съобщение за поемане и поставите променените файлове в опашката, трябва да използвате командата:

 git reset --soft HEAD~1 
  • --soft показва, че отключените файлове трябва да се записват като работни файлове, срещу - --hard , които ги отхвърлят.
  • HEAD~1 - последно поправка. Ако искате да върнете 3 поправки, можете да използвате HEAD~3 . Ако искате да се върнете към определен номер на ревизия, можете да го направите и с помощта на SHA-хеш.

Това е изключително полезна команда в ситуации, в които сте извършили погрешно нещо и искате да отмените това последно.

Източник: http://nakkaya.com/2009/09/24/git-delete-last-commit/

116
04 марта '14 в 20:25 2014-03-04 20:25 Отговорът е даден от Stephen Ostermiller на 04.03.2014 г. в 20:25 2014-03-04 20:25

Опитах много начини да отменя локални промени в Git, и изглежда, че работи най-добре, ако просто искате да се върнете към последното състояние на фиксация.

 git add .  git checkout master -f 

Кратко описание:

  • Той няма да създава никакви коммити, тъй като git revert .
  • Той няма да откачи HEAD като git checkout <commithashcode> .
  • Той ще замени всичките ви локални промени и ще премахне всички добавени файлове след последното фиксиране в нишката.
  • Тя работи само с имената на клоновете, така че можете да се върнете към последното фиксиране само в клона.

Намерих много по-удобен и лесен начин за постигане на горепосочените резултати:

 git add .  git reset --hard HEAD 

където HEAD показва последното фиксиране в текущата нишка.

Това е същият код като boulder_ruby, но добавих git add . преди git reset --hard HEAD за изтриване на всички нови файлове, създадени след последното git reset --hard HEAD , тъй като това е, което повечето хора очакват, когато се върна към последния финал.

104
29 июля '12 в 14:01 2012-07-29 14:01 отговорът е даден на Roman Minenok 29 юли '12 в 14:01 ч. 2012-07-29 14:01

Можете да направите това със следните две команди:

 git reset --hard [previous Commit SHA id here] git push origin [branch Name] -f 

Тя ще премахне предишния Git ангажимент.

Ако искате да запазите промените си, можете също да използвате:

 git reset --soft [previous Commit SHA id here] 

След това ще запази промените ви.

90
12 дек. Отговорът е даден на kiran boghra 12 декември. 2014-12-12 09:52 '14 в 9:52 ч 2014-12-12 09:52

Да кажем, че в текстов файл с име ~/commits-to-revert.txt имате следните ~/commits-to-revert.txt (използвах git log --pretty=oneline )

 fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219 0c27ecfdab3cbb08a448659aa61764ad80533a1b f85007f35a23a7f29fa14b3b47c8b2ef3803d542 e9ec660ba9c06317888f901e3a5ad833d4963283 6a80768d44ccc2107ce410c4e28c7147b382cd8f 9cf6c21f5adfac3732c76c1194bbe6a330fb83e3 fff2336bf8690fbfb2b4890a96549dc58bf548a5 1f7082f3f52880cb49bc37c40531fc478823b4f5 e9b317d36a9d1db88bd34831a32de327244df36a f6ea0e7208cf22fba17952fb162a01afb26de806 137a681351037a2204f088a8d8f0db6e1f9179ca 

Създайте скрипт на bash shell, за да върнете всеки от тях:

55
14 окт. отговорът е даден от Ланс Карачоли 14 октомври. 2011-10-14 00:51 '11 в 0:51 2011-10-14 00:51

Допълнителни алтернативи на решенията на Jefromi

Решенията на Jefromi определено са най-добрите и определено трябва да ги използвате. Въпреки това, за пълнота, аз също исках да покажа тези други алтернативни решения, които също могат да бъдат използвани за връщане на коммитиране (в смисъл, че създавате нов ангажимент, който променя промените в предишния ангажимент, както ги git revert ).

За да бъде ясно, тези алтернативи не са най-добрият начин да се върнете към решението за ангажиране , Jefromi , но просто искам да посоча , че можете да използвате и тези други методи, за да постигнете същото ниво като git revert .

Алтернатива 1: Твърдо и меко нулиране

Дали това е много леко модифицирана версия на решението на Чарлз Бейли за връщане на SHA-хеш към Git? :

53
29 июня '14 в 20:51 2014-06-29 20:51 отговорът е даден от user456814 29 юни '14 в 20:51 2014-06-29 20:51

Тук нямаше нищо, освен тази точна комбинация:

 git reset --hard <commit_hash> git push origin <branch_name> --force 

Ключът тук е принудително натискане, без допълнителни съобщения за фиксиране / фиксиране и т.н.

53
13 февр. отговорът е даден на 13 февруари . 2018-02-13 01:40 '18 в 1:40 2018-02-13 01:40

Ето един много по-лесен начин да се върнете към предишния ангажимент (и да го направите в неуправлявано състояние, направете каквото искате с него):

 git reset HEAD~1 

Така че няма нужда да се определят идентификаторите и т.н. :)

50
29 февр. отговорът е даден от Пол Валчевски на 29 февруари. 2016-02-29 11:40 '16 в 11:40 2016-02-29 11:40

Добре, обратно към предишния ангажимент в git е доста просто ...

Възстановяване без запазване на промените:

 git reset --hard <commit> 

Върнете се назад и запазете промените:

 git reset --soft <commit> 

Обяснете, че използвайки git reset, можете да върнете към определено състояние, обикновено с хеш от ангажименти, както видяхте по-горе.

Но, както виждате, разликата е в използването на двата флага --soft и --hard , по подразбиране е git reset използвайки --soft флаг, но винаги се препоръчва да се използва този флаг, обяснявам всеки флаг:


--soft

Флагът по подразбиране, както е обяснено, не изисква да бъде предоставен, не променя работното дърво, но добавя всички готови за извършване на промени файлове, така че се връщате в състоянието на фиксация, в което промените във файла стават непроменени.


--hard

Бъдете внимателни с този флаг, той нулира работното дърво и всички промени в контролираните файлове изчезват!


Също така създадох изображение под това, което може да се случи в реалния живот, докато работя с git:

2019

Ако приемем, че говорите за хоста и в съответния клон (това подсказва, че може да бъде всеки клон, за който се тревожите):

 # Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master 

Намерих отговора от пощата в блога Изтриване на отдалечено хранилище Git за конкретен ангажимент .

45
10 мая '16 в 20:21 2016-05-10 20:21 отговор, даден на markreyes 10 май '16 в 20:21 2016-05-10 20:21

След всички промени, когато натиснете всички тези команди, може да се наложи да използвате:

 git push -f ... 

И не само с git push .

34
05 сент. отговорът се дава от sivi 05 sep . 2013-09-05 17:03 '13 в 17:03 2013-09-05 17:03

Има команда (не част от ядрото на Git, но тя е в пакета git-extras ) специално за връщане и изпълнение на стари коммити:

 git back 

На страницата на човека тя може да се използва и като такава:

 # Remove the latest three commits git back 3 
32
08 авг. отговорът е даден от Shadow Man 08 aug. 2013-08-08 21:30 '13 в 21:30 2013-08-08 21:30

Върнете се към последното фиксиране и игнорирайте всички местни промени:

 git reset --hard HEAD 
27
26 июля '16 в 16:13 2016-07-26 16:13 Отговор е даден от Mohammed Irfan Tirupattur на 26 юли 16 в 16:13 2016-07-26 16:13

Изберете необходимия фиксатор и го проверете.

 git show HEAD git show HEAD~1 git show HEAD~2 

докато не получите желаната фиксация. За да накарате HEAD да посочи това, направете го

 git reset --hard HEAD~1 

или git reset --hard HEAD~2 или нещо друго.

26
26 февр. отговорът е даден tonythomas01 26 фев. 2014-02-26 15:52 '14 в 15:52 2014-02-26 15:52

Можете сами да изпълните тези първоначални стъпки и да се върнете към git-repo.

  1. Издърпайте последната версия на хранилището от Bitbucket, като използвате командата git pull --all .

  2. Изпълнете командата git log с -n 4 от вашия терминал. Числото след -n определя броя на корекциите в дневника, като се започва с последното фиксиране в локалната ви история.

    $ git log -n 4

  3. Нулиране git reset --hard HEAD~N историята на хранилището ви с git reset --hard HEAD~N където N е броят на коммитиранията, които искате да върнете. В следващия пример главата ще бъде настроена на една фиксация, последната фиксация в историята на хранилището:

  4. Кликнете върху промяна в git git push --force с git push --force да накарате промяна.

Ако искате git хранилището да има предишен ангажимент

 git pull --all git reset --hard HEAD~1 git push --force 
24
06 апр. Отговор, даден от Nanhe Kumar на 06 април 2017-04-06 15:20 '17 в 15:20 2017-04-06 15:20

Това е друг метод за директно нулиране за скорошен ангажимент.

 git stash git stash clear 

Той премахва директно всички промени, които сте направили след последното фиксиране.

PS: Той има малък проблем; също така изтрива всички наскоро запазени промени в кеша. Мисля, че в повечето случаи няма значение.

20
05 мая '16 в 14:43 2016-05-05 14:43 отговорът е даден от Point Networks 05 май '16 в 14:43 2016-05-05 14:43

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

 git add -A . git reset --hard HEAD 

Просто git reset --hard HEAD се отърве от промените, но няма да се отърве от "новите" файлове. В техния случай те случайно повлечеха някаква важна папка и всички тези файлове бяха третирани като нови с Git, така че reset --hard не го поправи. Работещ git add -A . предварително, той изрично ги проследи с Git, който беше унищожен с нулиране.

20
11 окт. Отговор, даден от Крис Москини на 11 октомври 2015-10-11 03:10 '15 в 3:10 2015-10-11 03:10

За да запишете промените от предишна ангажираност в HEAD и да преминете към предишното фиксиране, изпълнете:

 git reset <SHA> 

Ако не са необходими промени от предишния ангажимент към HEAD и просто отхвърлите всички промени, изпълнете следните стъпки:

 git reset --hard <SHA> 
20
28 июля '15 в 11:35 2015-07-28 11:35 отговорът е даден от Vishnu Atrai 28 юли '15 в 11:35 2015-07-28 11:35

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

 git reset --hard origin/master 

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

19
05 февр. отговорът е даден на nevster 05 feb . 2015-02-05 04:28 '15 в 4:28 2015-02-05 04:28

Revert е команда за коммитиране.

 git revert <commit1> <commit2> 

например:

git revert 2h3h23233

Той е в състояние да получи диапазон от главата, както е показано по-долу. Тук 1 казва: "Върни последното поправка."

git revert HEAD~1..HEAD

и след това направете git push

16
20 авг. отговор, даден от Sireesh Yarlagadda 20 август. 2015-08-20 17:45 '15 в 17:45 ч. 2015-08-20 17:45

Възстановяване на най-скорошните съобщения:

 git reset --hard HEAD 

HEAD е просто препратка към текущия (последен) ангажимент в текущата нишка. По всяко време може да има само една HEAD .

Върнете се към по-старата команда: най-бързият начин да възстановите старата версия е да използвате командата за reset :

 # Resets index to former commit git reset 56e05fced # Moves pointer back to previous HEAD git reset --soft HEAD@{1} # Updates working copy to reflect the new commit git reset --hard 

Това пренавива клона ви HEAD до посочената версия. Всички корекции, които се появяват след тази версия, всъщност са отменени; Вашият проект е точно същият като този в момента.

Командата за нулиране има няколко опции, като един от най-интересните е --soft . Ако го използвате вместо --hard , Git ще запази всички промени в тези "отменени" като местни промени.

Възстановяване на версия в нов местен клон

Както вече казахме, използването на командата reset на вашия HEAD клон е доста радикално действие: то ще премахне всички коммити (в този клон), които се появиха след определената ревизия. Ако сте сигурни, че това е, което искате, всичко е наред.

Обаче има и по- безопасен начин, ако решите да оставите текущия си клон на HEAD незасегнат. Тъй като „клоновете“ са толкова евтини и лесни в Git, лесно можем да създадем нов клон, който започва с тази стара версия:

 git checkout -b old-project-state 0ad5a7a6 

Обикновено командата checkout се използва за просто превключване на клонове. Въпреки това, като предоставите опцията -b, можете също да създадете нов клон (в този пример, старото състояние на проекта). Ако не искате тя да започне с текущата версия на HEAD, трябва да предоставите и хеш-корекция - старата редакция на проекта, който искаме да възстановим.

Сега имате нов клон, наречен old-project-state, отразяващ старата версия на вашия проект - без да докосвате или дори да изтривате други коммити или клонове.

14
31 авг. отговор, даден на Lyes CHIOUKH 31 август. 2018-08-31 14:08 '18 в 14:08 ч. 2018-08-31 14:08

Если ситуация срочная , и вы просто хотите сделать то, что задал вопросник, быстрым и грязным способом, предполагая, что ваш проект находится в каталоге "мой проект":