Зміна повідомлення про фіксацію git після натискання (враховуючи, що ніхто не витягнув з віддаленого)


981

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

Чи є спосіб це зробити?


Що ви пробували? Припускаючи, що ви знаєте, як вже змінити повідомлення про фіксацію, а потім спробуйте натиснути, Git підкаже вам, що вам потрібно зробити, щоб це сталося.
Ендрю Маршалл

1
Дивіться відповідь на питання "Як редагувати неправильне повідомлення про фіксацію в git (я натиснув)?" stackoverflow.com/a/457396/444639
Майк Риландер

4
Декларуючи це - Google Питання про git commit № 1!
Маніш Шрівастава


Якщо ви змінюєте команду HEAD і натискаєте звичайно (без --force), то це дивно не виходить з ладу. Повідомлення фіксації HEAD оновлюється зміненим ідентифікатором фіксації. Це означає, що інші посвідчення комісій, крім HEAD, залишаються неушкодженими. Я помітив таку поведінку у версії git 2.8.1.
irsis

Відповіді:


1370

Зміна історії

Якщо це остання фіксація, ви можете просто зробити це:

git commit --amend

Це відкриває редактору останнє повідомлення про фіксацію і дозволяє вам редагувати повідомлення. (Ви можете використовувати, -mякщо хочете стерти старе повідомлення та скористатися новим.)

Натискання

А потім, коли ви натискаєте, зробіть це:

git push --force-with-lease <repository> <branch>

Або ви можете використовувати "+":

git push <repository> +<branch>

Або ви можете використовувати --force:

git push --force <repository> <branch>

Будьте обережні, використовуючи ці команди.

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

  • Якщо чітко не вказати гілку, Git буде використовувати налаштування push за замовчуванням. Якщо налаштування натискання за замовчуванням "відповідає", ви можете знищити зміни на декількох гілках одночасно.

Потягнення / витягнення після цього

Кожен, хто вже звернувся, отримає повідомлення про помилку, і їм потрібно буде оновити (припустимо, що вони самі не вносять жодних змін), зробивши щось подібне:

git fetch origin
git reset --hard origin/master # Loses local commits

Будьте обережні при використанні reset --hard. Якщо у вас зміниться галузь, ці зміни будуть знищені.

Примітка про зміну історії

Знищені дані - це лише старе повідомлення про фіксацію, але --forceцього не знають, і вони також щасливо видалять інші дані. Тож подумайте --forceяк "я хочу знищити дані, і я точно знаю, які дані знищуються". Але коли знищені дані здійснені, ви можете часто відновити старі комісії з рефлогу - дані насправді є сиротами, а не знищеними (хоча осиротілі комісії періодично видаляються).

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

Ось чому --force-with-leaseдещо безпечніше.


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

1
ви, ймовірно, хочете вказати назву гілки, коли ви натискаєте --force, інакше ви можете натиснути більше, ніж очікували.
user693960

1
@ user693960: Git натискатиме лише те, що ви налаштуєте, щоб натиснути.
Дітріх Епп

10
Просто, git push --forceякщо параметри <repository> та <branch> також не працюють, якщо у вас налаштовано вище.
ahnbizcad

2
Чи можете ви навести приклад <repository>? Це origin? org/repo? Або просто repo?
MikeSchinkel

439

Просто сказати :

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

і потім

git push --force

8
У моєму випадку git push origin <BRANCH-NAME>не вийшло, мені довелося використовувати, git push --forceяк пояснено у прийнятій відповіді.
Габріель

1
це не працює для мене. Ви повинні нас git push --force, інакше натиск не пройде.
ahnbizcad

4
@ahnbizcad, це має працювати. Просто переконайтесь, що назва гілки правильне.
Вільям

3
Я вітаю за простоту у вашому поясненні! Я користуюсь нею часто
Vasikos,

3
Я успішно застосував цю команду лише після тимчасового "захисту" моєї гілки, що сталося з моїм проектом, розміщеним у GitLab. Якщо у вас виникло це питання, перш ніж застосовувати ці команди, будь ласка, зверніться до цього stackoverflow.com/a/32267118/1423345, щоб "зняти захист" гілки, і ви можете "захистити" її знову після того, як буде зроблено зміна повідомлення на комісію :)
Джон

261

Щоб відредагувати комісію, відмінну від останньої:

Крок 1 : git rebase -i HEAD~nзробити інтерактивну базу даних для останніх nпорушених комісій. (тобто, якщо ви хочете змінити повідомлення про фіксацію 3, повертається назад, зробіть git rebase -i HEAD~3)

git спливе редактор, щоб обробити ці коміти, помітити цю команду:

#  r, reword = use commit, but edit the commit message

це саме нам потрібно!

Крок 2 : Змініть pickна rті зобов'язання, які ви хочете оновити. Не турбуйтеся тут змінювати повідомлення про фіксацію, воно буде проігноровано. Ви зробите це на наступному кроці. Збережіть і закрийте редактор.

Зауважте, що якщо ви відредагуєте "план" бази даних, він ще не розпочне процес перейменування файлів:

git rebase --continue

Якщо ви хочете змінити текстовий редактор, який використовується для інтерактивного сеансу (наприклад, з vi за замовчуванням на nano), запустіть:

GIT_EDITOR=nano git rebase -i HEAD~n

Крок 3 : Git з’явиться інший редактор для кожної редакції, яку ви розміщували rраніше. Оновіть msg фіксації за вашим бажанням, а потім збережіть і закрийте редактор.

Крок 4 : Після всіх комісій повідомлення оновлюються. ви можете зробити, git push -fщоб оновити пульт.


21
Ця відповідь повинна бути прийнятою, оскільки вона дає можливість змінити інші зобов'язання, ніж найновіші зобов'язання, на відміну від прийнятої відповіді. Ти врятував мені день. Дякую!
xZero

1
Виберіть n = 3 за останні 3 коміти:git rebase -i HEAD~3
HeikoS

Якщо ви відредагуєте "план" ребаїз, він ще не розпочне процес перезаймання файлів, запустіть git rebase --continue. І якщо ви хочете змінити текстовий редактор, який використовується для інтерактивного сеансу (наприклад, з типового viна nano), запустіть GIT_EDITOR=nano git rebase -i HEAD~n.
Джеймі Береза

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

Я запропонував редагувати, щоб помістити корисний коментар від @JamieBirch у відповідь, можливо, хочу переглянути.
Notts90 підтримує Моніку

44

Скористайтеся цими двома кроками в консолі:

git commit --amend -m "new commit message"

і потім

git push -f

Готово :)


Thx, це кроки лише для внесення змін до останнього коментаря чи його можна використовувати і для старих коментарів?
Джей

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

19

Слід зазначити, що якщо ви користуєтесь push --forceнеодноразовими рефлексами, вони ВСЕ будуть змінені в результаті. Не забудьте звернути увагу на те, куди налаштовано ваше git repo. На щастя, існує спосіб трохи захистити процес, вказавши одну гілку для оновлення. Читайте зі сторінок git man:

Зверніть увагу, що --force застосовується до всіх виправлених запитів, отже, використовуючи його з push.default, встановленим на відповідність, або з декількома напрямками push-налаштування, налаштованими з віддаленим. суворо за їх віддаленим колегою). Щоб натиснути лише на одну гілку, використовуйте + перед рефлексою для натискання (наприклад, git push origin + master, щоб примусити натиснути до гілки master).


3
Дуже важлива примітка.
peterh

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

11

Якщо ви хочете змінити старішу комісію, а не останню, вам потрібно буде використовувати rebaseкоманду, як пояснено тут, на сторінці довідки Github , в розділі " Змінення повідомлення старіших або декількох повідомлень про комісію".



8
git commit --amend

потім відредагуйте та змініть повідомлення у поточному вікні. Після цього зробіть

git push --force-with-lease

2

Іншим варіантом є створення додаткового "errata commit" (і натискання), який посилається на об'єкт "počin", який містить помилку - нове командування errata також забезпечує виправлення. Команда errata - це команда, яка не має суттєвих змін коду, але важливе повідомлення про фіксацію - наприклад, додайте один символ пробілу у файл readme та виконайте це зміна важливим повідомленням фіксації або скористайтеся параметром git--allow-empty . Це, звичайно, простіше і безпечніше, ніж перезавантажувати, це не змінює справжню історію, і воно підтримує чистоту дерева гілок (використовуючиamendце також хороший вибір, якщо ви виправляєте останню комісію, але помилка errata може бути хорошим вибором для старих комісій). Такі речі так рідко трапляються, що просто документувати помилку досить добре. Надалі, якщо вам потрібно здійснити пошук у журналі git за ключовим словом функції, оригінальний (помилковий) комітет може не з’являтися, оскільки неправильне ключове слово було використано в цьому оригінальному фіксації (оригінальний помилка) - однак ключове слово з’явиться в комірі errata, який потім вкаже вам на оригінальний комітет, який мав друк. Ось приклад:

$ git журнал
фіксувати 0c28141c68adae276840f17ccd4766542c33cf1d
Автор: Перший Останній 
Дата: Ср 8 серпня 15:55:52 2018 -0600

    Помилка Errata:
    Цей документ не змінює істотного коду.
    Ця фіксація надається лише для документального виправлення попереднього повідомлення про фіксацію.
    Це стосується здійснення об'єкта e083a7abd8deb5776cb304fa13731a4182a24be1
    Оригінальне повідомлення про неправильне здійснення:
        Колір фону змінено на червоний
    Виправлення (* зміна виділена *):
        Колір фону змінено на * синій *

фіксувати 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Автор: Перший Останній 
Дата: Ср 8 серпня 15:43:16 2018 -0600

    Деякі проміжні повідомлення про вчинення

привернути e083a7abd8deb5776cb304fa13731a4182a24be1
Автор: Перший Останній 
Дата: Ср 8 серпня 13:31:32 2018 -0600

    Колір фону змінено на червоний

грабувати, це виглядає перспективно. чи можете ви показати команди, необхідні для виконання "помилки errata". лише ця публікація відображається в Google на цих умовах.
Джим

1
"Команда errata" - це просто звичайна фіксація з повідомленням, яке посилається на попередню помилкову фіксацію, документування та надання виправлення попередньої помилки. git commit -m “fixed feature A”(Припустимо, git надає цьому ідентифікатор фіксації e3ab7312 ... ... (пізніше ви зрозумієте, що ваше повідомлення було невірним, тому тепер внесіть несуттєві зміни у файл, як-от додавання пробілу у файл readme, або скористайтеся параметром —allow-emptygit). .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc

1
... якщо пізніше вам буде потрібно шукати в журналі git для посилань на "функцію B", з'явиться фіксація errata, але повідомлення фіксації errata містить посилання на оригінальний ідентифікатор комісії, який забезпечує повну простежуваність. До речі, термін "errata commit" не є нічого особливого (немає жодної команди "errata", ані опції в git) ... це просто моя термінологія для нормальної фіксації, яка забезпечує виправлення попередньої комісії, яка мала помилку / помилку.
rob_7cc

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

Я радий, що працював на тебе. Я використовую ту саму техніку, щоб виправити помилки у вчиненні повідомлень. Як альтернативу, я нещодавно виявив, що git notes це послужило б тій самій цілі, що і "прихильність". Просто додайте примітку до попереднього зобов’язання, щоб анотувати або виправити будь-які помилки у повідомленні про виконання: https://git-scm.com/docs/git-notes
rob_7cc

0

Це працює для мене досить добре,

походження / назва філії git checkout

якщо ви вже у відділенні, то краще зайняти тягнути або переустановити

git pull

або

git -c core.quotepath=false fetch origin --progress --prune

Пізніше ви можете просто використовувати

git commit --amend -m "Your message here"

або якщо ви хочете відкрити текстовий редактор, тоді використовуйте

git commit --amend

Я вважаю за краще використовувати текстовий редактор, якщо у вас є багато коментарів. Ви можете встановити бажаний текстовий редактор за допомогою команди

git config --global core.editor your_preffered_editor_here

У будь-якому випадку, коли ви завершите зміну повідомлення про фіксацію, збережіть його та закрийте

а потім біжи

git push --force

І ви закінчили


0

додаткова інформація щодо тієї ж проблеми, якщо ви використовуєте конвеєр Bitbucket

відредагуйте ваше повідомлення

git commit --amend

підштовхнути до суворості

git push --force <repository> <branch>

потім додайте --force до вашої кнопкової команди на конвеєрі

git ftp push --force

Це видалить ваші попередні зобов'язання та підштовхне ваше поточне.

видаліть - сили після першого натискання

Я спробував це на трубопроводі bitbucket і його нормально працює

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