Як вярнуць рэпазітар 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

Гэта моцна залежыць ад таго, што вы разумееце пад "revert".

Часова пераключыцеся на іншую фіксацыю

Калі вы хочаце часова вярнуцца да яго, падмануць сябе, а затым вярнуцца туды, дзе вы знаходзіцеся, усё, што вам трэба зрабіць, гэта праверыць жаданую фіксацыю:

 # 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. work you want to keep # 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 revert мае вельмі спецыфічнае значэнне: стварыце фіксацыю з дапамогай зваротнага патча, каб адмяніць яе. Такім чынам, вы не перапісваеце якую-небудзь гісторыю.

git-revert manpage сапраўды пакрывае шмат гэтага ў апісанні.  Яшчэ адна карысная спасылка - гэта раздзел git-scm.com, у якім абмяркоўваецца git-revert . 

Калі вы вырашыце, што не хочаце вяртацца ў рэшце рэшт, вы можаце вярнуць рэверс (як апісана тут) або вярнуць назад да вяртання (гл. Папярэдні падзел).

Вы таксама можаце знайсці гэты адказ карысным у гэтым выпадку:
Як перамясціць HEAD назад у папярэдняе месца? (Асобная галоўка)

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 21 жнів. 2012-08-21 09:19 '12 у 09:19 2012/08/21 09:19

Тут шмат складаных і небяспечных адказаў, але на самой справе гэта лёгка:

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

Гэта верне ўсе, пачынаючы з HEAD, да хэша commit, што азначае, што яно узнаўляе гэты стан фіксацыі ў працоўным дрэве, як калі б кожная фіксацыя з тых часоў была вернутая. Затым вы можаце зафіксаваць бягучае дрэва, і яно створыць зусім новую фіксацыю, істотна эквівалентную фіксацыі, якую вы "вярнулі".

(Сцяг --no-commit дазваляе git вяртаць усё камітаў адначасова - у адваротным выпадку вам будзе прапанавана адправіць паведамленне для кожнай фіксацыі ў дыяпазоне, засмечваючы вашу гісторыю непатрэбнымі новымі камітаў.)

Гэта бяспечны і просты спосаб адкату ў папярэдняе стан. Ніякая гісторыя не знішчаецца, таму яе можна выкарыстоўваць для камітаў, якія ўжо былі апублікаваныя.

1361
12 февр. адказ дадзены Yarin 12 февр. 2014-02-12 07:18 '14 у 7:18 2014/02/12 07:18

Лепшым варыянтам для мяне і, магчыма, для іншых з'яўляецца опцыя Git reset:

 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 сакавіка '14 у 20:25 2014/03/04 20:25

Я спрабаваў шмат спосабаў адмяніць лакальныя змены ў Git, і здаецца, што гэта працуе лепш за ўсё, калі вы проста хочаце вярнуцца да апошняга стане фіксацыі.

 git add .  git checkout master -f 

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

  • Ён не будзе ствараць ніякіх камітаў, як гэта робіць git revert .
  • Ён не будзе адлучаць ваш галава, як git checkout <commithashcode> .
  • Ён перакрые ўсе вашы лакальныя змены і выдаліць усе дададзеныя файлы з моманту апошняга фіксацыі ў галінцы.
  • Ён працуе толькі з імёнамі галін, таму вы можаце вярнуцца толькі да апошняга фіксацыі ў галінцы такім чынам.

Я знайшоў значна больш зручны і просты спосаб дасягнення вынікаў, прыведзеных вышэй:

 git add .  git reset --hard HEAD 

дзе HEAD паказвае на апошнюю фіксацыю ў вашай бягучай галінцы.

Гэта той жа код, што і boulder_ruby, але я дадаў git add . да 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 у 09:52 2014/12/12 09:52

Скажам, у вас ёсць наступныя камітаў у тэкставым файле з імем ~/commits-to-revert.txt (я выкарыстаў git log --pretty=oneline для іх атрымання)

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

Стварыце Bash абалонку script для вяртання кожнага з іх:

55
14 окт. адказ дадзены Lance Caraccioli 14 каст. 2011-10-14 00:51 '11 у 0:51 2011-10-14 00:51

Дадатковыя альтэрнатывы рашэнням Jefromi

Jefromi solutions , безумоўна, лепшыя, і вы абавязкова павінны іх выкарыстоўваць. Аднак, для паўнаты, я таксама хацеў паказаць гэтыя іншыя альтэрнатыўныя рашэнні, якія таксама могуць быць выкарыстаны для вяртання фіксацыі (у тым сэнсе, што вы ствараеце новы комм, які адмяняе змены ў папярэднім commit як гэта робіць git revert ).

Каб быць яснымі, гэтыя альтэрнатывы - гэта не лепшы спосаб вярнуць фіксацыі, рашэнні Jefromi , але я проста хачу паказаць што вы таксама можаце выкарыстоўваць гэтыя іншыя метады для дасягнення таго ж узроўня, што і git revert .

Альтэрнатыва 1: Жорсткая і мяккі скід

Гэта вельмі няшмат змененая версія рашэння Charles Bailey для Вярнуць фіксацыю 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 февр. адказ дадзены serdarsenay 13 февр. 2018-02-13 01:40 '18 у 01:40 2018/02/13 01:40

Вось значна больш просты спосаб вярнуцца да папярэдняга фіксацыі (і мець яго ў некіравальным стане, рабіць з ім усё, што вам падабаецца):

 git reset HEAD~1 

Такім чынам, няма неабходнасці ў фіксацыі ідэнтыфікатараў і г.д. :)

50
29 февр. адказ дадзены Paul Walczewski 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 ID # 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 ID # 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 сент. 2013-09-05 17:03 '13 у 17:03 2013/09/05 17:03

Існуе каманда (не частка ядра Git, але яна знаходзіцца ў пакеце git-extras ) адмыслова для вяртання і выканання старых камітаў:

 git back 

На старонцы man яна таксама можа выкарыстоўвацца як такая:

 # Remove the latest three commits git back 3 
32
08 авг. адказ дадзены Shadow Man 08 жнів. 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 паказваць на гэта, do

 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-РЭПО.

  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 repo з дапамогай 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

Гэта яшчэ адзін спосаб прамога reset для нядаўняга фіксацыі

 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, які быў знішчаны з дапамогай reset.

20
11 окт. адказ дадзены Chris Moschini 11 каст. 2015-10-11 03:10 '15 у 03: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 февр. 2015-02-05 04:28 '15 у 04:28 2015/02/05 04:28

Revert - гэта каманда адкат камітаў.

 git revert <commit1> <commit2> 

прыклад:

git revert 2h3h23233

Ён здольны прымаць дыяпазон ад HEAD, як паказана ніжэй. Тут 1 кажа: "Вярніце апошнюю фіксацыю".

git revert HEAD~1..HEAD

а затым Do git push

16
20 авг. адказ дадзены Sireesh Yarlagadda 20 жнів. 2015-08-20 17:45 '15 у 17:45 2015/08/20 17:45

Revert Most Recent Commit:

 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 складнікаў азначанай версію. Усе фіксацыі, якія з'явіліся пасля гэтай версіі, фактычна адменены; ваш праект сапраўды гэтак жа, як і ў той момант.

Каманда reset мае некалькі опцый, адзін з найбольш цікавых - сцяг --soft . Калі вы выкарыстоўваеце яго замест --hard , Git захавае ўсе змены ў гэтых "адмененых" у якасці лакальных змяненняў.

Аднаўленне версіі ў новым лакальным філіяле

Як сказана, выкарыстанне каманды скіду на вашай галінцы 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

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

  1. Скапіруйце ўвесь каталог і назавіце яго як-небудзь яшчэ, напрыклад, "мой праект - копія".

  2. рабіць:

     git reset --hard [first-4-letters> 

Затым у вас ёсць дзве версіі ў вашай сістэме ... вы можаце праглядаць, капіяваць або змяняць файлы, якія прадстаўляюць інтарэс, ці нешта яшчэ з папярэдняга камітаў. Вы можете полностью удалить файлы в разделе "Мой проект - копия", если решили, что новая работа никуда не денется...