Как изменить существующие невыдвинутые коммиты?

7676

Я написал неправильную вещь в сообщении коммита. Кроме того, я забыл включить некоторые файлы.

Как изменить сообщение/файлы комита? Коммит еще не запушен.

  • 868
    Для новичков: идея Лори о том, что она еще не подтолкнула, важна. Как и перебазирование, это меняет историю. Если кто-то клонировал / вытащил из вашего репо между оригинальной и переписанной историей, он не сможет вытащить после переписывания (для этой ветви).
Теги:
git-rewrite-history
git-commit
amend

27 ответов

15857
Лучший ответ

Внесение изменений в самое последнее сообщение о коммите

git commit --amend

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

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

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

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

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

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

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

Изображение 7435

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

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

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

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


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

  • 244
    Однако git commit --amend не так мощен, как git rebase -i .
  • 73
    @jeffjose, это определенно не должно быть. Также git commit --amend может исправить (a?) Master commit.
Показать ещё 28 комментариев
2437

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

  • git rebase --interactive $parent_of_flawed_commit

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

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

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

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

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

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


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

  • 38
    Можно ли изменить сообщение первого коммита (у которого нет родителя)?
  • 26
    Это упомянуто в одном из других ответов, но я помещу примечание здесь. Начиная с git 1.6.6 вы можете использовать reword вместо pick для редактирования сообщения журнала.
Показать ещё 13 комментариев
2317
git commit --amend -m "your new message"
  • 5
    Я сделал git commit --amend -m «Новое сообщение», но нажатие на Github сгенерировало «Объединить удаленные изменения перед повторной передачей». После pull, commit --amend и push снова, новое сообщение не появляется. Вместо этого у меня есть "Merge ветка 'master' из github.com:[myrepo]"
  • 6
    @DaveEveritt вы, скорее всего, передали свой коммит вверх по течению, прежде чем пытаться это исправить.
Показать ещё 13 комментариев
795

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

git commit --amend

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

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

git commit --amend -C HEAD

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

git reset --hard HEAD^

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

git rebase -i HEAD~commit_count

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

git commit --amend
git rebase --continue

Примечание. Вы можете "Сделать желаемое изменение" также из редактора, открытого git commit --amend

  • 17
    git rebase -i HEAD~commit_count также позволит вам изменять сообщения коммита, сколько бы вы ни выбрали коммитов. Просто пометьте выбранные коммиты как «reword» вместо «pick».
  • 1
    Что делать, если вы не хотите перебазировать? Вы просто хотите изменить старое сообщение?
Показать ещё 1 комментарий
371

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

git commit -a --amend -m "My new commit message"
  • 2
    И если вы не хотите добавлять все, вы можете сначала сделать git add file.ext затем просто git commit --amend
368

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

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

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

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

  • 3
    Есть ли версия этого, которая не изменяет коммит, если регулярное выражение ничего не находит?
  • 2
    AFAIK filter-branch --msg-filter будет генерировать новые коммиты в любом случае. Тем не менее, вы можете проверить в msg-фильтре, успешен ли sed, и использовать эту информацию после завершения операции ответвления фильтра, чтобы сбросить ваше дерево до refs / original.
Показать ещё 3 комментария
312

Я предпочитаю этот путь.

git commit --amend -c <commit ID>

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

  • 6
    Для меня, использование вашей команды выше фактически создает новый коммит с новым идентификатором фиксации плюс дополнительный коммит, говорящий «ветвь слияния» в качестве сообщения фиксации по умолчанию.
  • 40
    Изменение всегда создает новый коммит с новым идентификатором коммита. Идентификатор фиксации - это SHA-хэш содержимого фиксации, включая сообщение фиксации и созданные / зафиксированные временные метки. Это особенность Git, которая, за исключением коллизий хешей, гарантирует, что два коммита с одним и тем же идентификатором - это в точности один и тот же коммит, с одинаковым содержанием, историей и т. Д.
Показать ещё 4 комментария
296

Вы можете использовать Git rebasing. Например, если вы хотите изменить back to commit bbc643cd, запустите

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

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

$ git commit --amend

чтобы изменить фиксацию, и после этого

$ git rebase --continue

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

  • 1
    Если вы хотите убедиться, что ваше изменение от git commit --amend вступило в силу, вы можете использовать git show и оно покажет новое сообщение.
294

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

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

git commit -a --amend -m "My new commit message"
262
  • Если вы хотите изменить последнее сообщение о фиксации, выполните следующие действия:

    git commit --amend
    

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

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

    git rebase -i HEAD~3
    
  • 5
    В этом предыдущем ответе уже сказано, что вы можете использовать git commit --amend , и также сказано, что вы можете использовать git rebase -i HEAD~commit_count , все, что вы сделали, это подключили 3 для commit_count .
244

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

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

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

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

  • -- отделяет опции filter- от параметров ревизии.

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

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

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

git checkout -b old_master refs/original/refs/heads/master
  • 2
    Этот ответ не отвечает на вопрос OP, поскольку они просто заинтересованы в фиксации коммита, который они только что сделали. Я регулярно использую git commit --amend для исправления комментариев или добавления файлов, которые я забыл git add , но только когда-либо до того, как у меня git push ed. Я также использую git filter-branch когда хочу полностью запутаться в истории версий, но OP не хочет этого, поэтому для этого ответа нужно большое предупреждение о здоровье - не пытайтесь сделать это дома, подсматривает !!
210

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

git commit --amend

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

  • 2
    Есть ли хороший способ исправить сообщения коммита, уже отправленные в публичный репозиторий? До сих пор я пришел к выводу, что после опечатки мои сообщения о коммитах и thinkos должны жить вечно.
  • 2
    Одним словом, НОПЕ! Нет ХОРОШЕГО способа убрать то, что вы нажали. Все ретракции ПЛОХО в большей или меньшей степени. Вы должны принять дисциплину работы в ветке в своем личном репозитории, делая несколько коммитов, когда вы добавляете немного, проверяете немного, настраиваете немного. Затем объедините всю ветку в один коммит, напишите новое сообщение коммита, описывающее общее изменение, PROOFREAD и нажмите.
Показать ещё 1 комментарий
204

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

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

git commit --amend

до тех пор, пока оно не будет выполнено последним.

Интерактивная переадресация

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

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

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

183

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

Commit/Amend Last Commit
178

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

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

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


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

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

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



Миниатюрный учебник vim (или, как переустановить всего 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, чтобы изменить строку, слово или букву соответственно (то же самое, что dd i)
  • yy, yw, yl для копирования ( "yank" ) строки, слова или буквы, соответственно
  • p или p для вставки после или до текущей позиции соответственно
  • :w Enter для сохранения (записи) файла
  • :q! Enter выйти без сохранения
  • :wq Enter или ZZ для сохранения и выхода

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



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

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

173

Я использую Git GUI столько, сколько могу, и это дает вам возможность изменить последнее сообщение:

Изображение 7436

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

  • 3
    Как мне добраться до того экрана, который вы показали в своем примере?
  • 1
    Это нижняя правая часть Windows Git Gui. Просто выберите переключатель «Amend Last Commit», и он будет заполнен самой последней информацией о коммите.
135

Ничего себе, поэтому есть много способов сделать это.

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

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

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

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

  • 3
    Это делает то же самое, что и git commit --amend за исключением того, что это двухэтапный процесс.
  • 1
    @ JosephK.Strauss Я полагаю, что внесение изменений в коммит также сохраняет оригинальную информацию об авторе и дате коммита, а также информацию о новом коммитере и дате отдельно. Я не уверен, что такой подход делает это.
Показать ещё 1 комментарий
118

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

git commit --amend

или

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

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

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

Изображение 7437

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

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

git commit --amend

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

git rebase --continue 

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

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

  • 1
    git rebase -i <хэш одного коммита до неправильного коммита> работает для меня. Благодарю.
117

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

Изображение 7438

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

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

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

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

116

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

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

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

  • 1
    «Верхний» ответ не отвечает на вопрос. Он просто дает общее представление о git commit --amend . Вопрос был очень конкретным, поэтому дольше! = Лучше. Решающее упоминание флага -o , вероятно, будет скрыто в остальной части информации. Мне также не удобно редактировать ответ, у которого уже так много голосов.
  • 2
    При этом вы можете редактировать верхний ответ, поскольку существует реальная опасность того, что люди используют его в качестве «правильного» ответа. Может случиться так, что вы исправите ваш коммит с помощью инсценировки - это случилось со мной, и это действительно раздражает, когда вы сталкиваетесь с этим. Но все же количество не является гарантией правильности. Ни по количеству ответов, ни по количеству голосов.
Показать ещё 2 комментария
95

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

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"

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

  • 2
    Если все, что вы хотите сделать, это отредактировать сообщение вашего последнего коммита, то для этой цели используется программный сброс, а затем - избыточное уничтожение . Просто используйте git commit --amend , точно так же, как это написано в топ-ответе . Кроме того, git reset --soft HEAD^ работает аналогично программному сбросу в этом более раннем ответе , потому что они оба возвращаются к первому родительскому коммиту.
  • 2
    Я только добавляю git reset в решение, чтобы дать идею разбить одно сообщение о коммите на несколько сообщений о коммите. Потому что я столкнулся с этой проблемой, когда начал использовать git . Иногда это может быть очень полезным. :)
86

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

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

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

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

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

pick <commit hash> commit message

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

Затем вам нужно сохранить и выйти из этого экрана, вы делаете это, сначала перейдя в режим command-, нажав кнопку esc. (вы можете проверить, что вы находитесь в режиме command-, если слово INSERT внизу исчезло). Затем вы можете ввести команду, набрав :, команда сохранения и выхода - wq. Поэтому, если вы наберете :wq youre ont, он будет прав.

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

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

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

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

  • 4
    <nitpick> В «Переполнении стека» нет «тем», потому что это не дискуссионный форум, а только «вопросы», «ответы» и «сообщения». </nitpick> . Кроме того, не все версии Vim одинаковы, не все из них позволяют удалять символы в режиме вставки (в некотором смысле, имеет смысл, верно?). Если вы хотите всегда иметь возможность удалять символы в Vim, X и x сделают это (маленький x удаляет символы перед курсором, X удаляет позади). Если вы делаете ошибки, вы можете использовать u несколько раз, чтобы отменить. Наконец, r - это сокращение для reword в интерактивном редакторе ребаз.
  • 1
    Чтобы изменить слово в vim, набирается cw в его начале (хотя вопрос не в vim, я согласен).
73

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

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

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

Он назван в честь действия по интерактивной переадресации, чтобы исправить фиксацию: "изменить". См. этот пост и man -section interactive mode-

Примеры:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^
  • 5
    Это требует установки внешней программы. На мой взгляд, было бы лучше научиться более эффективно использовать встроенные инструменты и псевдонимы. Я бы gc; g rb -i @~9 : gc; g rb -i @~9 (commit и rebase), переместите новый коммит туда, куда я хочу, измените commit на f ( fixup ) и сохраните. Если вам нужно что-то более быстрое, вы можете использовать псевдоним git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
  • 1
    github.com/qxo/git-rebase-reword как для Linux, так и для Windows
73

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

$ vim ~/.gitconfig

[alias]

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

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

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

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

  • 5
    Ничто никогда не перезаписывается в git. В этом случае указатель ветви будет установлен на ваш новый коммит, а старый коммит устареет, если на него не останется никаких ссылок, и он может быть очищен через несколько недель. (До тех пор другие могут найти и сослаться на него, например, заглянув в журнал.)
47

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

  • git status
  • git add --all
  • git commit -am "message goes here about the change"
  • git pull <origin master>
  • git push <origin master>
41

Если вы не нажали код на удаленную ветку (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?

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню