'Гиты қалпына келтіру' - алдыңғы тапсырмаға оралу үшін қалай пайдалануға болады?

Менің түсінуім бойынша, Гит өзіме енгізген өзгертулерді қадағалап отыратындығын білемін және оларды өзгерткенге дейін оларды ұстап отырамын,

Мен бұрынғы міндеттемеге оралғым келгенде, мен:

 git reset --hard HEAD 

Және гитара қайтарады:

 HEAD is now at 820f417 micro 

Қатты дискідегі файлдарды бұрынғы тапсырмаға қалай қайтаруға болады?

Менің келесі қадамдарым:

 git add . git commit -m "revert" 

Бірақ қатты дискідегі файлдардың ешқайсысы өзгерген жоқ ...

Мен не істеп жатырмын?

735
02 марта '12 в 9:36 2012-03-02 09:36 Brian McDonough құрастырған 02 наурыз '12 сағат 9:36 2012-03-02 09:36
@ 2 жауаптар

Ең алдымен, git reset --hard әрдайым атап git reset --hard - git reset --hard - ықтимал қауіпті пәрмен, себебі ол сіздің барлық өзгеріссіз өзгерістеріңізді алып тастайды. Қауіпсіздік мақсатында, сіз оны пайдалану алдында git status шығарылымы таза екеніне әрқашан сенімді болуыңыз керек (яғни, бос).

Алдымен мынаны айтыңыз:

Сондықтан мен Git-тегі қолданыстағы өзгерістерді бақылап отырамын және өзгерістер енгізгенше әрекет етемін, бірақ мұнда:

Бұл дұрыс емес. Git файлдарды жай ғана жазады (оларды git add ) немесе міндеттеме жасағанда. Жоба файлдары белгілі бір күйде болатын міндеттеме жасағаннан кейін, олар өте қауіпсіз, бірақ сол уақытқа дейін Git файлдарыңыздағы өзгерістерді бақыламады. (Мысалы, егер файлды жаңа нұсқасын жасау үшін git add , ол дайындық аймағында осы файлдың бұрын дайындалған нұсқасын қайта жазады.)

Сіздің сұрағыңызда мынаны сұраңыз:

Мен бұрынғы міндеттемеге оралғым келгенде, мен пайдаланамын: git reset - хард HEAD And go қайтарады: HEAD енді 820f417 micro

Қатты дискідегі файлдарды бұрынғы тапсырмаға қайдан алуға болады?

Егер сіз git reset --hard <SOME-COMMIT> онда Git болады:

  • Ағымдық бөліміңізді (әдетте master ) <SOME-COMMIT> нүктесіне айналдырыңыз.
  • Содан кейін, файлдарды жұмыс ағашында және индексінде («айқындама аймағы») <SOME-COMMIT> -де жазылған нұсқалармен бірдей етіп жасаңыз.

HEAD ағымдағы филиалға (немесе ағымдағы тапсырмаға) git reset --hard HEAD , сондықтан бәрі өтіп git reset --hard HEAD сіздің барлық өзгертілмеген өзгерістеріңізді git reset --hard HEAD .

Мысалы, қайтып оралғыңыз келетін жақсы міндеттеме - бұл f414f31 . (Сіз оны git log немесе кез келген тарих шолғышынан таба аласыз). Сонда сіз не істегіңіз келетініне байланысты бірнеше түрлі нұсқаларыңыз бар:

  • Оның орнына ескі міндеттемені көрсету үшін ағымдағы тармақты өзгертіңіз. Сіз оны git reset --hard f414f31 . Дегенмен, бұл сіздің жіптің тарихын қайта жазады, сондықтан сіз бұл ағынмен кез келген адаммен бөліссеңіз, оны болдырмау керек. Бұдан басқа, f414f31 кейін жасаған міндеттемелер сіздің master f414f31 тарихында болмайды.
  • f414f31 сияқты бірдей жоба күйін білдіретін жаңа міндеттеме жасаңыз, бірақ әңгімеге қосып, оқиғадан айырылып f414f31 . Сіз мұны осы жауапта ұсынылған қадамдарды қолдана отырып жасай аласыз - мысалы:

     git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 
846
02 марта '12 в 11:32 2012-03-02 11:32 Марк Лонгайр жауап берді 02.03.12 11:32 2012-03-02 11:32

НАЗАР АУДАРЫҢЫЗ: git clean -f сақталмаған файлдарды өшіреді, яғни олар мәңгіге жоғалып кеткендіктен, олар репозиторийде сақталмайды. Мұны орындамас бұрын, барлық трекке алынбаған файлдарды шынымен жойғыңыз келетініне көз жеткізіңіз.


Бұл әрекетті байқап көріңіз және git clean -f .

border=0

git reset --hard емес файлдарды жоймайды, ал git-clean Git қадағалауының астында орналасқан қадағаланатын түбірлік каталогтан кез-келген файлдарды жояды.

Балама түрде, @Paul Betts айтқандай, мұны жасай аласыз (бірақ сақ болыңыз - бұл барлық еленбейтін файлдарды да жояды)

  • git clean -df
  • git clean -xdf НАЗАР АУДАРЫҢЫЗ! Бұл сондай-ақ елемей қалған файлдарды алып тастайды.
170
02 марта '12 в 9:48 2012-03-02 09:48 жауап 02 қараша '12 уақыт 09:48 2012-03-02 09:48 берілген

тегтері туралы басқа сұрақтарға немесе Сұрақ қойыңыз