Як редагувати неправильне повідомлення про фіксацію в git (яке я натиснув)?


152

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

Як змінити повідомлення про фіксацію? Це можливо?

Відповіді:


125

Повідомлення від Лінуса Торвальдса може відповісти на ваше запитання:

Змінення / редагування старих повідомлень про фіксацію

Коротка відповідь: не можна (якщо натиснуто).


екстракт (Лінус відноситься до BitKeeper як BK):

Бічна записка, просто з історичного інтересу: в БК ви могли.

І якщо ви звикли до цього (як я), це було справді досить практично. Я застосував би патч-бомбу від Ендрю, помітив, що щось не так, і просто відредагувати її, перш ніж виштовхувати її.

Я міг би зробити те ж саме з git. Було б досить просто зробити так, щоб повідомлення про фіксацію не було частиною імені, і все ж гарантувало, що історію не торкнулося, і дозволити річ "виправити коментарі пізніше".

Але я цього не зробив.

Частина його суто "внутрішньої консистенції". Git - це просто чистіша система завдяки всім захищеним SHA1, а всі об'єкти обробляються однаково, незалежно від типу об'єкта. Так, є чотири різні види об'єктів, і всі вони дійсно різні, і їх не можна використовувати однаково, але в той же час, навіть якщо їх кодування може бути різним на диску, концептуально вони всі працюють точно так само.

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

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


Щоб завершити, ви можете переписати свою локальну історію фіксації, щоб відобразити те, що ви хочете, як це запропонував sykora (з деяким перезавантаженням та скиданням - твердо, ах!)

Однак, як тільки ви опублікувати переглянуту історію зновуgit push origin +master:master, то +знак змушуючи поштовх статися, навіть якщо це не призводить до «швидкого вперед» зробити) ... ви могли б потрапити в халепу .

Витяг з цього іншого питання SO:

Я насправді одного разу підштовхнув до --force до сховища git.git і мене знущав Лінус ВЕЛИКИЙ ЧАС. Це створить масу проблем для інших людей. Проста відповідь - «не роби цього».


хороша відповідь. Чи знаєте ви, чи зможете ви зараз змінити вже натиснуті повідомлення на фіксацію у новіших версіях git? Чи щось змінилося з моменту публікації цього повідомлення в '09?
Девід Уест,

@DavidWest дотримується того самого принципу: ви можете переписати свою історію і змусити натиснути.
VonC

2
Щоб зробити речі більш конкретними, якщо ви вносите зміни / відновлення бази даних, їх ідентифікатори фіксування (шістнадцяткові хеші в індексі git) неминуче змінюються; це означає, що відредаговані комісії трактуються інакше, ніж їхні старі комісії в історії git VCS. Тобто, якщо члени вашої команди розробників, на жаль, уже витягли старі файли, вони зобов’язані витягнути відредаговані, нові елементи та виконати злиття між старим і новим у своїх місцевих робочих примірниках.
Шигерелло

1
Краще натиснути редаговані зобов’язання заново для зручності для ваших колег, тим самим вигідно усуваючи необхідність об'єднання в робочих примірниках колег.
Шигерелло

28

В даний час заміна git може зробити свою справу.

Детально: Створити відділення для тимчасової роботи

git checkout -b temp

Скиньте зобов’язання для заміни

git reset --hard <sha1>

Змініть комісію правильним повідомленням

git commit --amend -m "<right message>"

Замініть старий комікс на новий

git replace <old commit sha1> <new commit sha1>

поверніться до гілки, де ви були

git checkout <branch>

видалити гілку темп

git branch -D temp

поштовх

guess

зроблено.


11
@Jonah: Я отримую повідомлення "Все актуальне", коли я намагаюся натиснути на віддалену гілку
Саймон Кагві

1
Як було сказано в іншій відповіді: використовуйте rebase -i з reword. І це перепише історію.
Сільвейн

Дякую за рішення, яке я шукав. Ви економите мій час!
Томаш Кутер

1
@Jonah - У мене є проблема ... ваше рішення оновило мої журнали журналів локально, але не віддалено. Як їх проштовхнути туди?
Томаш Кутер

1
@TomaszKuter, у мене була така ж проблема, як і у вас. Моє повідомлення про вчинення не було оновлено віддалено. Я вирішив це, скориставшись такою допомогою GitHub: help.github.com/articles/changing-a-commit-message . Дотримуйтесь наступного: Змінення повідомлення старішого чи кількох повідомлень про фіксацію. Це в основному відповідь знизу, надана користувачем987419 Якщо ви вже змінили повідомлення про фіксацію, ви можете зробити вибір і зберегти, не змінюючи його знову.
evaldeslacasa

19

Ви можете використовувати git rebase -i(проти гілки, від якої ви розгалужені) 'я' для інтерактивної роботи.

Замініть pickнаступне на коментар, який ви хочете змінити, r(або reword), збережіть та вийдіть, і, зробивши це, ви зможете внести зміни.

git push ще раз і все закінчено!


1
Це не дозволяє редагувати повідомлення на об'єднаннях. Це можливо при якомусь варіанті цієї команди?
Андрій Мао

1
Спробуйте -pаргумент, rebaseякий pрезерв зливається.
Кактус

3
Мені подобається ця процедура, але спочатку не зовсім зрозумів відповідь. Якщо комусь потрібна допомога з цим, сторінка довідки Githulb пропонує добру інформацію про це: help.github.com/articles/changing-a-commit-message
evaldeslacasa

15

Припустимо, у вас є таке дерево:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]

По-перше, checkoutтимчасова гілка:

git checkout -b temp

На tempфілії, reset --hardдо комісії, яку ви хочете змінити у своєму повідомленні (наприклад, що це виконувати 946992):

git reset --hard 946992

Використовуйте amendдля зміни повідомлення:

git commit --amend -m "<new_message>"

Після цього дерево буде виглядати так:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
           \
            b886a0 [temp]

Потім, cherry-pickвсе роблять , що попереду 946992від masterдо tempі зафіксувати їх, використовувати , amendякщо ви хочете змінити свої повідомлення , а також:

git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>

Дерево зараз виглядає так:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
               \
                b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]

Тепер примушуйте натиснути гілку темпу на віддалений:

git push --force origin temp:master

Заключний крок, видаліть гілку masterна локальному, git fetch originщоб витягнути гілку masterз сервера, а потім перейти до гілки masterта видалити гілку temp.

Тепер всі ваші місцеві та віддалені буде оновлено всі повідомлення.


5

У нашому магазині я представив умову додавання впізнаваних анотованих тегів до комісій з неправильними повідомленнями та використання анотації як заміни.

Незважаючи на те, що це не допомагає людям, які виконують випадкові команди "git log", це дає нам спосіб виправити неправильні посилання прослідників помилок у коментарях, і всі мої інструменти побудови та випуску розуміють умову.

Це, очевидно, не є загальною відповіддю, але це може бути щось, що люди можуть прийняти в конкретних громадах. Я впевнений, що якщо це використовувати в більш широких масштабах, якась порцелянова підтримка може зрізатися, врешті-решт ...


3
"Git notes" може послужити подібній меті
Крістіан Гетце

2

http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 )

Як змінити чиниться глибше в історії

Оскільки історія в Git незмінна, виправлення будь-чого, крім самого останнього комітету (фіксація, яка не є головним відділенням), вимагає, щоб історія була переписана зі зміненого комітету та вперед.

Ви можете використовувати StGIT для цього, при необхідності ініціалізувати гілку, не підключившись до комісії, яку потрібно змінити, перейдіть до неї, якщо потрібно, внесіть зміни, потім оновіть патч (з опцією -e, якщо ви хочете виправити повідомлення про фіксацію), а потім натисніть все і stg здійснюють.

Або ви можете використовувати для цього rebase. Створіть нову тимчасову гілку, перемотайте її на команду, яку ви хочете змінити, використовуючи скидання git - тверда, змініть цю команду (це було б верхньою частиною поточної головки), потім перезавантажте гілку поверх зміненої фіксації, використовуючи git rebase --onto.

Або ви можете використовувати git rebase --interactive, який дозволяє різні модифікації, такі як переупорядкування патчів, згортання, ...

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


Хороший відповідь теоретично, сильний небезпечно на практиці: см stackoverflow.com/questions/253055#432518
VonC

0

Якщо ви використовуєте розширення Git: перейдіть на екран "Коміт", у нижній частині має бути прапорець "Змінити комісію", як видно нижче:

введіть тут опис зображення


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