Як змінити існуючі, 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 7: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 6: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 12: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 о 4:45 2013-01-18 4:45

Якщо ви використовуєте графічний інтерфейс Git, ви можете змінити останнім Комміт, який не був натиснутий:

 Commit/Amend Last Commit 
183
01 дек. відповідь дан gulchrider 01 дек. 2012-12-01 08:03 '12 в 8:03 2012-12-01 8: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 в 3:01 2015-02-10 3:01

Я використовую Git GUI стільки, скільки можу, і це дає вам можливість змінити останні повідомлення:

2019

165
05 авг. відповідь дан Havard Graff 05 Серпня. 2013-08-05 02:13 '13 в 2:13 2013-08-05 2: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 в 1:03 2014-01-07 1: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 12: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