Я написал неправильную вещь в сообщении коммита.
Как я могу изменить сообщение? Коммит еще не был передан.
Я написал неправильную вещь в сообщении коммита.
Как я могу изменить сообщение? Коммит еще не был передан.
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
для редактирования сообщения
Когда вы используете git rebase -i HEAD~X
может быть больше чем X
коммитов. Git "соберет" все коммиты в последних X
коммитах, и если где-то между этими диапазонами произошло слияние, вы также увидите все коммиты, поэтому результат будет X+.
Если вам нужно сделать это более чем для одной ветки, и вы можете столкнуться с конфликтами при внесении изменений в контент, настройте git rerere
и позвольте git автоматически разрешать эти конфликты.
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
позволяет вам исправлять, независимо от того, как давно они были.
Обратите внимание, что вы не захотите изменять фиксации, которые вы уже нажали. Или, может быть, вы это сделаете, но в этом случае вам придется проявлять большую осторожность, чтобы общаться со всеми, кто, возможно, потянул ваши коммиты и сделал работу поверх них. Как восстановить/пересинхронизировать после того, как кто-то перетащил rebase или reset в опубликованную ветку?
Чтобы внести изменения в предыдущую фиксацию, внесите необходимые изменения и выполните эти изменения, а затем запустите
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
Как уже упоминалось, 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, есть кнопка с именем last last commit. Нажмите на эту кнопку, а затем отобразите свои последние файлы комита и сообщение. Просто отредактируйте это сообщение, и вы можете зафиксировать его с новым сообщением фиксации.
Или используйте эту команду с консоли/терминала:
git commit -a --amend -m "My new commit message"
Вы можете использовать Git rebasing. Например, если вы хотите изменить back to commit 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
. Если это не так, вы можете удалить этот флаг.
--
отделяет опции filter- от параметров ревизии.
--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
Если это ваша последняя фиксация, просто исправить 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
, чтобы войти в режим вставки - текст, который вы вводите, появится в файлеc
, чтобы выйти из режима вставки и вернуться в "обычный" режимu
для отмены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 [email protected]{0}: reset: moving to @~3
2c52489 [email protected]{1}: commit: more changes
4a5246d [email protected]{2}: commit: make important changes
e8571e4 [email protected]{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
* Остерегайтесь таких параметров, как --hard
и --force
, хотя они могут отбрасывать данные.
* Также не переписывайте историю в каких-либо ветких, с которыми вы сотрудничаете.
Я использую Git GUI столько, сколько могу, и это дает вам возможность изменить последнее сообщение:
Кроме того, git rebase -i origin/master
- это хорошая мантра, которая всегда будет представлять вас с фиксациями, сделанными вами поверх мастера, и дает вам возможность изменять, удалять, изменять порядок или сквош. Не нужно сначала захватить этот хэш.
Ничего себе, поэтому есть много способов сделать это.
Еще один способ сделать это - удалить последнее коммит, но сохранить его изменения, чтобы вы не потеряли свою работу. Затем вы можете выполнить другое коммитирование с исправленным сообщением. Это будет выглядеть примерно так:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
Я всегда делаю это, если забываю добавить файл или внести изменения.
Помните, чтобы указать --soft
вместо --hard
, иначе вы полностью потеряете эту фиксацию.
Для тех, кто ищет графический интерфейс для Windows/Mac, чтобы помочь с редактированием старых сообщений (т.е. не только самого последнего сообщения), я бы порекомендовал SourceTree. Шаги, чтобы следовать ниже.
Для коммитов, которые еще не были переданы на удаленное устройство:
Unable to create 'project_path/.git/index.lock': File exists.
с " Unable to create 'project_path/.git/index.lock': File exists.
при попытке изменить несколько сообщений коммита одновременно. Не знаю точно, в чем заключается проблема, или будет ли она исправлена в будущей версии SourceTree, но если это произойдет, рекомендую менять их по одному (медленнее, но надежно работает).... или... для коммитов, которые уже были выдвинуты:
Выполните шаги в этом ответе, которые аналогичны приведенным выше, но требуют, чтобы из командной строки выполнялась дополнительная команда для принудительного нажатия на ветку - прочитайте все это и примите необходимые меры предосторожности!
Если вы хотите изменить последнее использование фиксации:
git commit --amend
или
git commit --amend -m 'one line message'
Но если вы хотите отредактировать несколько коммитов в строке, вы должны вместо этого использовать rebasing:
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 будет pre- заполнить сообщение коммита старым. Таким образом, его можно легко отредактировать.
Обновите последнее ошибочное сообщение с новым сообщением о фиксации в одной строке:
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 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
, что заставляет вас перейти в режим 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, поэтому, если я использовал неправильный "жаргон", чтобы объяснить, что происходит, не стесняйтесь меня исправлять!)
Я добавил псевдоним reci
, recm
для recommit (amend)
it, теперь я могу сделать это с помощью git recm
или git recm -m
.
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
Вы можете использовать git-rebase-reword
Он предназначен для редактирования любой фиксации (не только последней), так же как commit --amend
$ git rebase-reword <commit-or-refname>
Он назван в честь действия по интерактивной переадресации, чтобы исправить фиксацию: "изменить". См. этот пост и man -section interactive mode-
Примеры:
$ 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?
Важное примечание:. Когда вы используете принудительное нажатие, вы можете столкнуться с проблемами кода, которые другие разработчики работают над одной ветвью. Чтобы избежать этих конфликтов, вам нужно вытащить код из своей ветки, прежде чем нажимать force:
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
Это наилучшая практика при изменении сообщения фиксации, если оно уже было нажато.