Як адмяніць лакальную фіксацыю git

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

  git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README # no changes added to commit (use "git add" and/or "git commit -a") git add README git commit -a -m 'To add new line to readme' 

Я не націскаў код на github, цяпер я хачу адмяніць гэтае комм.

Для гэтага я выкарыстаў

  git reset --hard HEAD~1 

Але я страціў нядаўна дабаўленую радок "гэта для маёй тэставай лініі" з файла README. Гэтага не павінна быць. Мне трэба, каб кантэнт быў там. Ці ёсць спосаб захаваць кантэнт і адмяніць мой лакальны комм?

560
31 янв. зададзены Amal Kumar S 31 студз. 2011-01-31 15:14 '11 у 15:14 2011-01-31 15:14
@ 7 адказаў

Проста выкарыстоўвайце git reset без сцяга --hard :

 git reset HEAD~1 

PS: У сістэмах на базе Unix вы можаце выкарыстоўваць HEAD^ , які роўны HEAD~1 . У Windows HEAD^ не будзе працаваць, таму што ^ сігналізуе аб працягу радка. Такім чынам, ваша запрашэнне каманднага радка проста спытае вас More? .

1085
31 янв. адказ дадзены Koraktor 31 студз. 2011-01-31 15:17 '11 у 15:17 2011-01-31 15:17

Выкарыстоўвайце --soft замест --hard сцяг:

border=0
 git reset --soft HEAD^ 
143
10 авг. адказ дадзены TpED 10 жнів. 2012-08-10 11:02 '12 у 11:02 2012/08/10 11:02

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

Такім чынам, вы можаце выдаліць усе радкі, каб паведамленне аб фіксацыі было пустым, а затым захаваць файл:

2019

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

--soft : будуць скінутыя толькі камітаў, а індэкс і працоўны каталог не будуць змененыя.

--mixed : гэта прывядзе да скіду індэкса ў адпаведнасці з загалоўкам, пры гэтым працоўны каталог не будзе закрануць. Ўсе змены застануцца ў працоўным каталогу і з'явяцца як змененыя.

--hard : скідае усе (камітаў, індэкс, працоўны каталог) у адпаведнасці з загалоўкам.

У вашым выпадку я б выкарыстаў git reset --soft каб захаваць вашы змененыя змены ў індэксе і працоўным каталогу. Не забудзьцеся праверыць гэта для больш падрабязнага тлумачэння.

5
29 мая '18 в 13:22 2018-05-29 13:22 адказ дадзены Nesha Zoric 29 мая '18 у 13:22 2018/05/29 13:22

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

Выкарыстоўвайце git log каб паказаць бягучыя паведамленні аб камітаў, а затым знайдзіце commit_id, перш чым вы хочаце выдаліць, а не толькі той, які вы хочаце выдаліць.

Калі вы хочаце захаваць лакальна змененыя файлы, проста выдаліце ​​паведамленне пра комм:

git reset --soft commit_id

Калі вы хочаце выдаліць усе лакальна змененыя файлы і паведамленне пра комм:

git reset --hard commit_id

Што розніца мяккая і жорсткая

2
02 сент. адказ дадзены mistdon 02 сент. 2018-09-02 06:43 '18 у 06:43 2018/09/02 06:43

Выкарыстоўвайце каманду ніжэй: $ git reset HEAD ~ 1. Пасьля гэтага вы таксама можаце праглядаць файлы, якія вяртаюцца назад, як паказана ніжэй.

Неўпаўнаважаныя змены пасля скіду: M application / config / config.php M application / config / database.php

1
14 мая '18 в 16:25 2018-05-14 16:25 адказ дадзены Omkar 14 мая '18 у 16:25 2018/05/14 16:25

Розніца паміж git reset --mixed, --soft і --hard

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

Давайце возьмем прыклад:

 - A - B - C (master) 

HEAD паказвае на C а індэкс адпавядае C

--soft

  • Калі мы выконваем git reset --soft B з мэтай выдалення камітаў C і ўказанні галоўнага / HEAD на B.
  • Master / HEAD цяпер будзе паказваць на B, але індэкс ўсё яшчэ змяніўся з C.
  • Пры выкананні git status вы маглі бачыць файлы, праiндэксаваныя ў комм C, як паэтапныя.
  • Выкананне git commit ў гэты момант створыць новы комм з тымі ж зменамі, што і ў C

--mixed

  • Выканаць git reset --mixed B
  • Пры выкананні master / HEAD будзе паказваць на B, і індэкс таксама змяняецца, каб адпавядаць B з-за выкарыстоўванага змешанага сцяга.
  • Калі ў гэты момант мы запусцім git commit, нічога не адбудзецца, так як індэкс адпавядае HEAD.
  • У нас усё яшчэ ёсць змены ў працоўным каталогу, але, паколькі яны адсутнічаюць у індэксе, стан git паказвае іх як неперехваченные.
  • Каб зафіксаваць іх, вы павінны git add а затым зафіксаваць як звычайна.

--hard

  • Выканаць git reset --hard B
  • Пры выкананні master / HEAD будзе паказваць на B і змяняе ваш працоўны каталог
  • Змены, дададзеныя ў C, і ўсё незафіксаваных змены будуць выдаленыя.
  • Файлы ў рабочай копіі будуць адпавядаць камітаў B, гэта прывядзе да страты ўсіх змен, якія былі ўнесены ў комм C, а таксама да незафіксаваных зменаў.

Спадзяюся, што параўнанне сцягоў, даступных для выкарыстання з камандай git reset , дапаможа камусьці выкарыстоўваць іх з розумам. Звярніцеся да іх для атрымання дадатковай інфармацыі link1 link2

0
18 янв. адказ вызначаецца Keshan Nageswaran 18 студз. 2019-01-18 19:48 '19 у 19:48 2019/01/18 19:48

Іншыя пытанні па пазнаках або Задайце пытанне