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

StackOverflow https://stackoverflow.com/questions/179123

Вопрос

Я написал не то в сообщении о фиксации.

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

Это было полезно?

Решение

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

git commit --amend

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

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

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

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

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

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

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

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

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


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

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

Чтобы сделать 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 для редактирования сообщения

enter image description here

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

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

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

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


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

Другие советы

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

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

<Ол> <Литий> <р> git rebase --interactive $parent_of_flawed_commit

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

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

    <Ол>
  • Измените pick на reword (или в старых версиях Git на edit) перед любыми коммитами, которые вы хотите исправить.
  • После сохранения Git воспроизведет перечисленные коммиты.

  • Для каждого коммита, который вы хотите переформулировать , Git вернет вас обратно в ваш редактор. Для каждого коммита, который вы хотите редактировать , Git помещает вас в оболочку. Если вы & # 8217; находитесь в оболочке:

    <Ол>
  • Измените коммит любым удобным вам способом.
  • <Литий> git commit --amend <Литий> git rebase --continue

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

    <Ч>

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

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

    git commit --amend
    

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

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

    git commit --amend -C HEAD
    

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

    git reset --hard HEAD^
    

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

    git rebase -i HEAD~commit_count

    (Замените commit_count числом коммитов, которое вы хотите редактировать.) Эта команда запускает ваш редактор. Пометьте первый коммит (тот, который вы хотите изменить) как & # 8220; edit & # 8221; вместо & # 8220; выберите & # 8221 ;, затем сохраните и выйдите из редактора. Сделайте изменения, которые вы хотите зафиксировать, и затем запустите

    git commit --amend
    git rebase --continue
    

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

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

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

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

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

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

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

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

    git commit --amend -c <commit ID>
    

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

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

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

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

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

    $ git rebase bbc643cd^ --interactive
    

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

    $ git add <filepattern>
    

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

    $ git commit --amend
    

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

    $ git rebase --continue
    

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

    <Ол>
  • Если вы хотите изменить только последнее сообщение о коммите, выполните:

    git commit --amend
    

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

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

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

    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
    

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

    git commit --amend
    

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

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

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

    git commit --amend
    

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

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

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

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

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

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

    Commit/Amend Last Commit
    

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

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

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


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

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

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



    Миниатюрный учебник по vim (или как выполнить перебазирование всего 8 нажатиями клавиш 3jcwrEscZZ):

    • Бежать vimtutor если у вас есть время
    • hjkl соответствуют клавишам перемещения
    • Все команды могут иметь префикс "range", например 3j перемещается вниз на 3 линии
    • i чтобы перейти в режим вставки — текст, который вы вводите, появится в файле
    • Esc или Ctrlc чтобы выйти из режима вставки и вернуться в "обычный" режим
    • u чтобы отменить
    • Ctrlr чтобы переделать
    • dd, dw, dl чтобы удалить строку, слово или букву соответственно
    • cc, cw, cl чтобы изменить строку, слово или букву соответственно (то же, что ddi)
    • yy, yw, yl скопировать ("выдернуть") строку, слово или букву соответственно
    • p или P вставить после или перед текущей позицией соответственно
    • :wВойти чтобы сохранить (записать) файл
    • :q!Войти выйти из игры без сохранения
    • :wqВойти или ZZ сохранить и выйти из игры

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



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

    $ 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 и --force хотя — они могут отбрасывать данные.
    * Кроме того, не переписывайте историю ни в одной из ветвей, в которых вы сотрудничаете.

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

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

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

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

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

    git reset --soft HEAD~1
    git commit -m 'New and corrected commit message'
    

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

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

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

    SourceTree interactive rebase

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

    1. Убедитесь, что вы зафиксировали или сохранили все текущие изменения (т.е.таким образом, на вкладке "Состояние файла" нет файлов) - иначе это не сработает.
    2. На вкладке "Журнал / История" щелкните правой кнопкой мыши на записи с прилегающей линией на графике один ниже фиксации, которые вы хотите отредактировать, и выберите "Перебазировать дочерние элементы <commit ref=""> в интерактивном режиме..."
    3. Выберите всю строку для сообщения о фиксации, которое вы хотите изменить (т. е.нажмите на колонку "Сообщение".).
    4. Нажмите кнопку "Отредактировать сообщение".
    5. Отредактируйте сообщение по своему усмотрению в появившемся диалоговом окне и затем нажмите кнопку ОК.
    6. Повторите шаги 3-4, если есть другие сообщения о фиксации, которые необходимо изменить.
    7. Нажмите кнопку ОК:Начнется перебазирование.Если все в порядке, вывод завершится "Успешно завершен". ПРИМЕЧАНИЕ: Недавно я видел, как это не сработало с Unable to create 'project_path/.git/index.lock': File exists. при попытке изменить несколько сообщений о фиксации одновременно.Не уверен точно, в чем проблема и будет ли она исправлена в будущей версии SourceTree, но если это произойдет, я бы рекомендовал перебазировать их по одному (медленнее, но кажется более надежным).

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

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

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

    git commit --amend
    

    или

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

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

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

    git rebase editing

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

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

    git commit --amend
    

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

    git rebase --continue 
    

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

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

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

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

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

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

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

    Или попробуйте git 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.
    

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

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

    # 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"
    

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

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

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

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

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

    Эта команда приведет вас в VIM, где вы сможете ‘отредактировать’ историю своих коммитов.Вы увидите свои последние 5 коммитов вверху следующим образом:

    pick <commit hash> commit message

    Вместо того, чтобы pick вам нужно написать reword.Вы можете сделать это в VIM, набрав i, это заставляет вас перейти в режим ВСТАВКИ.(Вы видите, что находитесь в режиме вставки, по слову ВСТАВИТЬ внизу) Для коммитов, которые вы хотите изменить, введите reword вместо того, чтобы pick

    Затем вам нужно сохранить и закрыть этот экран, вы делаете это, сначала перейдя в ‘командный режим’, нажав кнопку esc.(вы можете проверить, что вы находитесь в командном режиме, если слово ВСТАВИТЬ внизу исчезло) Затем вы можете ввести команду, набрав :, команда для сохранения и выхода - это wq.Итак, если вы введете :wq ты на правильном пути.

    Затем VIM просмотрит каждое сообщение о фиксации, которое вы хотите переписать, здесь вы действительно можете изменить сообщения о фиксации.Вы сделаете это, перейдя в режим ВСТАВКИ, изменив сообщение о фиксации, перейдя в командный режим, сохранив и завершив работу.Проделайте это 5 раз, и у вас закончится VIM!

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

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

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

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

    $ vim ~/.gitconfig
    
    [alias]
    
        ......
        cm = commit
        reci = commit --amend
        recm = commit --amend
        ......
    

    Вы можете использовать git-перебазирование-перефразирование

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

    $ git rebase-reword <commit-or-refname>
    

    Он назван в честь действия в rebase interactive по изменению фиксации:"перефразируй".Видишь этот пост и человек -интерактивный режим раздела-

    Примеры:

    $ git rebase-reword b68f560
    $ git rebase-reword HEAD^
    

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

    git commit --amend -m "T-1000, advanced prototype"
    git push --force
    

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

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

    <Ол> <Литий> git status <Литий> git add --all <Литий> git commit -am "message goes here about the change" <Литий> git pull <origin master> <Литий> git push <origin master>

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

     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?
    

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top