Как изменить существующие неопубликованные сообщения фиксации?

Я неправильно написал в сообщении коммита.

Как я могу изменить сообщение? Фиксация еще не отправлена.


  git commit --amend  

откроет ваш редактор, позволяя вам изменить сообщение фиксации самой последней фиксации. Кроме того, вы можете установить сообщение фиксации непосредственно в командной строке с помощью:

  git commit --amend -m «Новое сообщение фиксации»  

… однако это может сделать многострочные сообщения фиксации или небольшие исправления более громоздкими для ввода.

Убедитесь, что у вас нет изменений в рабочей копии поэтапно перед тем, как сделать это, иначе они тоже сделают это. ( Неустановленные изменения не фиксируются.)

Изменение сообщения фиксации, которую вы уже отправили в удаленную ветку

Если вы уже отправили фиксацию в удаленную ветку, то — после внесения изменений в фиксацию локально (как описано выше) — вам также потребуется принудительно нажать фиксацию с помощью:

   git push   --force # Orgit push   -f  

Предупреждение: принудительное нажатие перезапишет удаленную ветку с состоянием вашей локальной . Если в удаленной ветке есть коммиты, которых нет в вашей локальной ветке, вы потеряете эти коммиты.

Предупреждение: будьте осторожны при внесении изменений в коммиты, которыми вы уже поделились с другими людьми. При внесении поправок они по существу перезаписывают их так, чтобы они имели другие идентификаторы SHA, что создает проблему, если у других людей есть копии старых совершить то, что вы переписали. Любой, у кого есть копия старого коммита, должен будет синхронизировать свою работу с вашим недавно переписанным коммитом, что иногда может быть сложно, поэтому убедитесь, что вы координируете свои действия с другими при попытке переписать общую историю коммитов, или просто избегайте переписывания общих коммитов. все вместе.


Выполнить интерактивную перебазировку

Другой вариант — использовать интерактивную перебазировку. Это позволяет редактировать любое сообщение, которое вы хотите обновить, даже если это не последнее сообщение.

Чтобы выполнить сквош Git, выполните следующие действия:

 //n - количество зафиксированных  до последнего коммита, который вы хотите редактировать git rebase -i HEAD ~ n  

После того, как вы раздавите свои коммиты — выберите e/r для редактирования сообщения:

Важное примечание об интерактивном перемещении

Когда вы используете git rebase -i HEAD ~ n , может быть больше , чем n коммитов. Git «соберет» все коммиты в последних n коммитах, и если где-то между этим диапазоном произошло слияние, вы также увидите все коммиты, так что результат будет n +.

Хороший совет:

Если вам нужно сделать это для нескольких веток и вы можете столкнуться с конфликтами при изменении содержимого, настройте git rerere , и пусть Git автоматически разрешит эти конфликты за вас.


Документация

  • git-commit (1) Страница руководства

  • git-rebase (1) Страница руководства

  • git-push (1) Страница вручную


2550
  git commit --amend -m "ваше новое сообщение"  

отредактировано 01 марта ’16 в 18:19
David Ferenczy Rogožan
17.6k88 золотых знаков6464 серебряных знака6464 бронзовых знака
ответ дан 08 фев. 2010 в 16:26
  • 8
    Я сделал git commit —amend -m «Новое сообщение», но нажатие на Github сгенерировало «Объедините удаленные изменения перед повторным нажатием». После извлечения зафиксируйте —amend и снова нажмите, новое сообщение не появляется. Вместо этого у меня есть «Мастер слияния веток github.com:[myrepo]» — Дэйв Эверитт, 14 октября 2011 г., 16:58
  • 8
    @DaveEveritt, скорее всего, вы отправили свой коммит вверх по течению, прежде чем пытаться его исправить. — Торбьёрн Равн Андерсен 25 апр. ’13 в 8:21
  • 12
    @Kyralessa неправда. В bash вы можете легко составлять многострочные сообщения фиксации, просто не закрывая цитату, пока не закончите (нажимая return в конце каждой строки внутри кавычек). — hobs 11 июня ’13 в 21:11
  • 35
    Я не понимаю, как ответ, который очень похож на основную идею ответа, написанного два года назад, а также принятый ответ получает так много голосов. Странный. (хотя в ответе нет ничего плохого) — счастливый программист 15 января 2014 г., 17:30
  • 9
    @AmalMurali, хорошо. Я имел в виду не столько популярность вопроса, ни полезность ответа. Но этот конкретный ответ не является самым старым ответом и не предлагает дальнейшего понимания принятого ответа. Похоже, это копия раздела принятого ответа. Это была моя точка зрения. ПРИВЕТСТВУЕТ! — happy coder 21 мая 2014, 20:16
| показать 10 дополнительных комментариев

  git commit --amend -m "ваш новый  сообщение " 

2412

Если фиксация, которую вы хотите исправить, не самая последняя:

  1. git rebase --interactive $ parent_of_flawed_commit

    Если вы хотите исправить несколько ошибочных коммитов, передайте родительский элемент самого старого из них.

  2. Появится редактор со списком всех коммитов, начиная с того, что вы дали.

    1. Измените pick на reword ( или в старых версиях Git для edit ) перед любыми коммитами, которые вы хотите исправить.
    2. После сохранения Git воспроизведет перечисленные коммиты.
  3. Для каждого коммита, который вы хотите перефразировать , Git вернет вас в ваш редактор. Для каждой фиксации, которую вы хотите редактировать , Git помещает вас в оболочку. Если вы находитесь в оболочке:

    1. Измените фиксацию любым способом.
    2. git commit --amend
    3. git rebase --continue

Большая часть эта последовательность будет объяснена вам по ходу выполнения различных команд. Это очень легко; вам не нужно запоминать его — просто помните, что git rebase --interactive позволяет исправлять коммиты независимо от того, как давно они были.


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

отредактировано 2 ноября ’19 в 11:58
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 7 октября ’08 в 19:52
  • 42
    Можно ли изменить сообщение первой фиксации (у которой нет родителя)? — 13рен, 21 янв. 2010, 19:57
  • 28
    Это упоминается в одном из других ответов, но я отмечу это здесь. Начиная с git 1.6.6, вы можете использовать reword вместо pick для редактирования сообщения журнала.. — MitMaro 31 мая 2010 г., 13:27
  • 90
    Между прочим, $ parent_of_flawed_commit эквивалентен $ flawed_commit ^ . — Peeja, 28 ноя. 2010, в 23:26
  • 68
    НИКОГДА не делайте этого (или вообще не выполняйте перестановку), если вы уже продвинулись вверх по течению! — Дэниел Ринсер, 31 мая 2011 г., в 19:14
  • 21
    Используйте -p ( - preserve-merges ), если после некорректной фиксации произошло слияние. — ahven 31 янв. ’12 в 14:37
| показать 9 дополнительных комментариев

Если фиксация, которую вы хотите исправить, не самая последняя:

  1. git rebase --interactive $ parent_of_flawed_commit

    Если вы хотите исправить несколько ошибочные коммиты, передайте родительский элемент самого старого из них.

  2. Появится редактор со списком всех коммитов, начиная с того, который вы дали.

    1. Измените pick на reword (или в старых версиях Git, чтобы редактировать ) перед любыми коммитами, которые вы хотите исправить.
    2. После сохранения Git воспроизведет перечисленные коммиты.
  3. Для каждого коммита, который вы хотите перефразировать , Git вернет вас в ваш редактор. Для каждой фиксации, которую вы хотите редактировать , Git помещает вас в оболочку. Если вы находитесь в оболочке:

    1. Измените фиксацию любым способом.
    2. git commit --amend
    3. git rebase --continue

Большая часть эта последовательность будет объяснена вам по ходу выполнения различных команд. Это очень легко; вам не нужно запоминать его — просто помните, что git rebase --interactive позволяет исправлять коммиты независимо от того, как давно они были.


Обратите внимание, что вы не захотите изменять уже отправленные вами коммиты. Или, может быть, вы это сделаете, но в этом случае вам придется очень внимательно общаться со всеми, кто, возможно, вытащил ваши коммиты и проделал работу поверх них. Как мне восстановить/повторно синхронизировать после того, как кто-то нажмет на перебазирование или сброс на опубликованную ветку?


793

Чтобы исправить предыдущую фиксацию, внесите нужные изменения и выполните эти изменения, а затем запустите

  git commit --amend  

Это откроет в вашем текстовом редакторе файл, представляющий ваше новое сообщение фиксации. Он начинается с текста из вашего старого сообщения о фиксации. Измените сообщение фиксации, как хотите, затем сохраните файл и выйдите из редактора, чтобы закончить.

Чтобы изменить предыдущую фиксацию и сохранить то же сообщение журнала, запустите

  git commit --amend -C HEAD  

Чтобы исправить предыдущую фиксацию, полностью удалив ее, запустите

  git reset --hard HEAD ^  

Если вы хотите отредактировать более одного сообщения фиксации, запустите

  git rebase -i HEAD ~  commit_count   

(Замените commit_count числом коммитов, которые вы хотите отредактировать.) Эта команда запускает ваш редактор. Отметьте первую фиксацию (ту, которую вы хотите изменить) как «редактировать» вместо «выбрать», затем сохраните и выйдите из редактора. Внесите изменение, которое хотите зафиксировать, а затем запустите

  git commit --amendgit rebase --continue  

Примечание. Вы можете также «Внесите нужные изменения» в редакторе, открытом с помощью git commit --amend

отредактировано 2 ноября ’19 в 12:03
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 15 августа 2011 в 21:20
  • 20
    git rebase -i HEAD ~ commit_count также позволит вам изменить сообщения фиксации любого количества коммитов по вашему выбору. Просто отметьте выбранные коммиты как «reword» вместо «pick». — Джо 21 августа 2013 в 20:21
  • 2
    Что делать, если вы не хотите перебазировать? Вы просто хотите изменить старое сообщение? — SuperUberDuper, 21 апр. 2016, 20:56
  • 3
    git reset --hard уничтожает незафиксированные изменения. Замените - hard на - soft . — eel ghEEz, 28 фев. ’18 в 17:44
  • 2
    Согласен, git reset --hard — вполне законная команда, но, учитывая вопрос, она вводит в заблуждение. Вы используете - hard , если вы зафиксировали изменения, которые хотите выбросить, а не если вы сделали опечатку в сообщении о фиксации! — Сорен Бьорнстад 22 июл. ’19 в 13:52
добавить комментарий |

Чтобы исправить предыдущую фиксацию, внесите нужные изменения и выполните эти изменения, а затем запустите

   git commit --amend  

Это откроет в вашем текстовом редакторе файл, представляющий ваше новое сообщение фиксации. Он начинается с текста из вашего старого сообщения о фиксации. Измените сообщение фиксации, как хотите, затем сохраните файл и выйдите из редактора, чтобы закончить.

Чтобы изменить предыдущую фиксацию и сохранить то же сообщение журнала, запустите

  git commit --amend -C HEAD  

Чтобы исправить предыдущую фиксацию, полностью удалив ее, запустите

  git reset --hard HEAD ^  

Если вы хотите отредактировать более одного сообщения фиксации, запустите

  git rebase -i HEAD ~  commit_count   

(Замените commit_count числом коммитов, которые вы хотите отредактировать.) Эта команда запускает ваш редактор. Отметьте первую фиксацию (ту, которую вы хотите изменить) как «редактировать» вместо «выбрать», затем сохраните и выйдите из редактора. Внесите изменение, которое хотите зафиксировать, а затем запустите

  git commit --amendgit rebase --continue  

Примечание. Вы можете также «Внесите нужные изменения» в редакторе, открытом с помощью git commit --amend


404

Как уже упоминалось, git commit --amend — это способ перезаписать последнюю фиксацию. Одно замечание: если вы хотите также перезаписать файлы , используйте команду

  git commit -a --amend -m "  Мое новое сообщение о фиксации " 

отредактировано 23 февраля ‘ 14, 23:10
Steven Penny
78.1k4747 золотых знаков301301 серебряных знака344344 бронзовых знака
ответил 06 июня 2011 в 21:16
  • 4
    И если вы не хотите добавлять все, вы можете сначала выполнить git add file.ext , затем просто git commit --amend — MalcolmOcean, 22 сен 2015 в 05:56
добавить комментарий |

Как уже упоминалось, git commit --amend — это способ перезаписать последнюю фиксацию. Одно замечание: если вы хотите также перезаписать файлы , используйте команду

  git commit -a --amend -m "  Мое новое сообщение фиксации " 

361

Вы также можете использовать для этого git filter-branch .

  git filter-branch -f --msg-filter "sed '  s/errror/error/'"$ flawed_commit..HEAD  

Это не так просто, как тривиальный git commit --amend , но это особенно полезно, если у вас уже есть несколько слияний после вашего ошибочного сообщения о фиксации.

Обратите внимание, что это будет пытаться перезаписать каждую фиксацию между HEAD и ошибочной фиксацией, поэтому вам следует выбрать свой msg-filter очень мудро 😉

отредактировал 02 ноября ’19 в 12:04
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 01 сен ’12 в 20:35
  • 4
    Есть ли такая версия, которая не изменяет фиксацию, если регулярное выражение ничего не находит? — sjakubowski 28 марта 2013, 20:08
  • 3
    AFAIK filter-branch —msg-filter в любом случае будет генерировать новые коммиты. Однако вы можете проверить в msg-filter, успешно ли выполняется sed, и использовать эту информацию, когда операция filter-branch завершится, чтобы сбросить ваше дерево до refs/original. — Отметить 29 марта ’13 в 16:16
  • 4
    @DavidHogue Это верно только при использовании метода ветвления фильтра. Идентификаторы фиксации, следующие за измененной фиксацией, не изменяются, если вы используете интерактивную перебазировку. — Марк 06 июля ’13 в 19:08
  • 6
    @Mark Да, они обязаны. Идентификаторы коммитов зависят от предыдущих коммитов. Если бы они не изменились, git был бы бесполезен. — Miles Rout 11 января 2014, 16:45
  • 2
    Вам понадобится $ flawed_commit ^ .. HEAD , а не $ flawed_commit..HEAD . как указано на странице руководства: « Команда перезапишет только положительные ссылки, упомянутые в командной строке (например, если вы передадите a..b, будет перезаписан только b). » — Анхель 29 июл. ’14 в 11: 18
добавить комментарий |

Для этого вы также можете использовать git filter-branch .

  git filter-branch -f --msg-filter "sed 's/errror/error/'" $ flawed_commit..HEAD  

Это не так просто как тривиальный git commit --amend , но он особенно полезен, если у вас уже есть некоторые слияния после вашего ошибочного сообщения о фиксации.

Обратите внимание, что это будет пытаться перезаписать каждую фиксацию между HEAD и ошибочной фиксацией, поэтому вам следует выбрать свой msg-filter очень мудро 😉


323

Я предпочитаю этот способ:

  git commit --amend -c   

В противном случае будет новая фиксация с новым идентификатором фиксации.

отредактировал 02 ноября ’19 в 12:17
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 10 января ’13 в 14:23
  • 8
    Для меня использование вашей команды, приведенной выше, фактически создает новую фиксацию с новым идентификатором фиксации плюс дополнительная фиксация, говорящая «ветвь слияния» как сообщение фиксации по умолчанию. — 29 янв., 16:27
  • 46
    Изменение always создает новую фиксацию с новым идентификатором фиксации. Идентификатор фиксации — это SHA-хэш содержимого фиксации, включая сообщение фиксации и отметки времени создания/фиксации. Это особенность Git, которая, исключая конфликты хэшей, гарантирует, что две фиксации с одним и тем же идентификатором будут в точности одной и той же фиксацией, с одинаковым содержимым, историей и т. Д. — Эмиль Лундберг, 19 июня 2013, 9:30
  • 7
    Согласен с Эмилем. Вдобавок, чтение документации — кажется, что все «-c» указывает git, какое сообщение фиксации использовать в качестве шаблона/шаблона по умолчанию для вашего нового коммита .. На самом деле он уже будет делать «-c » по умолчанию , поэтому указывать его не нужно. — Гал, 29 сен, 29:12
  • 2
    -c делает несколько вещей. По умолчанию он использует старое сообщение, но также копирует информацию об авторстве (человек и время). -C делает то же самое, за исключением того, что не просит вас редактировать сообщение. — Джозеф К. Штраус, 28 дек. ’14 в 2:55
  • 1
    Как @SantanuDey, у меня это не сработало. Я получил фатальный: параметр -m нельзя комбинировать с -c/-C/-F/- fixup. — Эндрю Гримм, 14 апреля 2015 г., 17:22
| показать 2 дополнительных комментария

Я предпочитаю этот способ:

  git commit --amend -c   

В противном случае будет новая фиксация с новым идентификатором фиксации.


315

Если вы используете графический интерфейс Git инструмент, есть кнопка с именем Изменить последнюю фиксацию . Нажмите на эту кнопку, и тогда она отобразит ваши последние файлы и сообщение фиксации. Просто отредактируйте это сообщение, и вы сможете зафиксировать его с новым сообщением фиксации.

Или используйте эту команду из консоли/терминала:

  git  commit -a --amend -m "Мое новое сообщение о фиксации"  

отредактировал 2 ноября ’19 в 12:10
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 08 нояб., в 3:51
  • 5
    Этот ответ буквально идентичен предыдущему. Вы проверили существующие ответы перед тем, как дать еще один? — Дэн Даскалеску 2 мая ’19 в 1:15
добавить комментарий |

Если вы используете инструмент Git GUI, есть кнопка с именем Изменить последнюю фиксацию . Нажмите на эту кнопку, и тогда она отобразит ваши последние файлы фиксации и сообщение. Просто отредактируйте это сообщение, и вы сможете зафиксировать его с новым сообщением фиксации.

Или используйте эту команду из консоли/терминала:

  git  commit -a --amend -m "Мое новое сообщение о фиксации"  

288

Вы можете использовать Git rebase. Например, если вы хотите изменить обратно, чтобы зафиксировать bbc643cd, запустите

  $ git rebase bbc643cd ^ --interactive  

В в редакторе по умолчанию измените ‘pick’ на ‘edit’ в строке, фиксацию которой вы хотите изменить. Внесите изменения, а затем выполните их с помощью

  $ git add  

Теперь вы можете использовать

  $ git commit --amend  

для изменения фиксации, а после этого

   $ git rebase --continue  

, чтобы вернуться к предыдущей фиксации головы.

отредактировано 16 марта ’13 в 9:39
Питер Мортенсен
27. 2k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответ дан 22 янв. >
  • 1
    Если вы хотите убедиться, что вы изменили git commit --amend повлиял, вы можете использовать git show , и он покажет новое сообщение. — Стив Таубер, 19 фев. ’13 в 20:12
добавить комментарий |

Вы можете использовать Git rebase. Например, если вы хотите изменить обратно, чтобы зафиксировать bbc643cd, запустите

  $ git rebase bbc643cd ^ --interactive  

В в редакторе по умолчанию измените ‘pick’ на ‘edit’ в строке, фиксацию которой вы хотите изменить. Внесите изменения, а затем выполните их с помощью

  $ git add  

Теперь вы можете использовать

  $ git commit --amend  

для изменения фиксации, а после этого

   $ git rebase --continue  

для возврата к предыдущей фиксации головы.


281
  1. Если вы хотите изменить только последнее сообщение фиксации, выполните:

      git commit --amend  

Это перенесет вас в текстовый редактор и позволит вам изменить последнюю фиксацию сообщение.

  1. Если вы хотите изменить последние три сообщения фиксации или любое из сообщений фиксации до этого момента, укажите HEAD ~ 3 в команду git rebase -i :

      git rebase -i HEAD ~ 3  
iv>

отредактировано 2 ноября ’19 в 12:07
Peter Mortensen
27.3k2121 золотых знаков9393 серебряных знака123123 бронзовых знака
Создан 22 окт. в 14: 22
  • 6
    В этом более раннем ответе уже говорится, что вы можете использовать git commit --amend , а также говорится, что вы можете использовать git rebase -i HEAD ~ commit_count , все вы уже подключили 3 для commit_count . — user456814 23 июля ’14 в 12:21
  • Также проголосовали против. Люди просто не удосуживаются читать существующие ответы. — Дэн Даскалеску 2 мая ’19 в 1:16
добавить комментарий |

  1. Если вы хотите изменить только последнее сообщение фиксации, выполните:

      git commit --amend  

Это перенесет вас в текстовый редактор и позволит вам изменить последний сообщение фиксации.

  1. Если вы хотите изменить последние три сообщения фиксации или любое из сообщений фиксации до этого момента, укажите HEAD ~ 3 в команду git rebase -i :

      git rebase -i HEAD ~ 3  

264

Если вам нужно изменить старое сообщение фиксации в нескольких ветвях (т. Е. Фиксация с ошибочным сообщением присутствует в нескольких ветвях), вы можете использовать:

  git filter-  branch -f --msg-filter  'sed "s///g"' - --all  

Git создаст временный каталог для переписывания и рекламы дополнительно сделайте резервную копию старых ссылок в refs/original/.

  • -f будет принудительно выполнить операцию. Это необходимо, если временный каталог уже существует или уже есть ссылки, хранящиеся в refs/original . Если это не так, вы можете сбросить этот флаг.

  • - отделяет параметры ветвления фильтра от параметров редакции .

  • - все гарантирует, что все ветки и теги перезаписываются.

Благодаря резервному копированию ваших старых ссылок вы можете легко вернуться в состояние до выполнения команды.

Скажем, вы хотите восстановить свой мастер и получить к нему доступ в ветке old_master :

  git checkout -b  old_master refs/original/refs/heads/master  

отредактировал 02 ноября ’19 в 12:13
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
15 нояб. ’12 в 9:29
  • 3
    Этот ответ не отвечает на вопрос OP, поскольку они просто заинтересованы в исправлении фиксации, которую они только что закончил. Я регулярно использую git commit --amend , чтобы исправить комментарии или добавить файлы, которые я забыл в git add , но только когда-либо прежде чем я git push ed. Я также использую git filter-branch , когда хочу полностью испортить историю версий, но OP этого не хочет, поэтому для этого ответа требуется большое предупреждение о здоровье — не пытайтесь это дома выглядывает !! — kbro 29 июн. ’13 в 3:17
добавить комментарий |

Если вам нужно изменить старое сообщение фиксации в нескольких ветках (т. е. фиксация с ошибочным сообщением присутствует в нескольких ветках), вы может захотеть использовать:

  git filter-branch -f --msg-filter  'sed "s///g"' -  - --all  

Git создаст временный каталог для перезаписи и дополнительного резервного копирования старых ссылок в refs/original/.

  • -f принудительно выполнит операцию. Это необходимо, если временный каталог уже существует или уже есть ссылки, хранящиеся в refs/original . Если это не так, вы можете сбросить этот флаг.

  • - отделяет параметры ветвления фильтра от параметров редакции .

  • - все гарантирует, что все ветки и теги перезаписываются.

Благодаря резервному копированию ваших старых ссылок вы можете легко вернуться в состояние до выполнения команды.

Скажем, вы хотите восстановить своего мастера и получить к нему доступ в ветке old_master :

  git checkout -b  old_master refs/original/refs/heads/master  

228

Используйте

  git commit --amend  

Чтобы понять это подробно, отличный пост 4. Переписываем историю Git . Здесь также говорится о , когда не использовать git commit --amend .

отредактировано 22 мая ’18 в 19:46
ответил 27 марта ’13 в 20:43
  • 2
    Есть ли хороший способ исправить сообщения фиксации, уже отправленные в общедоступный репозиторий? Пока что я пришел к выводу, что после того, как я нажму, мои опечатки в коммитах и ​​мысли должны жить вечно. — stackunderflow 4 июня ’13 в 11:32
  • 2
    Одним словом, НЕТ! Нет ХОРОШЕГО способа отозвать то, что вы толкнули. Все отзывы в большей или меньшей степени ПЛОХО. Вам нужно научиться работать в ветке в вашем собственном частном репозитории, делать несколько коммитов по мере добавления, тестирования и настройки.. Затем объедините всю свою ветку в одну фиксацию, напишите новое сообщение фиксации, описывающее общее изменение, ПРОЧИТАЙТЕ его и нажмите. — kbro, 29 июня ’13 в 3:29
  • 1
    Просто чтобы указать на очевидное, что при возврате из функциональной ветки не нужно делать ни одной фиксации. Что делают многие люди, так это переустанавливают целевую ветку (чтобы все выглядело чисто), а затем объединяют с опцией подавления быстрой перемотки. Однако согласитесь с основным принципом осторожности, прежде чем отжиматься. — ShawnFumo, 11 сен. ’13 в 18:20
  • 1
    Ответ git commit --amend уже был дан (несколько раз) до того, как вы написали свой. Почему ты выложил это снова? Если вы хотите добавить ссылку на «Переписывание истории Git», вы могли бы отредактировать один из существующих ответов или оставить комментарий. — Дэн Даскалеску 2 мая ’19 в 1:17
добавить комментарий |

Используйте

  git commit --amend  

Чтобы понять это подробно, отличный пост — это 4. Переписываем историю Git . В нем также говорится о , когда не использовать git commit --amend .


206

Если это ваша последняя фиксация, просто исправьте фиксацию:

  git commit --amend -o -m "Новое сообщение фиксации"  

(Использование - o ( - only ), чтобы убедиться, что вы изменяете только сообщение фиксации)

Если это скрытый коммит, используйте замечательную интерактивную перебазировку :

  git rebase -i @ ~ 9 #  Показать последние 9 коммитов в текстовом редакторе  

Найдите нужную фиксацию, измените pick на r ( reword ), сохраните и закройте файл. Готово!


Миниатюрное руководство по Vim (или, как выполнить перебазирование всего с 8 нажатиями клавиш 3j cw r Esc ZZ ):

  • Запустите vimtutor , если у вас есть время
  • h j k l соответствуют клавишам перемещения
  • Все команды могут иметь префикс «диапазон», например. 3j перемещает на три строки вниз
  • i для перехода в режим вставки — набранный вами текст появится в файле
  • Esc или Ctrl c для выхода из режима вставки и возврата в «нормальный» режим.
  • u для отмены
  • Ctrl r для повторения
  • dd , dw , dl для удаления строки, слова или буквы соответственно
  • cc , cw , cl для изменения строки, слова или буквы соответственно (то же, что и ddi )
  • yy , yw , yl для копирования («восстановления») строки, слова или буквы соответственно
  • p или P вставить после или перед текущей позицией соответственно
  • : w Enter для сохранения (записи) файла
  • : q! Enter для выхода без сохранение
  • : wq Enter или ZZ для сохранения и выхода.

Если вы много редактируете текст, затем переключитесь на раскладку клавиатуры Дворжака, научитесь печатать вслепую и выучите Vim. Стоит ли прилагать усилия? Да.


ProTip ™: не бойтесь экспериментировать с «опасными» командами, которые перезаписывают историю * — По умолчанию Git не удаляет ваши коммиты в течение 90 дней; вы можете найти их в журнале ссылок:

  $ git reset @ ~ 3 # Вернитесь на три коммита $ git reflogc4f708b HEAD @ {0}: reset: переход к @ ~ 32c52489 HEAD  @ {1}: commit: more changes4a5246d HEAD @ {2}: commit: make important changese8571e4 HEAD @ {3}: commit: внести некоторые изменения ... более ранние коммиты ... $ git reset 2c52489 ... и вы  с того места, где вы начали  

* Не упустите такие параметры, как - hard и - force однако — они могут отбрасывать данные. * Кроме того, не перезаписывайте историю ни в каких ветвях, над которыми вы работаете.

отредактировано 2 ноября ’19 в 12:55
Питер Мортенсен
27. 3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 10 февр. В 0:01
  • 3
    Часть vim полностью не по теме, и вместо побуждая пользователей тратить время на обучение использованию загадочного редактора, почему бы не научить их чему-то более тематическому, например, как настроить редактор git по умолчанию, чтобы он был удобен для пользователя, например nano ? Мы говорим о тривиальных модификациях, которые необходимо внести в текстовый файл, а не о жестком кодировании, которое могло бы вызвать ожесточенную войну за «лучший» текстовый редактор. — Дэн Даскалеску 2 мая ’19 в 1:19
  • 1
    @DanDascalescu: потому что быстрее изучить Vim с помощью приведенных выше инструкций, чем выполнять несколько перебазов с помощью nano. Вся причина, по которой git открывает текстовый редактор, а не свой собственный интерфейс для перебазирования, заключается в том, что существует Vim: он легкий, установлен по умолчанию в большинстве систем и очень прост в освоении, чтобы с легкостью выполнить перебазирование: например, ddjjpZZ перемещает фиксацию на 2 вниз. В базовых знаниях Vim нет ничего загадочного; требуется 10 минут, чтобы освоиться с Vim более комфортно, чем с nano. — Zaz 2 мая ’19 в 22:07
добавить комментарий |

Если это ваша последняя фиксация, просто исправьте фиксацию:

  git commit --amend -o -m "Новое сообщение фиксации"  

(Использование -o ( - only ), чтобы убедиться, что вы изменяете только сообщение фиксации)

Если это скрытый коммит, используйте потрясающую интерактивную перебазировку :

  git rebase -i @ ~ 9 # Показать последнюю  9 коммитов в текстовом редакторе  

Найдите нужную фиксацию, измените pick на r ( reword ), а затем сохраните и закройте файл. Готово!


Миниатюрное руководство по Vim (или, как выполнить перебазирование всего с 8 нажатиями клавиш 3j cw r Esc ZZ ):

  • Запустите vimtutor , если у вас есть время
  • h j k l соответствуют клавишам перемещения
  • Все команды могут иметь префикс «диапазон», например. 3j перемещает на три строки вниз
  • i для перехода в режим вставки — набранный вами текст появится в файле
  • Esc или Ctrl c для выхода из режима вставки и возврата в «нормальный» режим.
  • u для отмены
  • Ctrl r для повторения
  • dd , dw , dl для удаления строки, слова или буквы соответственно
  • cc , cw , cl для изменения строки, слова или буквы соответственно (то же, что и ddi )
  • yy , yw , yl для копирования («восстановления») строки, слова или буквы соответственно
  • p или P вставить после или перед текущей позицией соответственно
  • : w Enter для сохранения (записи) файла
  • : q! Enter для выхода без сохранение
  • : wq Enter или ZZ для сохранения и выхода.

Если вы много редактируете текст, затем переключитесь на раскладку клавиатуры Дворжака, научитесь печатать вслепую и выучите Vim. Стоит ли прилагать усилия? Да.


ProTip ™: не бойтесь экспериментировать с «опасными» командами, которые перезаписывают историю * — По умолчанию Git не удаляет ваши коммиты в течение 90 дней; вы можете найти их в журнале ссылок:

  $ git reset @ ~ 3 # Вернитесь на три коммита $ git reflogc4f708b HEAD @ {0}: reset: переход к @ ~ 32c52489 HEAD  @ {1}: commit: more changes4a5246d HEAD @ {2}: commit: make important changese8571e4 HEAD @ {3}: commit: внести некоторые изменения ... более ранние коммиты ... $ git reset 2c52489 ... и вы  с того места, где вы начали  

* Не упустите такие параметры, как - hard и - force однако — они могут сбрасывать данные. * Кроме того, не перезаписывайте историю ни в каких ветвях, над которыми вы работаете.


200

Изменить

У вас есть несколько вариантов здесь . Вы можете делать

  git commit --amend  

, пока это ваша последняя фиксация.

Интерактивная перебазировка

В противном случае, если это не ваша последняя фиксация, вы можете выполнить интерактивную перебазировку

  git rebase -i [branched_from]  [хеш перед фиксацией]  

Затем внутри интерактивной перебазировки вы просто добавляете правку к этой фиксации. Когда он появится, выполните git commit --amend и измените сообщение фиксации.. Если вы хотите выполнить откат до этой точки фиксации, вы также можете использовать git reflog и просто удалить эту фиксацию. Затем вы снова просто выполняете git commit .

отредактировал 2 ноября ’19 в 12:20
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 18 января ’13 в 1:45
добавить комментарий |

Изменить

У вас есть несколько вариантов. Вы можете делать

  git commit --amend  

, пока это ваша последняя фиксация.

Интерактивная перебазировка

В противном случае, если это не ваша последняя фиксация, вы можете выполнить интерактивную перебазировку

  git rebase -i [branched_from]  [хеш перед фиксацией]  

Затем внутри интерактивной перебазировки вы просто добавляете правку к этой фиксации. Когда он появится, выполните git commit --amend и измените сообщение фиксации. Если вы хотите выполнить откат до этой точки фиксации, вы также можете использовать git reflog и просто удалить эту фиксацию. Затем вы снова просто выполняете git commit .


185

Если вы используете графический интерфейс Git, вы можете изменить последнюю фиксацию, которая не была отправлена, с помощью:

  Commit/Amend  Последняя фиксация  

отредактировал 16 марта ’13 в 9 : 37
Peter Mortensen
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 1 дек. 12 в 5:03
добавить комментарий |

Если вы используете графический интерфейс Git, вы можете изменить последний коммит, который не был отправлен, с помощью:

  Фиксация/изменение последней фиксации  

168

Я использую графический интерфейс Git как можно чаще, и это дает вам возможность изменить последнюю фиксацию:

Кроме того, git rebase -i origin/master — это хорошая мантра, которая всегда будет представлять вам коммиты, которые вы сделали поверх мастера, и дать вам возможность изменить, удалить, переупорядочить или сжать. Нет необходимости сначала получать этот хеш.

отредактировано 21 мая ’14 в 02:44
Amal Murali
69.3k1717 золотых знаков119119 серебряных знаков139139 бронзовых знаков
ответил 04 августа 2013 в 23:13
  • 4
    Как мне попасть на тот экран, который вы показали в своем примере? — Марван مروان 24 июня ’14 в 20:01
  • 2
    Это нижняя правая часть Windows Git Gui. Просто выберите переключатель «Изменить последнюю фиксацию», и он заполнится самой последней информацией о фиксации. — wbdarby 29 янв. ’16 в 16:51
добавить комментарий |

Я использую графический интерфейс Git по мере возможности, и это дает вам возможность изменить последний коммит:

Также git rebase -i origin/master — хорошая мантра, которая всегда будет представлять вам коммиты, которые вы сделали поверх master, и дает вам возможность изменить, удалить, переупорядочить или сжать. Нет необходимости сначала получать этот хеш.


139

Ух ты, есть много способов сделать это.

Еще один способ сделать это — удалить последний коммит, но сохранить его изменения, чтобы не потерять Работа. Затем вы можете сделать еще одну фиксацию с исправленным сообщением. Это будет выглядеть примерно так:

  git reset --soft HEAD ~ 1git commit -m 'Новое и исправленное сообщение фиксации'  

Я всегда делаю это, если забываю добавить файл или внести изменения.

Не забудьте указать - soft вместо - жестко , иначе вы полностью потеряете эту фиксацию.

отредактировал 20 июля ’14 в 8:21
user456814
ответил 02 декабря 2013 в 21:31
  • 5
    Это делает то же самое, что и git commit --amend за исключением того, что это двухэтапный процесс. — Джозеф К. Штраус, 28 дек. ’14 в 2:58
  • 3
    @ JosephK.Strauss Я считаю, что при изменении фиксации также сохраняется исходная информация об авторе и дате фиксации, поскольку информация о новом коммитере и дате сохраняется отдельно. не уверен, что этот подход делает это. — Эвертон 7 мая 2016, 23:13
  • 4
    @EvertonAgner Вы правы. - изменить сохранит информацию об авторе, но вопрос только просит изменить сообщение. — Джозеф К. . Strauss 9 мая ’16 в 13:59
добавить комментарий |

Ух ты, есть много способов сделать это.

Еще один способ сделать это — оставьте последний коммит, но сохраните его изменения, чтобы не потерять свою работу. Затем вы можете сделать еще одну фиксацию с исправленным сообщением. Это будет выглядеть примерно так:

  git reset --soft HEAD ~ 1git commit -m 'Новое и исправленное сообщение фиксации'  

Я всегда делаю это, если забываю добавить файл или внести изменения.

Не забудьте указать - soft вместо - жестко , иначе вы полностью потеряете эту фиксацию.


135

Всем, кто ищет графический интерфейс для Windows/Mac, помогающий редактировать старые сообщения (то есть не только последнее сообщение), я бы порекомендовал Sourcetree. Действия, которые необходимо выполнить, приведены под изображением.

Для коммитов, которые еще не были отправлены на удаленный компьютер:

  1. Убедитесь, что вы зафиксировали или сохранили все текущие изменения (т.е. не являются файлами, перечисленными на вкладке «Состояние файла») — иначе это не сработает.
  2. На вкладке «Журнал/История» щелкните правой кнопкой мыши запись с примыкающей линией на графике один под коммитами, которые вы хотите отредактировать, и выберите «Перебазировать дочерние элементы в интерактивном режиме …»
  3. Выделите всю строку для сообщения фиксации, которое вы хотите изменить (щелкните столбец «Сообщение») .
  4. Нажмите кнопку «Редактировать сообщение» .
  5. В открывшемся диалоговом окне отредактируйте сообщение, как необходимо, а затем нажмите OK .
  6. Повторите шаги 3-4, если необходимо изменить другие сообщения фиксации.
  7. Нажмите OK : начнется изменение базы. Если все в порядке, вывод будет завершен «Завершено успешно».. ПРИМЕЧАНИЕ. Я иногда видел, что это не удается с Невозможно создать 'project_path/.git/index.lock': файл существует. при попытке изменить несколько сообщений фиксации одновременно. Не уверен, в чем именно заключается проблема, и будет ли она исправлена ​​в будущей версии Sourcetree, но если это произойдет, я рекомендую переустанавливать их по одному (медленнее, но кажется более надежным).

… Или … для коммитов, которые уже были отправлены:

Следуйте инструкциям в этом ответе, которые аналогично приведенному выше, но требует, чтобы из командной строки была запущена дополнительная команда ( git push origin -f ), чтобы принудительно нажать ветку. Я бы рекомендовал прочитать все это и проявить необходимую осторожность!

изменён 15 сен ’20 в 10:02
Shotokan
54922 серебряных знака2020 бронзовых знаков
ответил 6 ноя ’14 в 15:01
  • вне все ответы — это самый подходящий вариант для всех новичков в git ^^^ (используйте бесплатную программу SourceTree и примените «Rebase children of» к фиксации перед той, которую вы хотите отредактировать) — revelt 29 июня ’19 в 5:53
добавить комментарий |

Для всех, кто ищет графический интерфейс Windows/Mac для редактирования старых сообщений (т.е. не только последнего сообщения), я бы рекомендовал Sourcetree. Действия, которые необходимо выполнить, приведены под изображением.

Для коммитов, которые еще не были отправлены на удаленный компьютер:

  1. Убедитесь, что вы зафиксировали или сохранили все текущие изменения (т.е. не являются файлами, перечисленными на вкладке «Состояние файла») — иначе это не сработает.
  2. На вкладке «Журнал/История» щелкните правой кнопкой мыши запись с примыкающей линией на графике один под коммитами, которые вы хотите отредактировать, и выберите «Перебазировать дочерние элементы в интерактивном режиме …»
  3. Выделите всю строку для сообщения фиксации, которое вы хотите изменить (щелкните столбец «Сообщение») .
  4. Нажмите кнопку «Редактировать сообщение» .
  5. В открывшемся диалоговом окне отредактируйте сообщение, как необходимо, а затем нажмите OK .
  6. Повторите шаги 3-4, если необходимо изменить другие сообщения фиксации.
  7. Нажмите OK : начнется изменение базы. Если все в порядке, вывод будет завершен «Завершено успешно».. ПРИМЕЧАНИЕ. Я иногда видел, что это не удается с Невозможно создать 'project_path/.git/index.lock': файл существует. при попытке изменить несколько сообщений фиксации одновременно. Не уверен, в чем именно заключается проблема, и будет ли она исправлена ​​в будущей версии Sourcetree, но если это произойдет, я рекомендую переустанавливать их по одному (медленнее, но кажется более надежным).

… Или … для коммитов, которые уже были отправлены:

Следуйте инструкциям в этом ответе, которые аналогично приведенному выше, но требует, чтобы из командной строки была запущена дополнительная команда ( git push origin -f ), чтобы принудительно нажать ветку. Я бы рекомендовал прочитать все это и принять необходимые меры предосторожности!


128

Если вы просто хотите отредактировать последнюю фиксацию, используйте:

  git commit --amend  

или

  git commit --amend -m 'one line message'  

Но если вы хотите отредактировать несколько коммитов в row, вместо этого следует использовать перебазирование:

  git rebase -i   

В файле, подобном указанному выше, напишите edit/e или один из других вариантов и нажмите «Сохранить» и «выйти».

Теперь вы совершите первую ошибочную фиксацию. Внесите изменения в файлы, и они будут автоматически перенесены за вас. Введите

  git commit --amend  

Сохраните, выйдите из этого и введите

  git rebase --continue  

, чтобы перейти к следующему выделению, пока не будут завершены все ваши выделения.

Обратите внимание, что эти вещи изменяют весь ваш SHA хэши после этой конкретной фиксации.

отредактировал 2 ноя ’19 в 12 : 33
Вики сообщества

4 версии, 3 пользователя 81%
Шубхам Чаудхари
  • 2
    git rebase -i у меня работает. Благодарю. — Viraths 13 апр. ’18 в 0:57
добавить комментарий |

Если вы просто хотите отредактировать последний коммит, используйте:

  git commit  --amend  

или

  git commit --amend -m 'однострочное сообщение'  

Но если вы хотите отредактировать несколько коммитов подряд, вам следует вместо этого использовать перебазирование:

  git rebase -i   

В файле, подобном приведенному выше, напишите edit/e или один из других параметров и нажмите» Сохранить «и выйти.

Теперь вы попадете в первую ошибочную фиксацию. Внесите изменения в файлы, и они будут автоматически размещены для вас. Введите

  git commit  --amend  

Сохраните и выйдите из этого и введите

  git rebase --continue  

, чтобы перейти к следующему выделению, пока не будут выполнены все ваши выделения.

Обратите внимание, что эти вещи изменяют все ваши хэши SHA после этой конкретной фиксации.


127

Если вы хотите изменить только последнее сообщение, вы должны использовать --only или его ярлык -o с commit --amend :

  git commit --amend -o -m "Новое сообщение фиксации"  

Это гарантирует, что вы случайно не улучшите свою фиксацию с помощью постановочный материал. Конечно, лучше иметь правильную конфигурацию $ EDITOR . Затем вы можете не указывать параметр -m , и Git предварительно заполнит сообщение фиксации старым. Таким образом, его можно легко редактировать.

отредактировано 2 ноября ‘ 19, 12:38
Peter Mortensen
27.3k2121 золотых знаков9393 серебряных знака123123 бронзовых знака
ответил 23 мая ’14 в 8:40
  • 1
    «верхний» ответ не отвечает на вопрос. Он просто дает общее представление о git commit --amend . Вопрос был очень конкретным, поэтому длиннее! = Лучше. Решающее упоминание флага -o , вероятно, будет похоронено в остальной информации. Мне также неудобно редактировать ответ, за который уже так много голосов. — Дэвид Онгаро, 20 июля 2014, 20:51
  • 2
    При этом вы можете редактировать верхний ответ, поскольку существует реальная опасность того, что люди используют его как «правильный» ответ. Легко может случиться, что вы поправите коммит с помощью постановки — это случилось со мной, и когда вы нажимаете на это, меня очень раздражает. Но все же количество не является гарантией правильности. Ни по количеству ответов, ни по количеству голосов. — Дэвид Онгаро, 20 июля 2014, 20:51
  • 1
    Я бы не стал так далеко говорить, что главный ответ «неправильный» и что он «не отвечает на вопрос». Он определенно работает и отвечает на вопрос, вам просто нужно убедиться, что у вас нет поэтапных изменений, когда вы пытаетесь внести поправки. Но я понимаю, что вам нужно предупреждать людей об этом. Я отредактирую его позже, если будет время. — user456814 21 июля ’14 в 21:26
  • 2
    Чтобы быть справедливым: хотя опция - only с - change доступна с git 1.3.0, она не работают корректно, пока это не будет исправлено в 1.7.11.3 (ea2d4ed35902ce15959965ab86d80527731a177c). Так что верным ответом в 2008 году, вероятно, было бы что-то вроде: git stash; git commit --amend; git stash pop . — Дэвид Онгаро 21 июля ’14 в 23:00
добавить комментарий |

Если вы хотите изменить только последнее сообщение, вы должны использовать флаг - only или его ярлык -o с commit --amend :

  git commit --amend -o -m  «Новое сообщение фиксации»  

Это гарантирует, что вы случайно не улучшите свою фиксацию с помощью поэтапного материала. Конечно, лучше иметь правильную конфигурацию $ EDITOR . Затем вы можете не указывать параметр -m , и Git предварительно заполнит сообщение фиксации старым. Таким образом, его можно легко редактировать.


103

Обновите последнее ошибочное сообщение фиксации новым сообщением фиксации в одной строке:

  git commit --amend -m "ваше новое сообщение фиксации"  

Или попробуйте сбросить Git, как показано ниже:

  # Вы можете сбросить голову на n количество фиксаций # НЕ хорошая идея для изменения последнего сообщения фиксации  , # но вы можете разделить коммит на несколько коммитов git reset --soft HEAD ^ # Это сбросит вашу последнюю фиксацию.  Теперь вы # можете повторно зафиксировать его с новым сообщением о фиксации.  

Использование сброса для разделения коммитов на меньшие коммиты

git reset также может помочь вам разбить одну фиксацию на несколько коммитов:

  # Сбросьте голову.  Я возвращаюсь к последним коммитам: git reset --soft HEAD ^ # (Вы можете сбросить множественные коммиты, выполнив HEAD ~ 2 (кол-во коммитов) # Теперь переустановите голову, чтобы разделить их на несколько коммитов git reset HEAD # Добавить и зафиксировать  ваши файлы по отдельности, чтобы сделать несколько коммитов: e.ggit add app/git commit -m "добавить все файлы в каталог приложения" git add config/git commit -m "добавить все файлы в каталог конфигурации"  

Здесь вы успешно разбили свою последнюю фиксацию на две фиксации.

отредактировал 02 ноября ’19 в 12:35
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 22 января ’14 в 8:57
  • 3
    Если все, что вам нужно сделать, это отредактировать сообщение вашей последней фиксации, используя мягкий сброс для этой цели — это over-kill . Просто используйте git commit --amend , точно так, как написано в верхней части проголосовал за ответ . Кроме того, git reset --soft HEAD ^ работает идентично мягкому сбросу в этом более раннем ответе, потому что оба они возвращаются к первой родительской фиксации. — user456814 Jul 21 ’14 в 23:15
  • 3
    Я только потрудился добавить в решение git reset , чтобы дать идею разделить один c опустить сообщение в несколько сообщений фиксации. Потому что я столкнулся с этой проблемой, когда начинал использовать git . Иногда это может быть действительно полезно. 🙂 — przbadu 22 июл. ’14 в 06:29
добавить комментарий |

Обновите последнее ошибочное сообщение фиксации новым сообщением фиксации в одной строке:

  git commit --amend -m "ваше новое сообщение фиксации"  

Или попробуйте сбросить Git, как показано ниже:

  #  Вы можете сбросить голову на n количество коммитов # НЕ хорошая идея для изменения последнего сообщения коммита, # но вы можете получить идею разбить коммит на несколько коммитов git reset --soft HEAD ^ # Это сбросит вашу последнюю фиксацию.  Теперь вы # можете повторно зафиксировать его с новым сообщением о фиксации.  

Использование сброса для разделения коммитов на меньшие коммиты

git reset также может помочь вам разбить одну фиксацию на несколько коммитов:

  # Сбросьте голову.  Я возвращаюсь к последним коммитам: git reset --soft HEAD ^ # (Вы можете сбросить множественные коммиты, выполнив HEAD ~ 2 (кол-во коммитов) # Теперь переустановите голову, чтобы разделить их на несколько коммитов git reset HEAD # Добавить и зафиксировать  ваши файлы по отдельности, чтобы сделать несколько коммитов: e.ggit add app/git commit -m "добавить все файлы в каталог приложения" git add config/git commit -m "добавить все файлы в каталог конфигурации"  

Здесь вы успешно разбили свою последнюю фиксацию на две фиксации.


88

На этот вопрос есть много ответов, но ни один из них не объясняет очень подробно, как изменить старые сообщения фиксации с помощью Vim. Я застрял, пытаясь сделать это сам, поэтому вот я ‘ Я подробно опишу, как я это сделал, специально для людей, у которых нет опыта работы с Vim!

Я хотел изменить свои пять последних коммитов, которые я уже отправил на сервер. Это довольно «опасно», потому что, если кто-то уже сделал это, вы можете все испортить, изменив сообщения фиксации. Однако, когда вы работаете над своей собственной маленькой веткой и уверены, что ее никто не потянул, вы можете изменить ее следующим образом:

Допустим, вы хотите изменить свои пять последних коммитов, а затем набираете это в терминале:

  git rebase -i HEAD ~ 5  

* где 5 — количество сообщений фиксации, которые вы хотите для изменения (так что, если вы хотите изменить 10-й коммит на последний, введите 10).

Эта команда приведет вас в Vim, где вы сможете «отредактировать» свою историю коммитов. Вы увидите свои последние пять коммитов вверху следующим образом:

  выберите  commit message  

Вместо pick нужно написать reword . Вы можете сделать это в Vim, набрав i . Это заставит вас перейти в режим вставки . (Вы видите, что находитесь в режиме вставки по слову INSERT внизу.) Для коммитов, которые вы хотите изменить, введите reword вместо pick .

Затем вам нужно сохранить и закрыть этот экран. Для этого сначала войдите в «командный режим», нажав кнопку Esc (вы можете проверить, что вы находитесь в командном режиме, если слово INSERT внизу исчез). Затем вы можете ввести команду, набрав : . Команда для сохранения и выхода: wq . Итак, если вы наберете : wq , вы на правильном пути.

Тогда Vim просмотрит каждое сообщение фиксации, которое вы хотите перефразировать, и здесь вы можете фактически изменить сообщения фиксации. Вы сделаете это, перейдя в режим вставки, изменив сообщение фиксации, войдя в командный режим, сохранив и выйдя. Сделайте это пять раз, и Vim закончится!

Затем, если вы уже отправили неправильные коммиты, вам нужно git push --force перезаписать их. Помните, что git push --force — довольно опасная вещь, поэтому убедитесь, что никто не снимал с сервера, так как вы отправили неправильные коммиты!

Теперь вы изменили свои сообщения коммитов!

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

отредактировал 2 ноября ’19 в 12:46
Питер Мортенсен
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответили 7 авг. 18
  • 4
    В стеке нет «потоков» Переполнение, поскольку это не дискуссионный форум, здесь есть только «вопросы», «ответы» и «сообщения». . Кроме того, не все версии Vim одинаковы, не все из них позволяют удалять символы в режиме вставки (в каком-то смысле это имеет смысл, верно?). Если вы хотите всегда иметь возможность удалять символы в Vim, X и x сделает это (маленький x удалит символы перед курсором, X удалит позади). Если вы сделаете ошибку, вы можете повторно использовать u для отмены. Наконец, r — это сокращение для reword в интерактивном редакторе перебазирования. — user456814 7 авг., 17:47
  • 1
    Чтобы изменить слово в vim, наберите cw в его начало (правда, вопрос не в vim, согласен). — Ярослав Никитенко 05 дек. ’15 в 18:25
  • Тебе не нужно использовать эту мерзость. Вы можете настроить свой редактор git на что-нибудь разумное и удобное для пользователя, например nano или mcedit Midnight Commander. — Дэн Даскалеску 2 мая ’19 в 1:28
добавить комментарий |

На этот вопрос есть много ответов, но ни один из них не объясняет очень подробно, как изменить старые сообщения фиксации с помощью Vim. Я застрял, пытаясь сделать это сам, поэтому здесь я подробно опишу, как я это сделал, особенно для людей, у которых нет опыта в Vim!

Я хотел изменить свои пять последних коммитов, которые Я уже пихнул на сервер. Это довольно «опасно», потому что, если кто-то уже сделал это, вы можете все испортить, изменив сообщения фиксации. Однако, когда вы работаете над своей собственной маленькой веткой и уверены, что ее никто не потянул, вы можете изменить ее следующим образом:

Допустим, вы хотите изменить свои пять последних коммитов, а затем набираете это в терминале:

  git rebase -i HEAD ~ 5  

* где 5 — количество сообщений фиксации, которые вы хотите для изменения (так что, если вы хотите изменить 10-й коммит на последний, введите 10).

Эта команда приведет вас в Vim, где вы сможете «отредактировать» свою историю коммитов. Вы увидите свои последние пять коммитов вверху следующим образом:

  выберите  commit message  

Вместо pick нужно написать reword . Вы можете сделать это в Vim, набрав i . Это заставит вас перейти в режим вставки . (Вы видите, что находитесь в режиме вставки по слову INSERT внизу. ) Для коммитов, которые вы хотите изменить, введите reword вместо pick .

Затем вам нужно сохранить и выйти этот экран. Для этого сначала войдите в «командный режим», нажав кнопку Esc (вы можете проверить, что вы находитесь в командном режиме, если слово INSERT внизу исчез). Затем вы можете ввести команду, набрав : . Команда для сохранения и выхода: wq . Итак, если вы наберете : wq , вы на правильном пути.

Тогда Vim просмотрит каждое сообщение фиксации, которое вы хотите перефразировать, и здесь вы можете фактически изменить сообщения фиксации. Вы сделаете это, перейдя в режим вставки, изменив сообщение фиксации, войдя в командный режим, сохранив и выйдя. Сделайте это пять раз, и Vim закончится!

Затем, если вы уже отправили неправильные коммиты, вам нужно git push --force перезаписать их. Помните, что git push --force — довольно опасная вещь, поэтому убедитесь, что никто не снимал с сервера, так как вы отправили неправильные коммиты!

Теперь вы изменили свои сообщения коммитов!

(Как видите, я не настолько опытен в Vim, поэтому, если я использовал неправильный «жаргон», чтобы объяснить, что происходит, не стесняйтесь поправлять меня !)


79

Вы можете использовать git- rebase-reword

Он предназначен для редактирования любой фиксации (не только последней) так же, как commit --amend

  $ git rebase-reword  

Он назван в честь действия интерактивного перебазирования для изменения фиксации: «reword». См. Этот пост и интерактивный режим man -section-

Примеры:

  $ git rebase-reword b68f560 $ git rebase-reword HEAD ^ код> 

отредактировал 29 июля 2015 в 22:28
ответил 21 февраля 2015 в 12:21
  • 6
    Для этого требуется установка внешней программы. На мой взгляд, лучше было бы научиться более эффективно использовать встроенные инструменты и псевдонимы. Я бы набрал: g c; g rb -i @ ~ 9 (фиксация и перебазирование), переместить новую фиксацию туда, где я хочу, измените commit на f ( fixup ) и сохраните. Если вам нужно что-то более быстрое, вы можете использовать псевдоним git commit --fixup = ; git rebase -i --autosquash ^ — Zaz 29 апр. 2015, 15:25
добавить комментарий |

Вы можете использовать git-rebase-reword

Он предназначен для редактирования любого коммита (не только последнего ) так же, как commit --amend

  $ git rebase-reword   

Он назван в честь интерактивного действия rebase для изменения фиксации: «reword». См. Этот пост и интерактивный режим man -section-

Примеры:

  $ git rebase-reword b68f560 $ git rebase-reword HEAD ^ код> 

79

Я добавил псевдонимы reci и recm для повторного принятия (исправления) . Теперь я могу сделать это с помощью git recm или git recm -m :

  $ vim ~/ .gitconfig [псевдоним] ...... cm = commit reci = commit --amend recm = commit --amend ......  

отредактировано 2 ноября ’19 в 12:29
Peter Mortensen
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 06 янв. в 07:24
добавить комментарий |

Я добавил псевдонимы reci и recm для повторно принять (исправить) . Теперь я могу сделать это с помощью git recm или git recm -m :

  $ vim ~/ .gitconfig [псевдоним] ...... cm = commit reci = commit --amend recm = commit --amend ......  

57

Я понял, что отправил коммит с опечаткой. Для отмены я сделал следующее:

  git commit --amend -m "T-1000, расширенный прототип" git push --force  

Предупреждение: принудительное нажатие ваших изменений перезапишет удаленную ветвь вашей локальной. Убедитесь, что вы не собираетесь перезаписывать все, что хотите сохранить. Также будьте осторожны с принудительным продвижением измененного (переписанного) коммита, если кто-то еще поделится с вами веткой, потому что им нужно будет переписать свою собственную историю, если у них есть старая копия коммита, которую вы только что переписали..

отредактировано 5 августа 2014 в 14:44
user456814
ответил 19 июля ’14 в 20: 272014-07-19 20:27
  • 7
    В git ничего не перезаписывается. В этом случае указатель ветки будет установлен на ваш новый коммит, а старый коммит станет устаревшим, если на него не останется ссылок, и он может быть очищен через несколько недель. (До тех пор другие все еще могут найти его и сослаться на него, например, заглянув в рефлог.) — Дэвид Онгаро 4 сен 2014 в 23:47
добавить комментарий |

Я понял, что отправил коммит с опечаткой. Для отмены я сделал следующее:

  git commit --amend -m "T-1000, расширенный прототип" git push --force  

Предупреждение: принудительное нажатие ваших изменений перезапишет удаленную ветвь вашей локальной. Убедитесь, что вы не собираетесь перезаписывать все, что хотите сохранить. Также будьте осторожны с принудительным продвижением измененного (переписанного) коммита, если кто-то еще поделится с вами веткой, потому что им нужно будет переписать свою собственную историю, если у них есть старая копия коммита, который вы только что переписали.


52

Мне нравится использовать следующее:

  1. git status
  2. git add --all
  3. git commit -am "здесь идет сообщение об изменении"
  4. git pull
  5. git push
отредактировано 3 февраля 2015 г. в 11:08
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 8 сен 2014 в 9:14
добавить комментарий |

Мне нравится использовать следующее:

  1. git status
  2. git add --all
  3. git commit -am "здесь идет сообщение об изменении"
  4. git pull
  5. git push

46

Если вы не отправили код в удаленную ветку (GitHub/Bitbucket), вы можете изменить сообщение фиксации в командной строке, как показано ниже.

  git commit --amend -m "Ваше новое сообщение"  

Если вы работаете над определенной веткой, сделайте следующее:

  git commit --amend -m "BRANCH-NAME: new message"  

Если вы уже отправили код с неправильным сообщением, а ты в девичестве d будьте осторожны при изменении сообщения. То есть после того, как вы измените сообщение фиксации и попытаетесь отправить его снова, у вас возникнут проблемы. Чтобы сделать его гладким, выполните следующие действия.

Пожалуйста, прочтите мой ответ полностью, прежде чем делать это.

   git commit --amend -m "ФИЛИАЛ: ваше новое сообщение" git push -f origin НАЗВАНИЕ ФИЛИАЛА # Не лучшая практика.  Прочтите ниже, почему?  

Важное примечание: Когда вы используете принудительное нажатие напрямую, вы можете столкнуться с проблемами кода, над которыми работают другие разработчики. та же ветка. Поэтому, чтобы избежать этих конфликтов, вам нужно вытащить код из своей ветки, прежде чем выполнять force push :

  git commit --amend -  m "BRANCH-NAME: your new message" git pull origin BRANCH-NAME git push -f origin BRANCH-NAME  

Это лучшая практика при изменении сообщения фиксации, если оно уже был отправлен.

отредактировал 3 февраля 2015 в 11:14
Питер Мортенсен
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 13 янв. 7:03
добавить комментарий |

Если вы не отправили код в удаленную ветку (GitHub/Bitbucket), вы можете изменить сообщение фиксации в командной строке, как показано ниже..

  git commit --amend -m "Ваше новое сообщение"  

Если вы работаете над определенной веткой, сделайте это :

  git commit --amend -m "BRANCH-NAME: new message"  

Если вы уже нажали код с неправильным сообщением, и вам нужно быть осторожным при изменении сообщения. То есть после того, как вы измените сообщение фиксации и попытаетесь отправить его снова, у вас возникнут проблемы. Чтобы сделать его гладким, выполните следующие действия.

Пожалуйста, прочтите мой ответ полностью, прежде чем делать это.

   git commit --amend -m "ФИЛИАЛ: ваше новое сообщение" git push -f origin НАЗВАНИЕ ФИЛИАЛА # Не лучшая практика.  Прочтите ниже, почему?  

Важное примечание: Когда вы используете принудительное нажатие напрямую, вы можете столкнуться с проблемами кода, над которыми работают другие разработчики. та же ветка. Поэтому, чтобы избежать этих конфликтов, вам нужно вытащить код из своей ветки, прежде чем выполнять force push :

  git commit --amend -  m "BRANCH-NAME: your new message" git pull origin BRANCH-NAME git push -f origin BRANCH-NAME  

Это лучшая практика при изменении сообщения фиксации, если оно был уже отправлен.



Изменение сообщения фиксации

Версия статьи: GitHub.com
GitHub.com Enterprise Server 3.0 Enterprise Server 2.22 Enterprise Server 2.21 Enterprise Server 2.20 GitHub AE Просмотреть все выпуски Enterprise
Версия статьи: GitHub.com
GitHub.com Enterprise Server 3.0 Enterprise Server 2.22 Enterprise Server 2.21 Enterprise Server 2.20 GitHub AE Просмотреть все Enterp релизы подъема

Если сообщение фиксации содержит нечеткую, неверную или конфиденциальную информацию, вы можете исправить ее локально и отправить новую фиксацию с новым сообщением на GitHub. Вы также можете изменить сообщение фиксации, чтобы добавить недостающую информацию.

В этой статье

  • Перезапись самого последнего сообщения фиксации.
  • Фиксация не была переведена в оперативный режим
  • Изменение старых или нескольких сообщений фиксации
  • Дополнительная литература

Перезапись самого последнего сообщения фиксации

Вы можете изменить самое последнее сообщение фиксации с помощью команды git commit --amend .

В Git текст сообщения фиксации является частью фиксации. Изменение сообщения фиксации изменит идентификатор фиксации, то есть контрольную сумму SHA1, которая называет фиксацию. Фактически, вы создаете новую фиксацию, которая заменяет старую..

Фиксация не была отправлена ​​в оперативный режим

Если фиксация существует только в вашем локальном репозитории и не была отправлена ​​в GitHub, вы можете изменить сообщение фиксации с помощью git commit --amend command.

  1. В командной строке перейдите в репозиторий, содержащий коммит, который вы хотите исправить.

  2. Введите git commit --amend и нажмите Enter .

  3. В текстовом редакторе отредактируйте сообщение фиксации и сохраните фиксацию.

    • Вы можете добавить соавтора, добавив трейлер к фиксации. Для получения дополнительной информации см. «Создание фиксации с несколькими авторами».

    • Вы можете создавать фиксации от имени своей организации, добавляя трейлер к фиксации. Для получения дополнительной информации см. «Создание фиксации от имени организации»

Новая фиксация и сообщение появятся на GitHub в при следующем нажатии.

Вы можете изменить текстовый редактор по умолчанию для Git, изменив параметр core.editor . Для получения дополнительной информации см. «Базовая конфигурация клиента» в руководстве Git.

Внесение изменений в старые или множественные сообщения фиксации

Если вы уже отправили фиксацию на GitHub, вам придется принудительно отправить фиксацию с измененным сообщением.

Мы настоятельно не рекомендуем принудительную отправку, поскольку это меняет историю вашего репозитория. Если вы принудительно нажмете, людям, которые уже клонировали ваш репозиторий, придется вручную исправить свою локальную историю. Дополнительную информацию см. В разделе «Восстановление из вышестоящей перебазировки» в руководстве по Git.

Изменение сообщения последней отправленной фиксации

  1. Выполните указанные выше действия, чтобы изменить сообщение фиксации.
  2. Используйте команду push --force , чтобы принудительно передать старый коммит.
      $ git push --force example-branch

Изменение сообщения о более старых или множественных коммитах

Если вам нужно изменить сообщение для нескольких коммитов или более старого коммита, вы можете использовать интерактивную перебазировку , затем принудительно нажмите, чтобы изменить историю фиксации.

  1. В командной строке перейдите в репозиторий, содержащий фиксацию, которую вы хотите изменить.

  2. Используйте команду git rebase -i HEAD ~ n для отображения списка последних n фиксируется в текстовом редакторе по умолчанию.

      # Отображает список последних 3 коммитов в текущей ветке $ git r  ebase -i HEAD ~ 3  

    Список будет выглядеть примерно так:

      pick e499d89 Удалить CNAMEpick 0c39034 Лучше READMEpick f7fde4a  Измените сообщение фиксации, но нажмите ту же фиксацию. # Rebase 9fdb3bd.. f7fde4a на 9fdb3bd ## Команды: # p, pick = использовать фиксацию # r, reword = использовать фиксацию, но отредактировать сообщение фиксации # e, edit = использовать фиксацию, но остановиться для изменения # s, squash = использовать фиксацию, но слиться с  предыдущая фиксация # f, fixup = как "squash", но отбросить сообщение журнала этой фиксации # x, exec = run command (остальная часть строки) с помощью оболочки ## Эти строки можно переупорядочить;  они выполняются сверху вниз. ## Если вы удалите здесь строку, КОТОРАЯ COMMIT БУДУТ УТЕРЯНЫ. ## Однако, если вы удалите все, перебазирование будет прервано. ## Обратите внимание, что пустые коммиты закомментированы   
  3. Замените pick на reword перед каждым сообщением фиксации, которое вы хотите изменить.

      pick e499d89 Удалить CNAMEreword 0c39034 Лучше READMEreword f7fde4a Измените сообщение фиксации, но нажмите ту же фиксацию.  
  4. Сохраните и закройте файл списка фиксации.

  5. В каждом полученном файле фиксации введите новое сообщение фиксации, сохраните файл и закройте его.

  6. Когда вы будете готовы отправить свои изменения в GitHub, используйте команду push —force, чтобы принудительно протолкнуть старую фиксацию.

      $ git push --force example-branch 

Для получения дополнительной информации об интерактивном перемещении см. «Интерактивный режим» в руководстве по Git.

Как и раньше, при изменении фиксации меня ssage приведет к новой фиксации с новым идентификатором. Однако в этом случае каждая фиксация, следующая за измененной фиксацией, также получит новый идентификатор, потому что каждая фиксация также содержит идентификатор своего родителя.

Если вы включили конфиденциальную информацию в сообщение о фиксации, принудительное нажатие фиксации с измененной фиксацией может не удалить исходную фиксацию из GitHub. Старый коммит не будет частью последующего клона; однако он все еще может быть кэширован на GitHub и доступен через идентификатор фиксации. Вы должны обратиться в службу поддержки GitHub или в службу поддержки GitHub Premium со старым идентификатором фиксации, чтобы удалить его из удаленного репозитория.

Дополнительная литература

  • «Подписание коммитов»

Помогите нам сделать эти документы отличными!

Все документы GitHub имеют открытый исходный код. Видите что-то неправильное или непонятное? Отправьте запрос на перенос.

Сделайте взнос

Или узнайте, как внести свой вклад.

Оцените статью
logicle.ru
Добавить комментарий