Я написал неправильную вещь в сообщении фиксации.
Как я могу изменить сообщение? Коммит еще не был передан.
Я написал неправильную вещь в сообщении фиксации.
Как я могу изменить сообщение? Коммит еще не был передан.
Ответы:
git commit --amend
откроет ваш редактор, позволяющий вам изменить сообщение о коммите самого последнего коммита. Кроме того, вы можете установить сообщение фиксации непосредственно в командной строке с помощью:
git commit --amend -m "New commit message"
… Однако, это может сделать сообщения о многострочной фиксации или небольшие исправления более трудоемкими для ввода.
Убедитесь , что у вас нет каких - либо изменений в оборотном копии поставил перед этим или они получат совершенные тоже. ( Не внесенные изменения не будут зафиксированы.)
Если вы уже выдвинули свой коммит в удаленную ветку, то - после внесения изменений в ваш коммит локально (как описано выше) - вам также потребуется принудительно протолкнуть коммит с помощью:
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f
Предупреждение: принудительное нажатие перезапишет удаленную ветвь с состоянием вашей локальной ветки . Если есть фиксации на удаленном филиале , что вы не имеете в вашем местном отделении, вы будете терять эти коммиты.
Предупреждение: будьте осторожны при внесении изменений в коммиты, которыми вы уже поделились с другими людьми. Внесение изменений в коммиты по существу переписывает их с разными идентификаторами SHA , что создает проблему, если у других людей есть копии старого коммита, который вы переписали. Любой, у кого есть копия старого коммита, должен будет синхронизировать свою работу с вновь перезаписанным коммитом, что иногда может быть затруднено, поэтому убедитесь, что вы координируете действия с другими при попытке переписать историю общего коммита, или просто избегайте перезаписи общих коммитов в целом.
Другим вариантом является использование интерактивной перебазировки. Это позволяет вам редактировать любое сообщение, которое вы хотите обновить, даже если это не последнее сообщение.
Чтобы сделать сквош Git, выполните следующие действия:
// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n
Как только вы раздавите свои коммиты - выберите e/r
для редактирования сообщения:
При использовании git rebase -i HEAD~n
может быть больше n коммитов. Git "соберет" все коммиты за последние n коммитов, и если где-то между этими диапазонами произошло слияние, вы также увидите все коммиты, поэтому результат будет n +.
Если вам нужно сделать это для нескольких веток, и вы можете столкнуться с конфликтами при внесении изменений в контент, настройте git rerere
и позвольте Git автоматически разрешать эти конфликты за вас.
git commit --amend
не так мощно, как git rebase -i
.
git commit --amend
можно исправить (a?) Мастер-коммит.
git push -f origin branchname
git push -f
немного опасно, если другие люди используют тот же репозиторий?
git commit --amend -c HEAD
. Откроется редактор, предварительно заполненный вашим старым сообщением о коммите, и вы сможете его изменить.
git commit --amend -m "your new message"
Если фиксация, которую вы хотите исправить, не самая последняя:
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
), если после некорректного коммита произошло слияние.
Чтобы изменить предыдущий коммит, внесите необходимые изменения и выполните эти изменения, а затем выполните команду
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
git rebase -i HEAD~commit_count
также позволит вам изменить сообщения о коммите любого количества коммитов по вашему выбору. Просто пометьте выбранные коммиты как «reword» вместо «pick».
git reset --hard
уничтожает незафиксированные изменения. Пожалуйста, замените --hard
на --soft
.
git reset --hard
это совершенно законная команда, но она вводит в заблуждение, учитывая вопрос. Вы используете, --hard
если вы зафиксировали изменения, которые хотите отбросить, а не если вы сделали опечатку в сообщении коммита!
Как уже упоминалось, git commit --amend
это способ перезаписать последний коммит. Одно замечание: если вы хотите перезаписать файлы , команда
git commit -a --amend -m "My new commit message"
git add file.ext
затем простоgit commit --amend
Вы также можете использовать git filter-branch
для этого.
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
Это не так просто, как тривиально git commit --amend
, но особенно полезно, если у вас уже есть некоторые слияния после сообщения об ошибке.
Обратите внимание, что это попытается переписать каждый коммит между HEAD
ошибочным коммитом, поэтому вы должны выбирать свою msg-filter
команду очень мудро ;-)
$flawed_commit^..HEAD
, а не $flawed_commit..HEAD
. как указано на странице руководства: « Команда будет перезаписывать только те положительные ссылки, которые указаны в командной строке (например, если вы передадите a..b, только b будет перезаписано). »
Я предпочитаю этот способ:
git commit --amend -c <commit ID>
В противном случае будет новый коммит с новым идентификатором коммита.
-c
делает несколько вещей. По умолчанию используется старое сообщение, но также копируется информация об авторстве (человек и время). -C
делает то же самое, за исключением того, что он не просит вас отредактировать сообщение.
fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Если вы используете инструмент Git GUI, есть кнопка Amend last commit . Нажмите на эту кнопку, и тогда она покажет ваши последние файлы коммита и сообщение. Просто отредактируйте это сообщение, и вы можете зафиксировать его с новым сообщением фиксации.
Или используйте эту команду из консоли / терминала:
git commit -a --amend -m "My new commit message"
Вы можете использовать Git ReBasing . Например, если вы хотите изменить обратно, чтобы зафиксировать bbc643cd, запустите
$ git rebase bbc643cd^ --interactive
В редакторе по умолчанию измените 'pick' на 'edit' в строке, фиксацию которой вы хотите изменить. Сделайте свои изменения и затем поставьте их на
$ git add <filepattern>
Теперь вы можете использовать
$ git commit --amend
изменить коммит, и после этого
$ git rebase --continue
вернуться к предыдущему главному коммиту.
git commit --amend
вступило в силу, вы можете использовать git show
его, и оно покажет новое сообщение.
Если вы хотите изменить только последнее сообщение о коммите, то выполните:
git commit --amend
Это приведет вас в ваш текстовый редактор и позволит вам изменить последнее сообщение о коммите.
Если вы хотите изменить последние три сообщения фиксации, или любой из сообщения фиксации до этого момента, поставки HEAD~3
в git rebase -i
команде:
git rebase -i HEAD~3
git commit --amend
, и он также говорит, что вы можете использовать git rebase -i HEAD~commit_count
, все, что вы сделали, это подключить 3
для commit_count
.
Если вам нужно изменить старое сообщение о коммите в нескольких ветвях (т. Е. Коммит с ошибочным сообщением присутствует в нескольких ветвях), вы можете использовать:
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
чтобы исправить комментарии или добавить файлы, которые я забыл git add
, но только когда-либо прежде, чем я редактировал git push
. Я также использую, git filter-branch
когда я хочу полностью возиться с историей версий, но OP не хочет этого, поэтому этот ответ нуждается в большом предупреждении о вреде для здоровья - не пытайтесь делать это дома, подсматривает !!
использование
git commit --amend
Чтобы понять это подробно, отличный пост - 4. Переписывание Git History . Это также говорит о том, когда не использовать git commit --amend
.
git commit --amend
Ответ уже был дан ( в несколько раз) , прежде чем вы написали ваши. Почему вы отправили это снова? Если вы хотите добавить ссылку на «Переписывание истории Git», вы можете отредактировать один из существующих ответов или оставить комментарий.
У вас есть несколько вариантов здесь. Ты можешь сделать
git commit --amend
пока это ваш последний коммит.
В противном случае, если это не ваш последний коммит, вы можете сделать интерактивный ребаз,
git rebase -i [branched_from] [hash before commit]
Затем в интерактивном ребазе вы просто добавляете правку в этот коммит. Когда он появится, сделайте git commit --amend
и измените сообщение коммита. Если вы хотите откатиться до этой точки фиксации, вы также можете использовать git reflog
и просто удалить эту фиксацию. Тогда вы просто делаете git commit
снова.
Если это ваш последний коммит, просто изменить фиксацию:
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
), сохраните и закройте файл. Выполнено!
Миниатюрный учебник 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:
$ git reset @~3 # Go back three 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
хотя - они могут отказаться от данных.
* Кроме того, не переписывайте историю ни в каких ветвях, над которыми вы сотрудничаете.
nano
? Мы говорим о тривиальных модификациях, которые необходимо внести в текстовый файл, а не о жестком кодировании, которое вызвало бы ожесточенную войну за «лучший» текстовый редактор.
ddjjpZZ
перемещает коммит 2 вниз. В базовых знаниях Vim нет ничего загадочного; Требуется 10 минут, чтобы стать более комфортным с Vim, чем с nano.
Если вы используете графический интерфейс Git, вы можете изменить последний коммит, который не был добавлен:
Commit/Amend Last Commit
Я использую графический интерфейс Git, насколько могу, и это дает вам возможность изменить последний коммит:
Кроме того, git rebase -i origin/master
это хорошая мантра, которая всегда представит вам коммиты, которые вы сделали на вершине мастера, и даст вам возможность изменить, удалить, изменить порядок или сквош. Нет необходимости сначала получать этот хеш.
Вау, так что есть много способов сделать это.
Еще один способ сделать это - удалить последний коммит, но сохранить его изменения, чтобы вы не потеряли свою работу. Затем вы можете сделать еще один коммит с исправленным сообщением. Это будет выглядеть примерно так:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
Я всегда делаю это, если забываю добавить файл или внести изменения.
Не забудьте указать --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
) выполнялась дополнительная команда для принудительного нажатия на ветвь. Я бы рекомендовал прочитать все это и применить необходимую осторожность!
Если вы просто хотите отредактировать последний коммит, используйте:
git commit --amend
или
git commit --amend -m 'one line message'
Но если вы хотите отредактировать несколько коммитов подряд, вам следует вместо этого использовать перебазирование:
git rebase -i <hash of one commit before the wrong commit>
В файле, как показано выше, напишите edit/e
или одну из других опций и нажмите «Сохранить и выйти».
Теперь вы будете при первом неверном коммите. Внесите изменения в файлы, и они будут автоматически подготовлены для вас. Тип
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
. Вопрос был очень конкретным, поэтому дольше! = Лучше. Решающее упоминание о -o
флаге, вероятно, будет похоронено в остальной части информации. Мне также не удобно редактировать ответ, у которого уже так много голосов.
--only
опция с --amend
доступна с git 1.3.0, она не работала правильно, пока не была исправлена в 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Таким образом, правильный ответ еще в 2008 году, вероятно, было что - то вроде: git stash; git commit --amend; git stash pop
.
Обновите свое последнее неверное сообщение о коммите новым сообщением о коммите в одной строке:
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.
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 separately 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
, точно так, как написано в топ-ответе . Кроме того, git reset --soft HEAD^
работает аналогично программному сбросу в этом предыдущем ответе , потому что они оба возвращаются к первому родительскому коммиту.
git reset
решение, чтобы дать идею разбить одно сообщение о коммите на несколько сообщений о коммите. Потому что я столкнулся с этой проблемой, когда я начал использовать git
. Иногда это может быть очень полезным. :)
На этот вопрос есть много ответов, но ни один из них не объясняет в мельчайших подробностях, как изменить старые сообщения коммита с помощью Vim . Я застрял, пытаясь сделать это сам, поэтому здесь я подробно опишу, как я это сделал, особенно для людей, которые не имеют никакого опыта в Vim!
Я хотел изменить свои пять последних коммитов, которые я уже отправил на сервер. Это довольно «опасно», потому что, если кто-то еще извлек это, вы можете испортить ситуацию, изменив сообщения коммита. Однако, когда вы работаете над своей маленькой веткой и уверены, что никто не потянул ее, вы можете изменить ее следующим образом:
Допустим, вы хотите изменить свои пять последних коммитов, а затем введите это в терминале:
git rebase -i HEAD~5
* Где 5 - количество сообщений о коммитах, которые вы хотите изменить (поэтому, если вы хотите изменить с 10-го на последний коммит, введите 10).
Эта команда приведет вас в Vim, где вы сможете «редактировать» историю коммитов. Вы увидите свои последние пять коммитов наверху, как это:
pick <commit hash> commit message
Вместо 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
$ git rebase-reword <commit-or-refname>
Он назван в честь действия по перебазированию в интерактивном режиме для изменения коммита: «reword». Смотрите этот пост и человек -сече- интерактивный Режим-
Примеры:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
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
:
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
Я понял, что вставил коммит с опечаткой. Чтобы отменить, я сделал следующее:
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
Это лучший метод при изменении сообщения фиксации, если оно уже было отправлено.