Я написал неправильную вещь в сообщении фиксации.
Как я могу изменить сообщение? Коммит еще не был передан.
git
git-commit
git-rewrite-history
amend
Лори Янг
источник
источник
Ответы:
Изменение самого последнего сообщения о коммите
откроет ваш редактор, позволяющий вам изменить сообщение о коммите самого последнего коммита. Кроме того, вы можете установить сообщение фиксации непосредственно в командной строке с помощью:
… Однако, это может сделать сообщения о многострочной фиксации или небольшие исправления более трудоемкими для ввода.
Убедитесь , что у вас нет каких - либо изменений в оборотном копии поставил перед этим или они получат совершенные тоже. ( Не внесенные изменения не будут зафиксированы.)
Изменение сообщения коммита, который вы уже отправили в удаленную ветку
Если вы уже выдвинули свой коммит в удаленную ветку, то - после внесения изменений в ваш коммит локально (как описано выше) - вам также потребуется принудительно протолкнуть коммит с помощью:
Предупреждение: принудительное нажатие перезапишет удаленную ветвь с состоянием вашей локальной ветки . Если есть фиксации на удаленном филиале , что вы не имеете в вашем местном отделении, вы будете терять эти коммиты.
Предупреждение: будьте осторожны при внесении изменений в коммиты, которыми вы уже поделились с другими людьми. Внесение изменений в коммиты по существу переписывает их с разными идентификаторами SHA , что создает проблему, если у других людей есть копии старого коммита, который вы переписали. Любой, у кого есть копия старого коммита, должен будет синхронизировать свою работу с вновь перезаписанным коммитом, что иногда может быть затруднено, поэтому убедитесь, что вы координируете действия с другими при попытке переписать историю общего коммита, или просто избегайте перезаписи общих коммитов в целом.
Выполнить интерактивную перебазировку
Другим вариантом является использование интерактивной перебазировки. Это позволяет вам редактировать любое сообщение, которое вы хотите обновить, даже если это не последнее сообщение.
Чтобы сделать сквош Git, выполните следующие действия:
Как только вы раздавите свои коммиты - выберите
e/r
для редактирования сообщения:Важное замечание об интерактивной перебазировке
При использовании
git rebase -i HEAD~n
может быть больше n коммитов. Git "соберет" все коммиты за последние n коммитов, и если где-то между этими диапазонами произошло слияние, вы также увидите все коммиты, поэтому результат будет n +.Хороший совет:
Если вам нужно сделать это для нескольких веток, и вы можете столкнуться с конфликтами при внесении изменений в контент, настройте
git rerere
и позвольте Git автоматически разрешать эти конфликты за вас.Документация
git-commit (1) Страница руководства
git-rebase (1) Страница руководства
git-push (1) Страница руководства
источник
git commit --amend
не так мощно, какgit rebase -i
.git commit --amend
можно исправить (a?) Мастер-коммит.git push -f origin branchname
git push -f
немного опасно, если другие люди используют тот же репозиторий?git commit --amend -c HEAD
. Откроется редактор, предварительно заполненный вашим старым сообщением о коммите, и вы сможете его изменить.источник
Если фиксация, которую вы хотите исправить, не самая последняя:
git rebase --interactive $parent_of_flawed_commit
Если вы хотите исправить несколько некорректных коммитов, передайте родителю самого старого из них.
Появится редактор со списком всех коммитов, начиная с того, который вы дали.
pick
наreword
(или на старых версиях Git, наedit
) перед любыми коммитами, которые вы хотите исправить.Для каждого коммита, который вы хотите перефразировать , Git вернет вас обратно в ваш редактор. Для каждого коммита, который вы хотите редактировать , Git помещает вас в оболочку. Если вы в оболочке:
git commit --amend
git rebase --continue
Большая часть этой последовательности будет объяснена вам при выводе различных команд. Это очень просто; Вам не нужно запоминать это - просто помните, что это
git rebase --interactive
позволяет вам исправлять коммиты, независимо от того, как давно они были.Обратите внимание, что вы не захотите изменять коммиты, которые вы уже выдвинули. Или, может быть, так и есть, но в этом случае вам придется позаботиться о том, чтобы общаться со всеми, кто мог выполнить ваши коммиты и поработать над ними. Как я могу восстановить / повторно синхронизировать после того, как кто-то отправит ребаз или сброс в опубликованную ветку?
источник
reword
вместо этогоpick
для редактирования сообщения журнала.$parent_of_flawed_commit
это эквивалентно$flawed_commit^
.-p
(--preserve-merges
), если после некорректного коммита произошло слияние.Чтобы изменить предыдущий коммит, внесите необходимые изменения и выполните эти изменения, а затем выполните команду
Это откроет файл в вашем текстовом редакторе, представляющий ваше новое сообщение коммита. Он начинается с текста из вашего старого сообщения коммита. Измените сообщение коммита как хотите, затем сохраните файл и выйдите из редактора, чтобы завершить работу.
Чтобы изменить предыдущую фиксацию и сохранить то же сообщение журнала, запустите
Чтобы исправить предыдущий коммит, удалив его полностью, запустите
Если вы хотите отредактировать более одного сообщения о коммите, запустите
(Замените commit_count на количество коммитов, которые вы хотите редактировать.) Эта команда запускает ваш редактор. Пометьте первый коммит (тот, который вы хотите изменить) как «edit» вместо «pick», затем сохраните и выйдите из вашего редактора. Сделайте изменения, которые вы хотите зафиксировать, а затем выполните
Примечание. Вы также можете «внести необходимые изменения» в редакторе, открытом
git commit --amend
источник
git rebase -i HEAD~commit_count
также позволит вам изменить сообщения о коммите любого количества коммитов по вашему выбору. Просто пометьте выбранные коммиты как «reword» вместо «pick».git reset --hard
уничтожает незафиксированные изменения. Пожалуйста, замените--hard
на--soft
.git reset --hard
это совершенно законная команда, но она вводит в заблуждение, учитывая вопрос. Вы используете,--hard
если вы зафиксировали изменения, которые хотите отбросить, а не если вы сделали опечатку в сообщении коммита!Как уже упоминалось,
git commit --amend
это способ перезаписать последний коммит. Одно замечание: если вы хотите перезаписать файлы , командаисточник
git add file.ext
затем простоgit commit --amend
Вы также можете использовать
git filter-branch
для этого.Это не так просто, как тривиально
git commit --amend
, но особенно полезно, если у вас уже есть некоторые слияния после сообщения об ошибке.Обратите внимание, что это попытается переписать каждый коммит между
HEAD
ошибочным коммитом, поэтому вы должны выбирать своюmsg-filter
команду очень мудро ;-)источник
$flawed_commit^..HEAD
, а не$flawed_commit..HEAD
. как указано на странице руководства: « Команда будет перезаписывать только те положительные ссылки, которые указаны в командной строке (например, если вы передадите a..b, только b будет перезаписано). »Я предпочитаю этот способ:
В противном случае будет новый коммит с новым идентификатором коммита.
источник
-c
делает несколько вещей. По умолчанию используется старое сообщение, но также копируется информация об авторстве (человек и время).-C
делает то же самое, за исключением того, что он не просит вас отредактировать сообщение.fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Если вы используете инструмент Git GUI, есть кнопка Amend last commit . Нажмите на эту кнопку, и тогда она покажет ваши последние файлы коммита и сообщение. Просто отредактируйте это сообщение, и вы можете зафиксировать его с новым сообщением фиксации.
Или используйте эту команду из консоли / терминала:
источник
Вы можете использовать Git ReBasing . Например, если вы хотите изменить обратно, чтобы зафиксировать bbc643cd, запустите
В редакторе по умолчанию измените 'pick' на 'edit' в строке, фиксацию которой вы хотите изменить. Сделайте свои изменения и затем поставьте их на
Теперь вы можете использовать
изменить коммит, и после этого
вернуться к предыдущему главному коммиту.
источник
git commit --amend
вступило в силу, вы можете использоватьgit show
его, и оно покажет новое сообщение.Если вы хотите изменить только последнее сообщение о коммите, то выполните:
Это приведет вас в ваш текстовый редактор и позволит вам изменить последнее сообщение о коммите.
Если вы хотите изменить последние три сообщения фиксации, или любой из сообщения фиксации до этого момента, поставки
HEAD~3
вgit rebase -i
команде:источник
git commit --amend
, и он также говорит, что вы можете использоватьgit rebase -i HEAD~commit_count
, все, что вы сделали, это подключить3
дляcommit_count
.Если вам нужно изменить старое сообщение о коммите в нескольких ветвях (т. Е. Коммит с ошибочным сообщением присутствует в нескольких ветвях), вы можете использовать:
Git создаст временный каталог для перезаписи и дополнительно создаст резервную копию старых ссылок в
refs/original/
.-f
обеспечит выполнение операции. Это необходимо, если временный каталог уже существует или если в нем уже есть ссылкиrefs/original
. Если это не так, вы можете сбросить этот флаг.--
отделяет параметры ветви фильтра от параметров ревизии.--all
убедитесь, что все ветви и теги переписаны.Благодаря резервному копированию ваших старых ссылок, вы можете легко вернуться в состояние перед выполнением команды.
Скажем, вы хотите восстановить своего мастера и получить к нему доступ в ветке
old_master
:источник
git commit --amend
чтобы исправить комментарии или добавить файлы, которые я забылgit add
, но только когда-либо прежде, чем я редактировалgit push
. Я также использую,git filter-branch
когда я хочу полностью возиться с историей версий, но OP не хочет этого, поэтому этот ответ нуждается в большом предупреждении о вреде для здоровья - не пытайтесь делать это дома, подсматривает !!использование
Чтобы понять это подробно, отличный пост - 4. Переписывание Git History . Это также говорит о том, когда не использовать
git commit --amend
.источник
git commit --amend
Ответ уже был дан ( в несколько раз) , прежде чем вы написали ваши. Почему вы отправили это снова? Если вы хотите добавить ссылку на «Переписывание истории Git», вы можете отредактировать один из существующих ответов или оставить комментарий.изменить
У вас есть несколько вариантов здесь. Ты можешь сделать
пока это ваш последний коммит.
Интерактивная перебазировка
В противном случае, если это не ваш последний коммит, вы можете сделать интерактивный ребаз,
Затем в интерактивном ребазе вы просто добавляете правку в этот коммит. Когда он появится, сделайте
git commit --amend
и измените сообщение коммита. Если вы хотите откатиться до этой точки фиксации, вы также можете использоватьgit reflog
и просто удалить эту фиксацию. Тогда вы просто делаетеgit commit
снова.источник
Если это ваш последний коммит, просто изменить фиксацию:
(Использование флага
-o
(--only
), чтобы убедиться, что вы изменяете только сообщение фиксации)Если это скрытый коммит, используйте потрясающую интерактивную ребазу :
Найдите нужный коммит, измените
pick
наr
(reword
), сохраните и закройте файл. Выполнено!Миниатюрный учебник Vim (или, как сделать перебаз только с 8 нажатиями клавиш
3j
cw
r
EscZZ
):vimtutor
если есть времяh
j
k
l
соответствуют клавишам движения ←↓↑→3j
перемещается вниз на три строкиi
для входа в режим вставки - введенный вами текст появится в файлеc
для выхода из режима вставки и возврата в «нормальный» режимu
отменитьr
переделатьdd
,dw
,dl
Чтобы удалить строку, слово или букву, соответственноcc
,cw
,cl
Чтобы изменить строку, слово или букву, соответственно ( такой же , какdd
i
)yy
,yw
,yl
Копировать ( «дернул») линию, слово или букву, соответственноp
илиP
вставить после или перед текущей позицией соответственно:w
Enter сохранить (записать) файл:q!
Enter выйти без сохранения:wq
EnterилиZZ
сохранить и выйтиЕсли вы много редактируете текст, переключитесь на раскладку клавиатуры Dvorak , научитесь печатать на клавиатуре и изучите Vim. Стоит ли усилий? Да.
ProTip ™: не бойтесь экспериментировать с «опасными» командами, которые переписывают историю * - Git по умолчанию не удаляет ваши коммиты в течение 90 дней; вы можете найти их в reflog:
* Остерегайтесь опций, как
--hard
и--force
хотя - они могут отказаться от данных. * Кроме того, не переписывайте историю ни в каких ветвях, над которыми вы сотрудничаете.источник
nano
? Мы говорим о тривиальных модификациях, которые необходимо внести в текстовый файл, а не о жестком кодировании, которое вызвало бы ожесточенную войну за «лучший» текстовый редактор.ddjjpZZ
перемещает коммит 2 вниз. В базовых знаниях Vim нет ничего загадочного; Требуется 10 минут, чтобы стать более комфортным с Vim, чем с nano.Если вы используете графический интерфейс Git, вы можете изменить последний коммит, который не был добавлен:
источник
Я использую графический интерфейс Git, насколько могу, и это дает вам возможность изменить последний коммит:
Кроме того,
git rebase -i origin/master
это хорошая мантра, которая всегда представит вам коммиты, которые вы сделали на вершине мастера, и даст вам возможность изменить, удалить, изменить порядок или сквош. Нет необходимости сначала получать этот хеш.источник
Вау, так что есть много способов сделать это.
Еще один способ сделать это - удалить последний коммит, но сохранить его изменения, чтобы вы не потеряли свою работу. Затем вы можете сделать еще один коммит с исправленным сообщением. Это будет выглядеть примерно так:
Я всегда делаю это, если забываю добавить файл или внести изменения.
Не забудьте указать
--soft
вместо--hard
, иначе вы потеряете этот коммит полностью.источник
git commit --amend
за исключением того, что это двухэтапный процесс.--amend
будет хранить информацию об авторе, но вопрос только просит изменить сообщение.Для тех, кто ищет графический интерфейс для Windows / Mac, чтобы помочь с редактированием старых сообщений (т.е. не только самого последнего сообщения), я бы порекомендовал Sourcetree . Шаги, чтобы следовать ниже.
Для коммитов, которые еще не были переданы на удаленное устройство:
Unable to create 'project_path/.git/index.lock': File exists.
при попытке изменить несколько сообщений коммита одновременно. Не знаю точно, в чем проблема, или будет ли она исправлена в будущей версии Sourcetree, но если это произойдет, рекомендую менять их по одному (медленнее, но кажется более надежным).... или ... для коммитов, которые уже были выдвинуты:
Выполните действия в этом ответе , которые аналогичны приведенным выше, но требуют, чтобы из командной строки (
git push origin <branch> -f
) выполнялась дополнительная команда для принудительного нажатия на ветвь. Я бы рекомендовал прочитать все это и применить необходимую осторожность!источник
Если вы просто хотите отредактировать последний коммит, используйте:
или
Но если вы хотите отредактировать несколько коммитов подряд, вам следует вместо этого использовать перебазирование:
В файле, как показано выше, напишите
edit/e
или одну из других опций и нажмите «Сохранить и выйти».Теперь вы будете при первом неверном коммите. Внесите изменения в файлы, и они будут автоматически подготовлены для вас. Тип
Сохраните и выйдите из этого и введите
перейти к следующему выбору, пока не закончите со всеми вашими выборами.
Обратите внимание, что эти вещи изменяют все ваши хэши SHA после этой конкретной фиксации.
источник
Если вы хотите изменить только ваше последнее сообщение, вы должны использовать
--only
флаг или его ярлык-o
сcommit --amend
:Это гарантирует, что вы случайно не улучшите свой коммит с помощью инсценировки. Конечно, лучше иметь правильную
$EDITOR
конфигурацию. Затем вы можете опустить-m
опцию, и Git предварительно заполнит сообщение коммита старым. Таким образом, это может быть легко отредактировано.источник
git commit --amend
. Вопрос был очень конкретным, поэтому дольше! = Лучше. Решающее упоминание о-o
флаге, вероятно, будет похоронено в остальной части информации. Мне также не удобно редактировать ответ, у которого уже так много голосов.--only
опция с--amend
доступна с git 1.3.0, она не работала правильно, пока не была исправлена в 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Таким образом, правильный ответ еще в 2008 году, вероятно, было что - то вроде:git stash; git commit --amend; git stash pop
.Обновите свое последнее неверное сообщение о коммите новым сообщением о коммите в одной строке:
Или попробуйте Git reset, как показано ниже:
Использование сброса для разделения коммитов на коммиты меньшего размера
git reset
может помочь вам разбить один коммит на несколько коммитов:Здесь вы успешно разбили свой последний коммит на два коммита.
источник
git commit --amend
, точно так, как написано в топ-ответе . Кроме того,git reset --soft HEAD^
работает аналогично программному сбросу в этом предыдущем ответе , потому что они оба возвращаются к первому родительскому коммиту.git reset
решение, чтобы дать идею разбить одно сообщение о коммите на несколько сообщений о коммите. Потому что я столкнулся с этой проблемой, когда я начал использоватьgit
. Иногда это может быть очень полезным. :)На этот вопрос есть много ответов, но ни один из них не объясняет в мельчайших подробностях, как изменить старые сообщения коммита с помощью Vim . Я застрял, пытаясь сделать это сам, поэтому здесь я подробно опишу, как я это сделал, особенно для людей, которые не имеют никакого опыта в Vim!
Я хотел изменить свои пять последних коммитов, которые я уже отправил на сервер. Это довольно «опасно», потому что, если кто-то еще извлек это, вы можете испортить ситуацию, изменив сообщения коммита. Однако, когда вы работаете над своей маленькой веткой и уверены, что никто не потянул ее, вы можете изменить ее следующим образом:
Допустим, вы хотите изменить свои пять последних коммитов, а затем введите это в терминале:
* Где 5 - количество сообщений о коммитах, которые вы хотите изменить (поэтому, если вы хотите изменить с 10-го на последний коммит, введите 10).
Эта команда приведет вас в Vim, где вы сможете «редактировать» историю коммитов. Вы увидите свои последние пять коммитов наверху, как это:
Вместо
pick
вас нужно написатьreword
. Вы можете сделать это в Vim, набравi
. Это заставляет вас войти в режим вставки . (Вы видите, что находитесь в режиме вставки по слову INSERT внизу.) Для фиксации, которую вы хотите изменить, введитеreword
вместоpick
.Затем вам нужно сохранить и выйти из этого экрана. Вы делаете это, сначала переходя в «командный режим» нажатием Escкнопки (вы можете проверить, что находитесь в командном режиме, если слово INSERT внизу исчезло). Затем вы можете ввести команду, набрав
:
. Команда для сохранения и выхода естьwq
. Так что, если вы введете,:wq
вы на правильном пути.Затем Vim просматривает каждое сообщение коммита, которое вы хотите перефразировать, и здесь вы можете изменить сообщения коммита. Вы сделаете это, войдя в режим вставки, изменив сообщение фиксации, войдя в командный режим, сохраните и выйдите. Сделайте это пять раз, и вы вне Vim!
Затем, если вы уже выдвинули свои неправильные коммиты, вам нужно
git push --force
их перезаписать. Помните, чтоgit push --force
это довольно опасная вещь, поэтому следите за тем, чтобы никто не извлекал данные с сервера, поскольку вы выдвинули неверные коммиты!Теперь вы изменили свои сообщения коммитов!
(Как вы видите, я не настолько опытен в Vim, поэтому, если я использовал неправильный «жаргон», чтобы объяснить, что происходит, смело поправляйте меня!)
источник
<nitpick>
В переполнении стека нет «тем», потому что это не дискуссионный форум, а только «вопросы», «ответы» и «сообщения».</nitpick>
, Кроме того, не все версии Vim одинаковы, не все из них позволяют удалять символы в режиме вставки (в некотором смысле, имеет смысл, верно?). Если вы хотите всегда иметь возможность удалять символы в Vim,X
иx
будете это делать (малоx
удаляет символы перед курсором,X
удалит сзади). Если вы делаете ошибки, вы можете использоватьu
несколько раз, чтобы отменить. Наконец,r
это сокращение дляreword
интерактивного редактора ребаз.cw
набирается в его начале (хотя вопрос не о vim, я согласен).nano
mcedit Midnight Commander.Вы можете использовать git-rebase-reword
Он предназначен для редактирования любого коммита (не только последнего) так же, как
commit --amend
Он назван в честь действия по перебазированию в интерактивном режиме для изменения коммита: «reword». Смотрите этот пост и человек -сече- интерактивный Режим-
Примеры:
источник
g c; g rb -i @~9
(commit и rebase), переместил новый коммит туда, куда я хочу, изменилcommit
наf
(fixup
) и сохрани. Если бы вы хотели что-то более быстрое, вы могли бы использовать псевдонимgit commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Я добавил псевдонимы
reci
иrecm
дляrecommit (amend)
этого. Теперь я могу сделать это с помощьюgit recm
илиgit recm -m
:источник
Я понял, что вставил коммит с опечаткой. Чтобы отменить, я сделал следующее:
Предупреждение: принудительное нажатие ваших изменений перезапишет удаленную ветку вашей локальной. Убедитесь, что вы не собираетесь перезаписывать то, что хотите сохранить. Также будьте осторожны с принудительным нажатием исправленного (переписанного) коммита, если кто-то еще поделится с вами веткой, потому что им нужно будет переписать свою собственную историю, если у них будет старая копия коммита, которую вы только что переписали.
источник
Мне нравится использовать следующее:
git status
git add --all
git commit -am "message goes here about the change"
git pull <origin master>
git push <origin master>
источник
Если вы не отправили код в удаленную ветку ( GitHub / Bitbucket ), вы можете изменить сообщение коммита в командной строке, как показано ниже.
Если вы работаете над определенной веткой, сделайте это:
Если вы уже нажали код с неправильным сообщением, и вам нужно быть осторожным при изменении сообщения. То есть, после того, как вы измените сообщение коммита и попытаетесь нажать его снова, у вас возникнут проблемы. Чтобы сделать это гладко, выполните следующие действия.
Пожалуйста, прочитайте весь мой ответ, прежде чем делать это.
Важное примечание: при непосредственном использовании принудительного нажатия вы можете столкнуться с проблемами кода, которые другие разработчики работают в той же ветке. Поэтому, чтобы избежать этих конфликтов, вам нужно извлечь код из вашей ветки, прежде чем делать принудительное нажатие :
Это лучший метод при изменении сообщения фиксации, если оно уже было отправлено.
источник