Змінення старого повідомлення про фіксацію на Git


136

Я намагався редагувати старе повідомлення про фіксацію, як було пояснено тут .

Вся справа в тому, що зараз, коли я намагаюся бігати rebase -i HEAD~5 це говорить interactive rebase already started.

Тоді я намагаюся: git rebase --continueале отримав цю помилку:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

Будь-які ідеї?

Відповіді:


125

Він говорить:

Коли ви збережете та вийдете з редактора, він поверне вас до останнього комітету у цьому списку та переведе вас у командний рядок із таким повідомленням:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

Це не означає:

введіть знову git rebase -i HEAD~3

Постарайтеся не вводити текст, git rebase -i HEAD~3коли виходите з редактора, і це повинно працювати нормально.
(інакше у вашій конкретній ситуації git rebase -i --abortможе знадобитися скинути все та дозволити спробувати знову)


Як згадує Дейв Фогт у коментарях, git rebase --continueце перейти до наступного завдання в процесі звільнення, після того як ви внесете зміни до першого зобов'язання .

Крім того , Gregg Lind згадує в своїй відповіді rewordкомандуванняgit rebase :

Замінивши команду "pick" на команду "edit", ви можете сказати git rebase припинити після застосування цього комітету, щоб ви могли редагувати файли та / або повідомлення про фіксацію, вносити зміни до комісії та продовжувати повторне використання.

Якщо ви просто хочете відредагувати повідомлення про виконання комісії, замініть команду " pick" на команду " reword" , оскільки Git1.6.6 (січень 2010 р . ) .

Це робиться те саме, що editробиться під час інтерактивної бази даних, за винятком того, що ви лише можете редагувати повідомлення про фіксацію, не повертаючи керування оболонці . Це надзвичайно корисно.
На даний момент, якщо ви хочете очистити свої повідомлення про зобов’язання, ви повинні:

$ git rebase -i next

Потім встановіть усі зобов’язання "редагувати". Потім на кожному:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

Використання ' reword' замість ' edit' дозволяє пропускати git-commitта git-rebaseдзвінки .


2
Крім того, git rebase --continueперейдіть до наступного завдання в процесі відновлення, після того як ви внесли зміни до першого комітету.
Дейв Фогт

1
Додавання посилання на статтю у вікі github для зміни повідомлення про вчинення
Радість

60

Як запропонував Грегг Лінд, ви можете використовувати слово, щоб запропонувати змінити лише повідомлення про фіксацію (і залишити комісію недоторканою інакше):

git rebase -i HEAD~n

Ось nсписок останніх російських комісій.

Наприклад, якщо ви використовуєте git rebase -i HEAD~4, ви можете побачити щось подібне:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Тепер замініть pick на reword для зобов'язань, які ви бажаєте редагувати повідомлення:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

Вийдіть із редактора після збереження файлу, а потім вам буде запропоновано відредагувати повідомлення про зобов’язання, які ви позначили, як слово , по одному файлу на повідомлення. Зверніть увагу , що це було б набагато простіше просто змінити фіксації повідомлення при заміні pickз reword, але робити це не має ніякого ефекту.

Дізнайтеся більше на сторінці GitHub про зміну повідомлення про фіксацію .


Дуже добре пояснено. Дякую: D
Shubham Jain

Спасибі @ShubhamJain радий , що моя відповідь була корисний
Punit Вар

Я це зробив, а потім у моїй філії з’являються комісії з інших гілок
Reza

@Reza ви, можливо, зіпсували щось. Спробуйте це в якомусь іншому репо. Це рішення прекрасно працює
Punit Vara

54

FWIW, інтерактивна версія git rebase тепер має варіант "reword", що робить це набагато менш болісним!


3
rewordЧому під час використання git просто не дозволяє вам редагувати повідомлення про фіксацію у цьому файлі зі списком комітетів? Замість цього він запустить редактор з одним файлом повідомлення фіксації в rewordрядку. Це просто непотрібно. Навіть якщо інші дії , ніж pickабо rewordвимагають запуску зовнішніх команд, rewordне вимагає би цього.
Дан Даскалеску

9

Просто хотів надати для цього інший варіант. У моєму випадку я, як правило, працюю над своїми окремими гілками, потім зливаюсь, щоб оволодіти, і окремі зобов’язання, які я роблю своїм місцевим, не такі важливі.

Через гачку, яка перевіряє відповідний номер квитка на Джирі, але чутливі до регістру, мені не вдалося натиснути свій код. Крім того, фіксація була зроблена давно, і я не хотів рахувати, скільки комісій потрібно повернути на ребайн.

Отже, я зробив це, щоб створити нову гілку з останнього майстра і розбити всі коміти з проблемної гілки в єдиний комітет по новій гілці. Мені було легше, і я думаю, що було б добре мати його тут як майбутнє посилання.

Від останнього майстра:

git checkout -b new-branch

Тоді

git merge --squash problem-branch
git commit -m "new message" 

Референція: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commissions-into-one-commit-before-merging-to-Master-branch


1
Ваша відповідь справді врятувала мені день :). Я боровся rebase -iблизько 2 годин і успіху не було. Моя комісія відстала від 18 комітетів, так що ви можете собі уявити. Це був найпростіший і зручний спосіб, який я міг знайти, не потребуючи використання бази даних. Дякую, друже!
Карлос Парра

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.