Як змяніць існуючыя, unpushed камітаў?

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

Як змяніць паведамленне / файлы коміта? Комм яшчэ не запушен.

7676
07 окт. зададзены Laurie Young 07 каст. 2008-10-07 18:44 '08 у 18:44 2008-10-07 18:44
@ 27 адказаў

Ўнясенне змяненняў у самае апошняе паведамленне аб комм

 git commit --amend -m "New commit message" 

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

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

Змена паведамлення камітаў, які вы ўжо адправілі ў выдаленую галінку

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

SHA , што стварае праблему, калі ў іншых людзей ёсць копіі старых камітаў, якія вы перапісалі.  Любы, у каго ёсць копія старога камітаў, павінен будзе сінхранізаваць сваю працу з ізноў перапісаным камітаў, што часам можа быць абцяжарана, таму пераканайцеся, што вы каардынуеце дзеянні з іншымі пры спробе перапісаць гісторыю агульнай камітаў, ці проста пазбягайце перазапісу агульных камітаў ў цэлым. 


Выкарыстоўвайце інтэрактыўны ребаз

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

Каб зрабіць git squash, выканайце наступныя дзеянні:

 // X is the number of commits to the last commit you want to be able to edit git rebase -i HEAD~X last commit you want to be able to edit // X is the number of commits to the last commit you want to be able to edit git rebase -i HEAD~X 

Як толькі вы раздушыце свае камітаў - выберыце e/r для рэдагавання паведамлення

2019

07 окт. адказ дадзены EfForEffort 07 каст. 2008-10-07 18:50 '08 у 18:50 2008-10-07 18:50
2438
08 февр. адказ дадзены lfx_cool 08 февр. 2010-02-08 07:26 '10 у 7:26 2010-02-08 07:26

Калі фіксацыя, якую вы хочаце выправіць, не з'яўляецца апошняй:

  • git rebase --interactive $parent_of_flawed_commit

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

  • З'явіцца рэдактар ​​са спісам усіх камітаў з тых часоў, як вы далі.

    • Зменіце pick на reword (або на старыя версіі Git, на edit ) перад любымі фіксацыі, якія вы хочаце выправіць.
    • Пасля захавання Git прайграе пералічаныя камітаў.

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

    • Зменіце фіксацыю любым спосабам.
    • git commit --amend
    • git rebase --continue

Большая частка гэтай паслядоўнасці будзе тлумачыцца вам па выхаду розных каманд па ходу. Яго вельмі лёгка, вам не трэба запамінаць яго - проста памятаеце, што git rebase --interactive дазваляе вам выпраўляць, незалежна ад таго, як даўно яны былі.


Звярніце ўвагу, што вы не захочаце змяняць фіксацыі, якія вы ўжо націснулі. Ці, можа быць, вы гэта зробіце, але ў гэтым выпадку вам прыйдзецца праяўляць вялікую асцярожнасць, каб мець зносіны з усімі, хто, магчыма, пацягнуў вашыя камітаў і зрабіў працу па-над імі. Як аднавіць / пересинхронизировать пасля таго, як нехта перацягнуў rebase або reset ў апублікаваную галінку?

2321
07 окт. адказ дадзены Aristotle Pagaltzis 07 каст. 2008-10-07 22:52 '08 а 22:52 2008-10-07 22:52

Каб унесці змены ў папярэднюю фіксацыю, занясіце неабходныя змены і выканайце гэтыя змены, а затым запусціце

 git commit --amend -C HEAD 

Каб выправіць папярэднюю фіксацыю, цалкам выдаліўшы яе, запусціце

 git rebase -i HEAD~ commit_count 

(Заменіце commit_count на колькасць камітаў, якія вы хочаце змяніць.) Гэтая каманда запускае ваш рэдактар. Адзначце першы фіксатар (той, які вы хочаце змяніць) як "рэдагаваць" замест "абраць", затым захавайце і выйдзіце з рэдактара. Унясіце змены, якія вы хочаце зафіксаваць, а затым запусціце

758
16 авг. адказ дадзены Fatih 16 жнів. 2011-08-16 00:20 '11 у 0:20 2011-08-16 00:20

Як ужо згадвалася, git commit --amend - гэта спосаб перазапісаць апошняе комм. Адна нататка: калі вы хочаце таксама перазапісаць файлы, каманда будзе

390
07 июня '11 в 0:16 2011-06-07 00:16 адказ дадзены John 07 чэрвеня '11 у 0:16 2011-06-07 00:16

Вы таксама можаце выкарыстоўваць GIT filter-branch для гэтага.

351
01 сент. адказ дадзены Mark 01 сент. 2012-09-01 23:35 '12 у 23:35 2012/09/01 23:35

Я аддаю перавагу гэты шлях.

 git commit --amend -c <commit ID> 

У адваротным выпадку будзе новы комм з новым ідэнтыфікатарам фіксацыі

312
10 янв. адказ дадзены krevedko 10 студз. 2013-01-10 17:23 '13 у 17:23 2013/01/10 17:23

Калі вы карыстаецеся інструмент Git GUI, ёсць кнопка з імем last last commit. Націсніце на гэтую кнопку, а затым адлюстраваў свае апошнія файлы коміта і паведамленне. Проста адрэдагуйце гэта паведамленне, і вы можаце зафіксаваць яго з новым паведамленнем фіксацыі.

Або выкарыстоўвайце гэтую каманду з кансолі / тэрмінала:

 git commit -a --amend -m "My new commit message" 
309
08 нояб. адказ дадзены Akhilraj NS 08 лістапада. 2012-11-08 06:51 '12 у 6:51 2012/11/08 06:51

Вы можаце выкарыстоўваць Git rebasing . Напрыклад, калі вы хочаце змяніць back to commit bbc643cd, запусціце

 $ git rebase bbc643cd^ --interactive 

У рэдактары па змаўчанні зменіце 'pick' на 'edit' у радку, чыю фіксацыю вы хочаце змяніць. Унясіце змены, а затым выканаеце іх з дапамогай

 $ git add <filepattern> 

Цяпер вы можаце выкарыстоўваць

 $ git commit --amend 

каб змяніць фіксацыю, і пасля гэтага

 $ git rebase --continue 

каб вярнуцца да папярэдняга фіксацыі кіраўніка.

282
22 янв. адказ дадзены Shoaib Ud-Din 22 студз. 2013-01-22 20:23 '13 у 20:23 2013/01/22 20:23
  • Калі вы хочаце змяніць апошняе паведамленне аб фіксацыі, выканайце наступныя дзеянні:

     git commit --amend 

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

  • Калі вы хочаце змяніць апошнія 3 паведамленні фіксацыі або любыя паведамленні камітаў да гэтай кропкі, пастаўце HEAD~3 ў каманду git rebase -i :

     git rebase -i HEAD~3 
275
22 окт. адказ дадзены Heena Hussain 22 каст. 2012-10-22 14:22 '12 у 14:22 2012/10/22 14:22

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

256
15 нояб. адказ дадзены sebers 15 лістапада. 2012-11-15 12:29 '12 у 12:29 2012/11/15 00:29

выкарыстанне

 git commit --amend 

Каб зразумець гэта падрабязна, выдатны пост - 4. Перазапіс гісторыі Git . У ім таксама гаворыцца пра тое, калі не выкарыстоўваць git commit --amend .

221
27 марта '13 в 23:43 2013-03-27 23:43 адказ дадзены skin 27 сакавіка '13 у 23:43 2013/03/27 23:43

ўнесці папраўкі

У вас ёсць пара варыянтаў. Вы можаце зрабіць

 git commit --amend 

да таго часу, пакуль яно не будзе выканана апошнім.

інтэрактыўная пераадрасацыя

У адваротным выпадку, калі гэта не ваша апошняя фіксацыя, вы можаце выканаць інтэрактыўную перазагрузку,

 git rebase -i [branched_from] [hash before commit] 

Затым ўнутры інтэрактыўнай пераадрасацыі вы проста дадаеце рэдагаванне гэтага камітаў. Калі гэта адбудзецца, зрабіце git commit --amend і зменіце паведамленне камітаў. Калі вы хочаце вярнуцца назад да гэтага пункту фіксацыі, вы таксама можаце выкарыстоўваць git reflog і проста выдаліць гэтую фіксацыю. Затым вы зноў выканайце git commit .

195
18 янв. адказ дадзены wallerjake 18 студз. 2013-01-18 04:45 '13 у 04:45 2013/01/18 04:45

Калі вы выкарыстоўваеце графічны інтэрфейс Git, вы можаце змяніць апошняе комм, які не быў націскам:

 Commit/Amend Last Commit 
183
01 дек. адказ дадзены gulchrider 01 снеж. 2012-12-01 08:03 '12 у 08:03 2012/12/01 08:03

Калі гэта ваша апошняя фіксацыя, проста выправіць commit:

 git commit --amend -o -m "New commit message" 

(выкарыстоўваючы сцяг -o ( --only ), каб пераканацца, што вы змяняеце толькі паведамленне камітаў)


Калі ён падобны на комм, выкарыстоўвайце дзіўную інтэрактыўную rebase:

 git rebase -i @~9 # Show the last 9 commits in a text editor 

Знайдзіце патрабаваную фіксацыю, зменіце pick на r ( reword ) і захавайце і зачыніце файл. Гатова!



Мініятурны падручнік vim (ці, як пераўсталяваць ўсяго 8 націскаў клавіш 3j cw r Esc ZZ ):

  • Запусціце vimtutor , калі ў вас ёсць час
  • h j k l адпавядаюць клавішах перамяшчэння
  • Усе каманды могуць мець прэфікс "дыяпазон", напрыклад. 3j перамяшчаецца на 3 радкі
  • i , каб увайсці ў рэжым ўстаўкі - тэкст, які вы ўводзіце, з'явіцца ў файле
  • Esc або Ctrl c , каб выйсці з рэжыму ўстаўкі і вярнуцца ў "звычайны" рэжым
  • u для адмены
  • Ctrl r для паўтору
  • dd , dw , dl , каб выдаліць радок, слова або літару, адпаведна
  • cc , cw , cl , каб змяніць радок, слова або літару адпаведна (тое ж самае, што dd i )
  • yy , yw , yl для капіявання ( "yank") радкі, словы ці літары, адпаведна
  • p ці p для ўстаўкі пасля або да бягучай пазіцыі адпаведна
  • :w Enter для захавання (запісы) файла
  • :q! Enter выйсці без захавання
  • :wq Enter або ZZ для захавання і выхаду

Калі вы шмат рэдагуеце тэкст, пераключыцеся на раскладку клавіятуры Dvorak, вывучыце тып touch- і вывучыце vim. Ці варта намаганняў? Так.



ProTip ™: ня бойцеся эксперыментаваць з "небяспечнымі" камандамі, якія перапісваюць гісторыю * - Git не выдаляе вашы фіксацыі на працягу 90 дзён па змаўчанні; вы можаце знайсці іх у reflog:

 $ git reset @~3 # go back 3 commits $ git reflog c4f708b HEAD@{0}: reset: moving to @~3 2c52489 HEAD@{1}: commit: more changes 4a5246d HEAD@{2}: commit: make important changes e8571e4 HEAD@{3}: commit: make some changes ... earlier commits ... $ git reset 2c52489 ... and you're back where you started 

* Сцеражыцеся такіх параметраў, як --hard і --force , хоць яны могуць адкідаць дадзеныя.
* Таксама не перапісваюцца гісторыю ў якіх-небудзь галінку, з якімі вы супрацоўнічаеце.

170
10 февр. адказ дадзены Zaz 10 февр. 2015-02-10 03:01 '15 у 03:01 2015/02/10 03:01

Я выкарыстоўваю Git GUI столькі, колькі магу, і гэта дае вам магчымасць змяніць апошняе паведамленне:

2019

165
05 авг. адказ дадзены Havard Graff 05 жнів. 2013-08-05 02:13 '13 у 02:13 2013/08/05 02:13

Нічога сабе, таму ёсць шмат спосабаў зрабіць гэта.

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

135
03 дек. адказ дадзены Radu Murzea 03 снеж. 2013-12-03 00:31 '13 у 0:31 2013/12/03 00:31

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

 git commit --amend 

або

124
07 янв. адказ дадзены Shubham Chaudhary 07 студз. 2014-01-07 01:03 '14 у 01:03 2014/01/07 01:03

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

2019

123
06 нояб. адказ дадзены Steve Chambers 06 лістапада. 2014-11-06 18:01 '14 у 18:01 2014/11/06 18:01

Калі вы хочаце змяніць апошняе паведамленне, вы павінны выкарыстоўваць сцяг --only або яго ярлык -o з дапамогай commit --amend :

122
23 мая '14 в 11:40 2014-05-23 11:40 адказ дадзены David Ongaro 23 мая '14 у 11:40 2014/05/23 11:40

Абновіце апошняе памылковае паведамленне з новым паведамленнем аб фіксацыі ў адным радку:

 # You can reset your head to n number of commit # NOT a good idea for changing last commit message # but you can get an idea to split commit into multiple commits git reset --soft HEAD^ # it will reset you last commit. Now, you # can re-commit it with new commit message. of commit # You can reset your head to n number of commit # NOT a good idea for changing last commit message # but you can get an idea to split commit into multiple commits git reset --soft HEAD^ # it will reset you last commit. Now, you # can re-commit it with new commit message. message # You can reset your head to n number of commit # NOT a good idea for changing last commit message # but you can get an idea to split commit into multiple commits git reset --soft HEAD^ # it will reset you last commit. Now, you # can re-commit it with new commit message. commit into multiple commits # You can reset your head to n number of commit # NOT a good idea for changing last commit message # but you can get an idea to split commit into multiple commits git reset --soft HEAD^ # it will reset you last commit. Now, you # can re-commit it with new commit message. 

Выкарыстанне reset для падзелу камітаў на больш дробныя камітаў

git reset можа дапамагчы вам разбіць адно комм на некалькі камітаў:

99
22 янв. адказ дадзены przbadu 22 студз. 2014-01-22 11:57 '14 у 11:57 2014/01/22 11:57

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

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

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

git rebase -i HEAD~5 * Дзе 5 - колькасць паведамленняў фіксацыі, якія вы хочаце змяніць. (Таму, калі вы хочаце змяніць 10-га на апошняе комм, увядзіце 10)

Гэтая каманда прывядзе вас у VIM там, дзе вы зможаце рэдагаваць сваю гісторыю фіксацыі. Вы ўбачыце апошнія 5 камітаў уверсе:

pick <commit hash> commit message

Замест pick вам трэба напісаць reword . Вы можаце зрабіць гэта ў VIM, набраўшы i , што прымушае вас перайсці ў рэжым INSERT-. (Вы бачыце, што вы знаходзіцеся ў рэжыме ўстаўкі з дапамогай слова INSERT унізе). Для камітаў вы хочаце змяніць тып у reword замест pick

Затым вам трэба захаваць і выйсці з гэтага экрана, вы робіце гэта, спачатку перайшоўшы ў рэжым command-, націснуўшы кнопку esc. (Вы можаце праверыць, што вы знаходзіцеся ў рэжыме command-, калі слова INSERT ўнізе знікла). Затым вы можаце ўвесці каманду, набраўшы : , каманда захавання і выхаду - wq . Таму, калі вы набераце :wq Youre ont, ён мае рацыю.

Затым VIM пяройдзе да любога паведамленні фіксацыі, якое вы хочаце перапісаць, тут вы можаце фактычна змяніць паведамлення фіксацыі. Вы зробіце гэта, перайшоўшы ў рэжым INSERT-, змяніўшы паведамленне камітаў, перайшоўшы ў рэжым command- і захавайце і зачыніце. Зрабіце гэта 5 разоў, а вы па-за VIM!

Затым, калі вы ўжо падштурхнулі свае няправільныя камітаў, вам трэба git push --force перазапісаць іх. Памятаеце, што git push --force - даволі небяспечная рэч, таму пераканайцеся, што no- адзін выцягнуў з сервера, так як вы націснулі свае няправільныя камітаў!

Цяпер вы змянілі свае паведамленні фіксацыі!

(Як вы бачыце, я не настолькі дасведчаны ў VIM, таму, калі я выкарыстаў няправільны "жаргон", каб растлумачыць, што адбываецца, не саромейцеся мяне выпраўляць!)

82
07 авг. адказ дадзены Marijn 07 жнів. 2014-08-07 12:18 '14 у 12:18 2014/08/07 00:18

Вы можаце выкарыстоўваць git-rebase-reword

Ён прызначаны для рэдагавання любы фіксацыі (не толькі апошняй), гэтак жа як commit --amend

 $ git rebase-reword <commit-or-refname> 

Он назван в честь действия по интерактивной переадресации, чтобы исправить фиксацию: "изменить". См. этот пост и man -section interactive mode-

прыклады:

 $ git rebase-reword b68f560 $ git rebase-reword HEAD^ 
76
ответ дан albfan 21 февр. '15 в 15:21 2015-02-21 15:21

Я добавил псевдоним reci , recm для recommit (amend) it, теперь я могу сделать это с помощью git recm или git recm -m .

 $ vim ~/.gitconfig [alias] ...... cm = commit reci = commit --amend recm = commit --amend ...... 
76
ответ дан Chu-Siang Lai 06 янв. '14 в 10:24 2014-01-06 10:24