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

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

Как да промените съобщението / файловете? Потвърждението още не е започнало.

7676
07 окт. определени от Лори Янг 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 

Веднага след като смаже вашите ангажименти, изберете e/r да редактирате съобщението.

2019

07 окт. Отговорът е даден EfForEffort 07 oct. 2008-10-07 18:50 '08 в 18:50 2008-10-07 18:50
2438
08 февр. Отговорът е даден lfx_cool 08 Feb. 2010-02-08 07:26 '10 в 7:26 ч. 2010-02-08 07:26

Ако корекцията, която искате да коригирате, не е последната:

  • git rebase --interactive $parent_of_flawed_commit

    Ако искате да поправите няколко грешни грешки, подайте родителския код на най-стария.

  • Появява се редактор със списък на всички извършени след подаването му.

    • Променете reword промяна (или стари версии на Git, за да я edit ) преди всички поправки, които искате да поправите.
    • След като запазите, Git ще възпроизведе изброените ангажименти.

  • За всеки ангажимент, който искате да повторите, Git ще ви отведе обратно към редактора. За всеки ангажимент, който искате да промените, Git ви поставя в черупка. Ако сте в черупка:

    • Променете фиксацията по какъвто и да е начин.
    • git commit --amend
    • git rebase --continue

По-голямата част от тази последователност ще ви бъде обяснена от изхода на различни екипи в движение. Нейната много лесно, не е нужно да го запомняте - просто не забравяйте, че git rebase --interactive ви позволява да поправите, без значение колко дълго са били.


Обърнете внимание, че не искате да променяте ангажиментите, които вече сте натиснали. Или може би ще го направите, но в този случай ще трябва да се погрижите да общувате с всеки, който може да е извадил вашите ангажименти и да свършите работата си върху тях. Как да възстановите / ресинхронизирате, след като някой е изтеглил rebase или нулиран към публикувана нишка?

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 е начин за презаписване на последния git commit --amend . Една бележка: ако искате да презапишете файлове , командата ще бъде

390
07 июня '11 в 0:16 2011-06-07 00:16 отговорът е даден от Джон на 07.06.2011 в 0:16 2011-06-07 00:16

Можете също да използвате git filter-branch за това.

351
01 сент. Отговор Марк 01 сеп 2012-09-01 23:35 '12 в 23:35 2012-09-01 23:35

Предпочитам по този начин.

 git commit --amend -c <commit ID> 

В противен случай ще има ново поемане с нов идентификатор за фиксиране.

312
10 янв. Отговор, даден от krevedko Jan 10 2013-01-10 17:23 '13 в 17:23 2013-01-10 17:23

Ако използвате GI GUI инструмента, има бутон с последно последно фиксиране. Кликнете върху този бутон и след това покажете най-новите си файлове и съобщение. Просто редактирайте това съобщение и можете да го поправите с ново съобщение за поемане.

Или използвайте тази команда от конзолата / терминала:

 git commit -a --amend -m "My new commit message" 
309
08 нояб. отговорът е даден Akhilraj NS 08 Nov. 2012-11-08 06:51 '12 в 6:51 am 2012-11-08 06:51

Можете да използвате git rebasing . Например, ако искате да промените обратно, за да въведете 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 съобщения за git rebase -i или всякакви съобщения за git rebase -i до тази точка, поставете 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 нояб. Отговорът е даден от себер 15 ноември. 2012-11-15 12:29 '12 в 12:29 2012-11-15 12:29

използване на

 git commit --amend 

За да разберем това подробно, една отлична публикация е 4. Презапишете историята на Git . Също така ви казва кога да не използвате git commit --amend .

221
27 марта '13 в 23:43 2013-03-27 23:43 отговорът е даден на кожата March 27 '13 at 23:43 2013-03-27 23:43

изменят

Имате няколко опции. Можете да го направите

 git commit --amend 

докато не се изпълни последно.

Интерактивно пренасочване

В противен случай, ако това не е последното ви поемане, можете да извършите интерактивно рестартиране,

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

След това в интерактивното пренасочване просто добавяте редакция към това посвещение. Когато това се случи, направете git commit --amend и променете съобщението за git commit --amend . Ако искате да се върнете към тази точка на фиксиране, можете също да използвате git reflog и просто да премахнете това решение. След това отново стартирате git commit .

195
18 янв. Отговорът е даден wallerjake 18 януари 2013-01-18 04:45 '13 в 4:45 ч. 2013-01-18 04:45

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

 Commit/Amend Last Commit 
183
01 дек. Отговорът е даден от gulchrider 01 Dec. 2012-12-01 08:03 '12 в 8:03 2012-12-01 08:03

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

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

(използвайки флага -o ( --only ), за да се уверите, че променяте само съобщението за --only )


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

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

Намерете желания ангажимент, променете pick to 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 да копирате съответно редовете, думите или буквите
  • p или p да се вмъкне съответно след или преди текущата позиция
  • :w Въведете, за да запишете (запишете) файла
  • :q! Въведете exit без запазване
  • :wq Enter или ZZ за запис и изход

Ако редактирате много текст, преминете към подредбата на клавиатурата на Дворжак, научете типа на докосване и научете 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 Feb. 2015-02-10 03:01 '15 в 3:01 2015-02-10 03:01

Използвам Git GUI колкото мога, и това ви дава възможност да промените последното съобщение:

2019

165
05 авг. отговорът е даден от Havard Graff 05 aug. 2013-08-05 02:13 '13 в 2:13 2013-08-05 02:13

Уау, така че има много начини да направите това.

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

135
03 дек. Отговорът е даден от Раду Мурзеа 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 в 1:03 2014-01-07 01:03

За тези, които търсят графичен потребителски интерфейс за Windows / Mac, за да помогнат при редактирането на стари съобщения (т.е. не само най-новото съобщение), бих препоръчал SourceTree . Следвайте стъпките по-долу.

2019

123
06 нояб. Отговорът е даден от Стив Чембърс, ноември 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 отговори на Дейвид 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. 

Използвайте нулиране, за да разделите ангажиментите в по-малки по размер.

git reset може да ви помогне да прекъснете едно поемане в няколко обвързвания:

99
22 янв. отговорът е даден przbadu Jan 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

След това трябва да запазите и да излезете от този екран, като направите това, като първо преминете към команден режим, като натиснете бутона esc. (можете да проверите дали сте в команден режим, ако думата INSERT изчезне по-долу). След това можете да въведете команда, като напишете wq командата save и exit е wq . Следователно, ако пишете :wq youre ont, той ще бъде прав.

Тогава VIM ще премине към всяко съобщение, което искате да пренапишете, тук можете действително да промените съобщението за фиксиране. Вие правите това, като влизате в INSERT-режим, променяте съобщението за предаване, влизате в команден режим, записвате и затваряте. Направи го 5 пъти, а ти си извън VIM!

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

Сега сте променили съобщението си!

(Както виждате, аз не съм толкова опитен в VIM, така че ако използвах грешния "жаргон", за да обясня какво се случва, не се колебайте да ме поправите!)

82
07 авг. отговорът е даден Marijn 07 aug. 2014-08-07 12:18 '14 в 12:18 2014-08-07 12:18

Можете да използвате git-rebase-reword

Той е предназначен за редактиране на всяко commit --amend (не само на последната), точно като 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