27 Вопрос: Как изменить существующие сообщения без фиксации?

вопрос создан в Thu, May 2, 2019 12:00 AM

Я написал неправильную вещь в сообщении фиксации.

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

    
7672
  1. Для тех, кто немного новичок в git: важно мнение Лори о том, что он еще не нажал. Как и перебазирование, это меняет историю. Если кто-то клонировал /извлекал из вашего репо между оригинальной и переписанной историей, он не сможет вытащить после перезаписи (для этой ветви).
    2008-10-10 20: 12: 17Z
27 ответов                              27                         

Изменение самого последнего сообщения о коммите

git commit --amend

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

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

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

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

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

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

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

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

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

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

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

Чтобы сделать git squash, выполните следующие действия:

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

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

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

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

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

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

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

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

15372
2019-01-25 15: 17: 31Z
  1. Однако git commit --amend не такой мощный, как git rebase -i.
    2010-07-05 08: 40: 35Z
  2. @ jeffjose, это определенно не обязательно. Кроме того, git commit --amend может исправить основную фиксацию (a?).
    2010-07-14 06: 02: 30Z
  3. Если вы уже нажали, просто снова нажмите push: git push -f origin branchname
    2012-05-02 14: 12: 24Z
  4. @ hughes не является git push -f немного опасным, если другие люди используют тот же репозиторий?
    2012-11-08 07: 48: 41Z
  5. Если вы не хотите переписывать все сообщение о фиксации, перейдите к git commit --amend -c HEAD. Это откроет редактор, предварительно заполненный вашим старым сообщением о фиксации, так что вы можете изменить он.
    2012-11-14 15: 38: 10Z
git commit --amend -m "your new message"
    
2461
2016-03-01 18: 19: 29Z
  1. Я сделал git commit --amend -m "Новое сообщение", но нажатие на Github сгенерировало "Объединить удаленные изменения перед повторной отправкой". После pull, commit --amend и push снова, новое сообщение не появляется. Вместо этого у меня есть «ветвь слияния« master »из github.com:[myrepo]"
    2011-10-14 16: 58: 32Z
  2. @ DaveEveritt вы, скорее всего, передали свой коммит вверх по течению, прежде чем пытаться его исправить.
    2013-04-25 08: 21: 20Z
  3. @ Kyralessa не соответствует действительности. В bash вы можете легко составлять сообщения о многострочной фиксации, просто не закрывая кавычку до тех пор, пока не закончите (нажимая return в конце каждой строки в кавычках).
    2013-06-11 21: 11: 57Z
  4. Я не понимаю, как ответ, который очень похож на основную идею ответа, который был написан два года назад, а также принятый ответ, получает столько голосов , Странный. (с ответом все в порядке)
    2014-01-15 05: 30: 22Z
  5. @ AmalMurali, хорошо. Моя точка зрения касалась не столько популярности вопроса, ни полезности ответа. Но этот конкретный ответ не является самым старым ответом, и при этом он не предлагает дальнейшего понимания принятого ответа. Похоже, это копия раздела принятого ответа. Это была моя точка зрения. CHEERS!
    2014-05-21 20: 16: 23Z

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

  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 позволяет вам исправлять коммиты, независимо от того, как давно они были.

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

    
2336
2017-05-23 12: 02: 48Z
  1. Можно ли изменить сообщение первого коммита (у которого нет родителя)?
    2010-01-21 19: 57: 18Z
  2. Это упомянуто в одном из других ответов, но я помещу примечание здесь. Начиная с git 1.6.6, вы можете использовать reword вместо pick для редактирования сообщения журнала.
    2010-05-31 13: 27: 57Z
  3. Кстати, $parent_of_flawed_commit эквивалентен $flawed_commit^.
    2010-11-28 23: 26: 12Z
  4. Никогда НИКОГДА не делайте этого (или вообще не делайте перебазирование), если вы уже продвинулись вверх по течению!
    2011-05-31 19: 14: 04Z
  5. Используйте -p (--preserve-merges), если после ошибочной фиксации произошло слияние.
    2012-01-31 14: 37: 47Z

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

git commit --amend

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

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

git commit --amend -C HEAD

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

git reset --hard HEAD^

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

git rebase -i HEAD~commit_count

(Замените commit_count числом коммитов, которое вы хотите редактировать.) Эта команда запускает ваш редактор. Пометьте первый коммит (тот, который вы хотите изменить) как «edit» вместо «pick», затем сохраните и выйдите из вашего редактора. Сделайте изменения, которые вы хотите зафиксировать, и затем запустите

git commit --amend
git rebase --continue

Примечание. Вы можете "Внести необходимые изменения" также в редакторе, открытом git commit --amend

    
762
2014-10-24 10: 20: 01Z
  1. git rebase -i HEAD~commit_count также позволит вам изменять сообщения фиксации, сколько бы вы ни выбрали коммитов. Просто пометьте выбранные коммиты как «reword» вместо «pick».
    2013-08-21 20: 21: 59Z
  2. Что если вы не хотите делать перебаз? Вы просто хотите изменить старое сообщение?
    2016-04-21 08: 56: 35Z
  3. git reset --hard уничтожает незафиксированные изменения. Пожалуйста, замените --hard на --soft.
    2018-02-28 17: 44: 56Z

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

git commit -a --amend -m "My new commit message"
    
392
2014-02-23 23: 10: 08Z
  1. И если вы не хотите добавлять все, вы можете сначала выполнить git add file.ext, а затем просто git commit --amend
    2015-09-22 05: 56: 35Z

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

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

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

Обратите внимание, что при этом будет пытаться переписать КАЖДЫЙ коммит между HEAD и ошибочным коммитом, поэтому вы должны выбрать команду msg-filter очень мудро; -)

    
352
2014-05-21 02: 37: 16Z
  1. Существует ли версия, которая не изменяет коммит, если регулярное выражение ничего не находит?
    2013-03-28 20: 08: 13Z
  2. AFAIK filter-branch --msg-filter будет генерировать новые коммиты в любом случае. Тем не менее, вы можете проверить в msg-фильтре, успешен ли sed, и использовать эту информацию после завершения операции ответвления фильтра, чтобы сбросить ваше дерево до refs /original.
    2013-03-29 16: 16: 25Z
  3. @ DavidHogue Это верно только при использовании метода filter-branch. Идентификаторы фиксации после измененной фиксации не изменяются, если вы используете интерактивную перебазировку.
    2013-07-06 19: 08: 37Z
  4. @ Марк Да, они делают, они обязаны. Идентификаторы коммитов зависят от предыдущих коммитов. Если бы они не изменились, git был бы бесполезен.
    2014-01-11 04: 45: 27Z
  5. Вам необходимо $flawed_commit^..HEAD, а не $flawed_commit..HEAD. как указано на странице man: « Команда будет перезаписывать только положительные ссылки, указанные в командной строке (например, если вы передать a..b, только b будет переписано). »
    2014-07-29 11: 18: 49Z

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

git commit --amend -c <commit ID>

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

    
311
2013-01-10 14: 23: 28Z
  1. Для меня использование вышеприведенной команды фактически создает новый коммит с новым идентификатором фиксации плюс дополнительный коммит, говорящий «объединить ветвь» в качестве сообщения фиксации по умолчанию.
    2013-03-29 16: 27: 38Z
  2. Внесение изменений always создает новый коммит с новым идентификатором коммита. Идентификатор фиксации - это SHA-хэш содержимого фиксации, включая сообщение фиксации и созданные /зафиксированные временные метки. Это особенность Git, которая, за исключением коллизий хешей, гарантирует, что два коммита с одинаковым идентификатором будут в точности одинаковыми, с одинаковым содержимым, историей и т. Д.
    2013-06-19 09: 30: 11Z
  3. Согласен с Эмилем. Кроме того, при чтении документов - кажется, что все, что делает "-c", это говорит git, какое сообщение о коммите использовать в качестве шаблона по умолчанию /для вашего нового коммита. На самом деле он уже собирается делать "-c < commit ID >" по умолчанию, поэтому указывать его не нужно.
    2013-09-29 19: 12: 37Z
  4. -c делает несколько вещей. По умолчанию используется старое сообщение, но также копируется информация об авторстве (человек и время). -C делает то же самое, за исключением того, что он не просит вас отредактировать сообщение.
    2014-12-28 02: 55: 53Z
  5. Как и @SantanuDey, у меня это не сработало. Я получил fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
    2015-04-14 05: 22: 17Z

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

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

git commit -a --amend -m "My new commit message"
    
310
2017-02-26 16: 48: 31Z
  1. Этот ответ буквально идентичен этому более старый . Вы проверили существующие ответы, прежде чем предоставить другой?
    2019-05-02 01: 15: 38Z

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

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

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

$ git commit --amend

изменить коммит, а после этого

$ git rebase --continue

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

    
283
2013-03-16 09: 39: 44Z
  1. Если вы хотите убедиться, что ваше изменение с git commit --amend вступило в силу, вы можете использовать git show, и оно покажет новое сообщение.
    2013-02-19 20: 12: 44Z
  1. Если вы хотите изменить только последнее сообщение о коммите, выполните:

    git commit --amend
    

    Это приведет вас к вашему текстовому редактору и позволит вам изменить последнее сообщение о коммите.

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

    git rebase -i HEAD~3
    
276
2014-05-21 02: 38: 25Z
  1. В этом предыдущем ответе уже сказано, что вы можете использовать git commit --amend, и в нем также говорится, что вы можете использовать git rebase -i HEAD~commit_count, все, что вы сделали, это подключили 3 для commit_count.
    2014-07-23 12: 21: 05Z
  2. Также понижено. Люди просто не хотят прочитать существующие ответы .
    2019-05-02 01: 16: 22Z

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

    git filter-branch -f --msg-filter \
    'sed "s/<old message>/<new message>/g"' -- --all
    

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

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

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

    • --all обязательно, тчтобы все ветви и теги были переписаны.

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

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

    git checkout -b old_master refs/original/refs/heads/master
    
        
    259
    2014-05-21 02: 39: 54Z
    1. Этот ответ не отвечает на вопрос OP, поскольку они просто заинтересованы в фиксации коммита, который они только что сделали. Я регулярно использую git commit --amend, чтобы исправить комментарии или добавить файлы, которые я забыл, к git add, но только ever до того, как я git pushed. Я также использую git filter-branch, когда хочу полностью поработать с историей версий, но OP не хочет этого, поэтому для этого ответа требуется большое предупреждение о здоровье - не пытайтесь сделать это дома, подсматривает !!
      2013-06-29 03: 17: 38Z

    Использование

    git commit --amend
    

    Чтобы понять это подробно, отличный пост - это 223

    2018-05-22 19: 46: 06Z
    1. Есть ли хороший способ исправить сообщения фиксации, уже переданные в общедоступный репозиторий? До сих пор я пришел к выводу, что после опечатки мои опечатки и пометки о коммите должны жить вечно.
      2013-06-04 11: 32: 34Z
    2. Одним словом, NOPE! Нет ХОРОШЕГО способа убрать то, что вы нажали. Все ретракции ПЛОХО в большей или меньшей степени. Вы должны принять дисциплину работы в ветке в своем личном репозитории, делая несколько коммитов, когда вы добавляете немного, проверяете немного, настраиваете немного. Затем объедините всю ветку в один коммит, напишите новое сообщение коммита, описывающее общее изменение, PROOFREAD и нажмите.
      2013-06-29 03: 29: 44Z
    3. Просто чтобы указать на очевидное, что не нужно делать ни одного коммита при возвращении из ветви функций. Многие люди делают перебаз в целевой ветви (чтобы все выглядело чисто), а затем объединяются с опцией подавления быстрой пересылки. Согласитесь с главным моментом, чтобы быть осторожным, прежде чем вы нажмете.
      2013-09-11 18: 20: 34Z
    4. Ответ git commit --amend уже был дан (несколько раз) до того, как вы написали свой. Почему вы отправили это снова? Если вы хотите добавить ссылку на «Переписывание истории Git», вы можете отредактировать один из существующих ответов или оставить комментарий.
      2019-05-02 01: 17: 45Z

    Внести поправки

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

    git commit --amend
    

    Пока это ваш последний коммит.

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

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

    git rebase -i [branched_from] [hash before commit]
    

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

        
    195
    2014-07-19 23: 45: 05Z

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

    Commit/Amend Last Commit
    
        
    183
    2013-03-16 09: 37: 26Z

    Если это ваш последний коммит, просто измените коммит:

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

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


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

    git rebase -i @~9   # Show the last 9 commits in a text editor
    

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


    Миниатюрный ВИМ учебник (или, как перебазирования только 8 нажатий клавиш 3j cw r Esc ZZ )

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

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


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

    ZZ

    * Следите за опциями, такими как

    $ git reset @~3   # go back 3 commits
    $ git reflog
    c4f708b HEAD@{0}: reset: moving to @~3
    2c52489 HEAD@{1}: commit: more changes
    4a5246d HEAD@{2}: commit: make important changes
    e8571e4 HEAD@{3}: commit: make some changes
    ... earlier commits ...
    $ git reset 2c52489
    ... and you're back where you started
    
    и --hard - они могут отбрасывать данные.
    * Кроме того, не переписывайте историю ни в каких ветвях, над которыми вы сотрудничаете.

        
    173
    2015-04-29 15: 50: 45Z
    1. Часть vim полностью не по теме, и вместо того, чтобы поощрять пользователей тратить время на обучение использованию тайного редактора, почему бы не научить их чему-то более тематическому, например как настроить редактор git по умолчанию, чтобы он был удобен для пользователя, например, --force? Мы говорим о тривиальных модификациях, которые необходимо внести в текстовый файл, а не о жестком кодировании, которое вызвало бы ожесточенную войну за «лучший» текстовый редактор.
      2019-05-02 01: 19: 53Z
    2. @ DanDascalescu: потому что быстрее изучить Vim с помощью приведенных выше инструкций, чем выполнить несколько повторных операций с помощью nano. Единственная причина, по которой git открывает текстовый редактор, а не собственный интерфейс для перебазирования, заключается в том, что Vim существует: он легок, установлен по умолчанию на большинстве систем и очень прост в освоении, чтобы достаточно легко выполнить перебазирование: например, nano перемещает коммит 2 вниз. В базовых знаниях Vim нет ничего загадочного; требуется 10 минут, чтобы стать более комфортным с Vim, чем с nano.
      2019-05-02 22: 07: 53Z

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

    Отметьте этот флажок

    Кроме того, ddjjpZZ - это прекрасная мантра, которая всегда будет представлять вам коммиты, которые вы сделали над мастером, и даст вам возможность изменить, удалить, изменить порядок или сквош. Нет необходимости сначала получать этот хеш.

        
    165
    2014-05-21 02: 44: 35Z
    1. Как добраться до того экрана, который вы показали в своем примере?
      2014-06-24 20: 01: 47Z
    2. Это нижняя правая часть Windows Git Gui. Просто выберите переключатель «Изменить последний коммит», и он будет заполнен самой последней информацией о коммите.
      2016-01-29 16: 51: 33Z

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

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

git rebase -i origin/master

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

Не забудьте указать

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
вместо --soft, в противном случае вы полностью потеряете этот коммит.     
135
2014-07-20 08: 21: 55Z
  1. Это делает то же самое, что и --hard, за исключением того, что это двухэтапный процесс.
    2014-12-28 02: 58: 00Z
  2. @ JosephK.Strauss Я полагаю, что внесение изменений в коммит также сохраняет оригинальную информацию об авторе и дате коммита, а также информацию о новом коммитере и дате отдельно. Я не уверен, что такой подход делает это.
    2016-05-07 23: 13: 23Z
  3. @ EvertonAgner Вы правы. git commit --amend сохранит информацию об авторе, но вопрос требует только изменения сообщения.
    2016-05-09 13: 59: 34Z

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

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

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

  1. Убедитесь, что вы зафиксировали или сохранили все текущие изменения (т. е. на вкладке «Статус файла» нет файлов) - иначе это не сработает.
  2. На вкладке "Журнал /история" нажмите правой кнопкой мыши запись с примыкающей линией на графике под коммитом, который вы хотите изменить, и выберите "Перебазировать потомков < commit ref > в интерактивном режиме ... "
  3. Выберите целую строку для сообщения фиксации, которое вы хотите изменить ( т.е. нажмите на столбец "Сообщение" ).
  4. Нажмите кнопку "Изменить сообщение".
  5. Отредактируйте сообщение в появившемся диалоговом окне, а затем нажмите кнопку "ОК".
  6. Повторите шаги 3-4, если есть другие сообщения фиксации, которые нужно изменить.
  7. Нажмите кнопку ОК. Начнется перебазировка. Если все хорошо, вывод закончится «Завершено успешно». ПРИМЕЧАНИЕ. . Недавно я видел сбой с --amend при попытке одновременного изменения нескольких сообщений фиксации. Не знаю точно, в чем заключается проблема, или будет ли она исправлена ​​в будущей версии SourceTree, но если это произойдет, рекомендую перебазировать их по одномувремя (медленнее, но кажется более надежным).

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

Выполните действия, описанные в этом ответе , которые аналогичны приведенным выше, но для запуска из них требуется дополнительная команда. линия, чтобы принудительно толкнуть ветку - прочитайте все и примените необходимую осторожность!

    
126
2019-06-17 13:20:56Z

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

Unable to create 'project_path/.git/index.lock': File exists.

или р>

git commit --amend

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

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

редактирование git rebase

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

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

git rebase -i <hash of one commit before the wrong commit>

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

git commit --amend

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

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

    
124
2014-07-19 17: 42: 48Z
  1. git rebase -i < хэш одного коммита перед неправильным коммитом > работает для меня. спасибо.
    2018-04-13 00: 57: 11Z

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

git rebase --continue 
или его ярлык --only с -o: commit --amend

Это гарантирует, что вы случайно не улучшите свой коммит с помощью инсценировки. Конечно, лучше иметь правильную конфигурацию

git commit --amend -o -m "New commit message"
. Затем вы можете опустить опцию $EDITOR, и git предварительно заполнит сообщение коммита старым. Таким образом, это может быть легко отредактировано.     
123
2015-03-13 10: 38: 50Z
  1. Ответ "top" не отвечает на вопрос. Он просто дает общее представление о -m. Вопрос был очень конкретным, поэтому дольше! = Лучше. Решающее упоминание флага git commit --amend, вероятно, будет скрыто в остальной части информации. Мне также неудобно редактировать ответ, у которого уже так много голосов.
    2014-07-20 20: 51: 26Z
  2. Это означает, что вы можете редактировать верхний ответ, поскольку существует реальная опасность того, что люди используют его в качестве «правильного» ответа. Может случиться так, что вы исправите ваш коммит с помощью инсценировки - это случилось со мной, и это действительно раздражает, когда вы сталкиваетесь с этим. Но все же количество не является гарантией правильности. Ни по количеству ответов, ни по количеству голосов.
    2014-07-20 20: 51: 54Z
  3. Я бы не стал так далеко говорить, что лучший ответ «неверно» и что «не отвечает на вопрос». Это определенно работает и отвечает на вопрос, вам просто нужно убедиться, что у вас нет внесенных изменений, когда вы пытаетесь внести изменения. Но я понимаю вашу мысль о необходимости предупреждать людей об этом. Я отредактирую это позже, если у меня будет время.
    2014-07-21 21: 26: 20Z
  4. Чтобы быть справедливым: несмотря на то, что опция -o с --only доступна начиная с git 1.3.0, она работала некорректно, пока не была исправлена ​​в 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Таким образом, правильный ответ в 2008 году, вероятно, был бы примерно таким: --amend.
    2014-07-21 23: 00: 48Z

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

git stash; git commit --amend; git stash pop

Или попробуйте git reset, как показано ниже:

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

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

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# it will reset you last commit. Now, you
# can re-commit it with new commit message.
может помочь вам также разбить один коммит на несколько коммитов: git reset

Здесь вы успешно разбили свой последний коммит на два.

    
99
2014-07-22 06: 24: 54Z
  1. Если все, что вы хотите сделать, - это отредактировать сообщение вашего последнего коммита, для этого используйте программный сброс over-kill . Просто используйте
    # reset your head. I am resetting to last commits:
    git reset --soft HEAD^
    # (you can reset multiple commit by doing HEAD~2(no. of commits)
    
    # Now, reset your head for splitting it to multiple commits
    git reset HEAD
    
    # add and commit your files seperately to make multiple commits: e.g
    git add app/
    git commit -m "add all files in app directory"
    
    git add config/
    git commit -m "add all files in config directory"
    
    , точно так же, как сказано в самом популярном ответе . Кроме того, git commit --amend работает аналогично программному сбросу в этом более раннем ответе , поскольку оба они возвращаются к первому родительскому коммиту.
    2014-07-21 23: 15: 47Z
  2. Я только удосужился добавить git reset --soft HEAD^ в решение, просто чтобы дать идею разбить одно сообщение о коммите на несколько сообщений о коммите. Потому что я столкнулся с этой проблемой, когда начал использовать git reset. Иногда это может быть действительно полезным. :)
    2014-07-22 06: 29: 00Z

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

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

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

git * Где 5 - количество сообщений коммита, которые вы хотите изменить. (поэтому, если вы хотите изменить 10-й на последний коммит, введите 10)

Эта команда введет вас в VIM, где вы сможете «редактировать» историю ваших коммитов. Вы увидите ваши последние 5 коммитов сверху:

git rebase -i HEAD~5

Вместо pick <commit hash> commit message вам нужно написать pick. Вы можете сделать это в VIM, введя reword, и вы перейдете в режим INSERT. (Вы видите, что находитесь в режиме вставки по слову INSERT внизу). Для коммитов вы хотите изменить тип i вместо reword

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

Затем VIM просматривает каждое сообщение коммита, которое вы хотите перефразировать, здесь вы можете изменить сообщения коммита. Вы сделаете это, войдя в режим INSERT, изменив сообщение фиксации, войдя в командный режим, сохраните и выйдите. Сделайте это 5 раз, и вы вне VIM!

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

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

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

    
82
2014-08-19 04: 34: 23Z
  1. git push --forceВ переполнении стека нет "тем", поскольку это не дискуссионный форум, есть только "вопросы", "ответы" и "сообщения" .<nitpick>. Кроме того, не все версии Vim одинаковы, не все из них позволяют удалять символы в режиме вставки (в некотором смысле, имеет смысл, верно?). Если вы хотите всегда иметь возможность удалять символы в Vim, </nitpick> и X сделают это (маленький x удаляет символы перед курсором, x удалит позади). Если вы допустили ошибки, вы можете использовать X несколько раз, чтобы отменить. Наконец, u - это сокращение от r в интерактивном редакторе ребаз.
    2014-08-07 17: 47: 10Z
  2. Чтобы изменить слово в vim, наберите reword в начале (хотя вопрос не о vim, я согласен).
    2015-12-05 06: 25: 59Z
  3. Вам не нужно использовать эта мерзость . Вы можете установить редактор git. что-то вменяемое и удобное для пользователя, например cw или mcedit Midnight Commander.
    2019-05-02 01: 28: 41Z

Я добавил псевдоним nano, reci для него recm, теперь я могу сделать это с recommit (amend) или git recm.

git recm -m     
76
2014-03-11 08: 21: 36Z

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

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

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
commit --amend

Он назван в честь действия по интерактивному перебазированию для изменения коммита: «переформулировать». Смотрите этот пост и man - интерактивный режим раздела -

Примеры: р>

$ git rebase-reword <commit-or-refname>
    
76
2015-07-29 22: 28: 58Z
  1. Это требует установки внешней программы. На мой взгляд, было бы лучше научиться более эффективно использовать встроенные инструменты и псевдонимы. Я бы набрал:
    $ git rebase-reword b68f560
    $ git rebase-reword HEAD^
    
    (совершить и перебазировать), переместить новый коммит туда, где я хочу, изменить g c; g rb -i @~9 на commit (f) и сохранить. Если вам нужно что-то более быстрое, вы можете использовать псевдоним fixup
    2015-04-29 15: 25: 01Z
  2. github.com/qxo/git -rebase-reword как для Linux, так и для Windows
    2016-10-29 10: 25: 14Z

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

git commit --fixup=<commit>; git rebase -i --autosquash <commit>^

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

    
54
2014-08-05 14: 44: 50Z
  1. Ничто никогда не перезаписывается в git. В этом случае указатель ветви будет установлен на ваш новый коммит, а старый коммит устареет, если на него не останется никаких ссылок, и он может быть очищен через несколько недель. (До тех пор другие все еще могут найти и сослаться на него, например, заглянув в журнал.)
    2014-09-04 23: 47: 35Z

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

  1. git commit --amend -m "T-1000, advanced prototype"
    git push --force
    
  2. git status
  3. git add --all
  4. git commit -am "message goes here about the change"
  5. git pull <origin master>
49
2015-02-03 11: 08: 43Z

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

git push <origin master>

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

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

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

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

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

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

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

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

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

    
43
2015-02-03 11: 14: 19Z
 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME
источник размещен Вот