Как изменить существующие, неотправленные сообщения о фиксации?
-
05-07-2019 - |
Вопрос
Я написал не то в сообщении о фиксации.
Как я могу изменить сообщение?Фиксация еще не была осуществлена.
Решение
Изменение самого последнего сообщения о фиксации
git commit --amend
откроется ваш редактор, позволяющий вам изменить сообщение о фиксации самого последнего коммита.Кроме того, вы можете задать сообщение о фиксации непосредственно в командной строке с помощью:
git commit --amend -m "New commit message"
... однако это может сделать многострочные сообщения о фиксации или небольшие исправления более громоздкими для ввода.
Убедитесь, что у вас нет никаких изменений в рабочей копии инсценированный прежде чем делать это, иначе они тоже будут преданы делу.(Неустановленный изменения не будут зафиксированы.)
Изменение сообщения о фиксации, которое вы уже отправили в свою удаленную ветку
Если вы уже перенесли свой коммит в удаленную ветку, то вы будете нужно принудительно нажать на фиксацию с:
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f
Предупреждение:принудительное нажатие перезапишет удаленную ветку состоянием вашей локальной ветки.Если в удаленной ветке есть коммиты, которых нет в вашей локальной ветке, вы будет потеряйте эти коммиты.
Предупреждение:будьте осторожны при внесении изменений в коммиты, которыми вы уже поделились с другими людьми. Внесение изменений обязывает по существу переписывает у них должны быть разные ША Идентификаторы, что создает проблему, если у других людей есть копии старого коммита, который вы переписали.Любому, у кого есть копия старого коммита, потребуется синхронизировать свою работу с вашим новым переписанным коммитом, что иногда может быть затруднительно, поэтому убедитесь, что вы координируете свою работу с другими при попытке переписать общую историю коммитов, или просто избегайте переписывания общих коммитов вообще.
Используйте интерактивную перебазировку
Другой вариант - использовать интерактивную перебазировку.
Это позволяет вам редактировать любое сообщение, которое вы хотите обновить, даже если это не самое последнее сообщение.
Чтобы сделать git squash, выполните следующие действия:
// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X
Как только вы скрестите свои коммиты - выберите e/r
для редактирования сообщения
Важное замечание об интерактивной перебазировке
Когда вы используете git rebase -i HEAD~X
там может быть Еще чем X
совершает.Git "соберет" все коммиты в последнем X
фиксирует, и если произошло слияние где-то между этим диапазоном, вы также увидите все фиксации, так что результатом будет X +.
Хороший совет:
Если вам нужно сделать это более чем для одной ветки и вы можете столкнуться с конфликтами при внесении изменений в содержимое, настройте git rerere
и пусть git автоматически разрешит эти конфликты за вас.
Документация
Другие советы
git commit --amend -m "your new message"
Если фиксация, которую вы хотите исправить, не является & # 8217; t самой последней:
<Ол> <Литий> <р>git rebase --interactive $parent_of_flawed_commit
р>
Если вы хотите исправить несколько некорректных коммитов, передайте родителю самого старого из них.
Появится редактор со списком всех коммитов, начиная с того, который вы дали.
<Ол>pick
на reword
(или в старых версиях Git на edit
) перед любыми коммитами, которые вы хотите исправить. Для каждого коммита, который вы хотите переформулировать , Git вернет вас обратно в ваш редактор. Для каждого коммита, который вы хотите редактировать , Git помещает вас в оболочку. Если вы & # 8217; находитесь в оболочке:
<Ол>git commit --amend
<Литий> git rebase --continue
Ол>
Ол>
Большая часть этой последовательности будет объяснена вам при выводе различных команд. Это & # 8217; это очень просто, вам не нужно & # 8217; вам не нужно его запоминать & # 8211; просто помните, что git rebase --interactive
позволяет исправлять коммиты независимо от того, как давно они были.
Обратите внимание, что вы не захотите изменять коммиты, которые вы уже выдвинули. Или, может быть, так и есть, но в этом случае вам придется позаботиться о том, чтобы общаться со всеми, кто мог выполнить ваши коммиты и поработать над ними. Как восстановить / повторно синхронизировать после того, как кто-то отправит ребаз или сброс в опубликованную ветку?
Чтобы изменить предыдущий коммит, внесите необходимые изменения и выполните эти изменения, а затем выполните
git commit --amend
Это откроет файл в вашем текстовом редакторе, представляющий ваше новое сообщение коммита. Он начинается с текста из вашего старого сообщения коммита. Измените сообщение фиксации, как хотите, затем сохраните файл и выйдите из редактора, чтобы завершить его.
Чтобы изменить предыдущую фиксацию и сохранить то же сообщение журнала, запустите
git commit --amend -C HEAD
Чтобы исправить предыдущий коммит, полностью удалив его, запустите
git reset --hard HEAD^
Если вы хотите отредактировать более одного сообщения о коммите, запустите
git rebase -i HEAD~commit_count
(Замените commit_count числом коммитов, которое вы хотите редактировать.) Эта команда запускает ваш редактор. Пометьте первый коммит (тот, который вы хотите изменить) как & # 8220; edit & # 8221; вместо & # 8220; выберите & # 8221 ;, затем сохраните и выйдите из редактора. Сделайте изменения, которые вы хотите зафиксировать, и затем запустите
git commit --amend
git rebase --continue
Примечание. Вы можете & внести необходимые изменения " также из редактора, открытого git commit --amend
Как уже упоминалось, git commit --amend
- это способ перезаписать последний коммит. Одно замечание: если вы хотите перезаписать файлы , команда будет
git commit -a --amend -m "My new commit message"
Вы также можете использовать git filter-branch
для этого.
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
Это не так просто, как тривиально git commit --amend
, но это особенно полезно, если у вас уже есть некоторые слияния после сообщения о ошибочной фиксации.
Обратите внимание, что при этом будет пытаться переписать КАЖДЫЙ коммит между HEAD
и некорректным коммитом, поэтому вам следует выбирать свою команду msg-filter
очень мудро; -)
Я предпочитаю этот способ. Р>
git commit --amend -c <commit ID>
В противном случае будет новый коммит с новым идентификатором фиксации
Если вы используете инструмент Git GUI, есть кнопка с названием Изменить последний коммит. Нажмите на эту кнопку, и тогда она покажет ваши последние файлы коммита и сообщение. Просто отредактируйте это сообщение, и вы сможете зафиксировать его с новым сообщением о коммите.
Или используйте эту команду из консоли / терминала:
git commit -a --amend -m "My new commit message"
Вы можете использовать Git rebase . Например, если вы хотите изменить обратно, чтобы зафиксировать bbc643cd, запустите
$ git rebase bbc643cd^ --interactive
В редакторе по умолчанию измените 'pick' на 'edit' в строке, фиксацию которой вы хотите изменить. Внесите свои изменения и затем добавьте их
$ git add <filepattern>
Теперь вы можете использовать
$ git commit --amend
изменить коммит, а после этого
$ git rebase --continue
чтобы вернуться к предыдущей фиксации головы.
Если вы хотите изменить только последнее сообщение о коммите, выполните:
git commit --amend
Это приведет вас к вашему текстовому редактору и позволит вам изменить последнее сообщение о коммите.
Если вы хотите изменить последние 3 сообщения фиксации или любое из сообщений фиксации до этой точки, введите HEAD~3
команде git rebase -i
:
git rebase -i HEAD~3
Если вам нужно изменить старое сообщение о фиксации в нескольких ветвях (т. Е. фиксация с ошибочным сообщением присутствует в нескольких ветвях), вы можете захотеть использовать:
git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all
Git создаст временный каталог для перезаписи и дополнительно создаст резервные копии старых ссылок в refs/original/
.
-f
приведет к принудительному выполнению операции.Это необходимо, если временный каталог уже присутствует или если в нем уже хранятся ссылкиrefs/original
.Если это не так, вы можете снять этот флаг.--
отделяет параметры ветви фильтра от параметров ревизии.--all
удостоверюсь, что все ветви и Теги переписываются.
Благодаря резервному копированию ваших старых ссылок вы можете легко вернуться к состоянию перед выполнением команды.
Допустим, вы хотите восстановить свой мастер-файл и получить к нему доступ в ветке old_master
:
git checkout -b old_master refs/original/refs/heads/master
Использование
git commit --amend
Чтобы разобраться в этом подробно, есть отличный пост 4.Переписывание истории Git.В нем также говорится о когда не следует использовать git commit --amend
.
Внести поправки
У вас есть несколько вариантов здесь. Вы можете сделать
git commit --amend
Пока это ваш последний коммит.
Интерактивная перебазировка
В противном случае, если это не ваш последний коммит, вы можете сделать интерактивный перебаз,
git rebase -i [branched_from] [hash before commit]
Затем в интерактивном ребазе вы просто добавляете правку в этот коммит. Когда он появится, сделайте git commit --amend
и измените сообщение коммита. Если вы хотите откатиться до этой точки фиксации, вы также можете использовать git reflog
и просто удалить эту фиксацию. Тогда просто сделайте git commit
еще раз.
Если вы используете графический интерфейс Git, вы можете изменить последний коммит, который не был передан с помощью:
Commit/Amend Last Commit
Если это ваш последний коммит, просто изменить фиксация:
git commit --amend -o -m "New commit message"
(используя -o
(--only
) отметьте, чтобы убедиться, что вы изменили только сообщение о фиксации)
Если это скрытый коммит, используйте awesome интерактивная перебазировка:
git rebase -i @~9 # Show the last 9 commits in a text editor
Найдите нужный вам коммит, измените pick
Для r
(reword
), а также сохраните и закройте файл.Сделано!
Миниатюрный учебник по vim (или как выполнить перебазирование всего 8 нажатиями клавиш 3j
cw
r
EscZZ
):
- Бежать
vimtutor
если у вас есть время h
j
k
l
соответствуют клавишам перемещения ←↓↑→- Все команды могут иметь префикс "range", например
3j
перемещается вниз на 3 линии i
чтобы перейти в режим вставки — текст, который вы вводите, появится в файле- Esc или Ctrl
c
чтобы выйти из режима вставки и вернуться в "обычный" режим u
чтобы отменить- Ctrl
r
чтобы переделать dd
,dw
,dl
чтобы удалить строку, слово или букву соответственноcc
,cw
,cl
чтобы изменить строку, слово или букву соответственно (то же, чтоdd
i
)yy
,yw
,yl
скопировать ("выдернуть") строку, слово или букву соответственноp
илиP
вставить после или перед текущей позицией соответственно:w
Войти чтобы сохранить (записать) файл:q!
Войти выйти из игры без сохранения:wq
Войти илиZZ
сохранить и выйти из игры
Если вы много редактируете текст, то переключитесь на раскладку клавиатуры Dvorak, научитесь печатать в сенсорном режиме и изучите vim. Стоит ли это таких усилий? ДА.
ProTip™:Не бойтесь экспериментировать с "опасными" командами, которые переписывают историю * — по умолчанию Git не удаляет ваши коммиты в течение 90 дней;вы можете найти их в рефлоге:
$ git reset @~3 # go back 3 commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
* Следите за такими вариантами, как --hard
и --force
хотя — они могут отбрасывать данные.
* Кроме того, не переписывайте историю ни в одной из ветвей, в которых вы сотрудничаете.
Я использую графический интерфейс Git столько, сколько могу, и это дает вам возможность изменить последний совершить:
Кроме того, git rebase -i origin/master
- это хорошая мантра, которая всегда представит вам коммиты, которые вы сделали над мастером, и даст вам возможность изменить, удалить, изменить порядок или сквош. Нет необходимости сначала получать этот хеш.
Ух ты, так что есть много способов сделать это.
Еще один способ сделать это - удалить последний коммит, но сохранить его изменения, чтобы не потерять свою работу. Затем вы можете сделать еще один коммит с исправленным сообщением. Это будет выглядеть примерно так:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
Я всегда делаю это, если забываю добавить файл или внести изменения.
Не забудьте указать --soft
вместо --hard
, иначе вы полностью потеряете этот коммит.
Для всех, кто ищет графический интерфейс Windows / Mac, помогающий редактировать старые сообщения (т.е.не только последнее сообщение), я бы порекомендовал Исходное дерево.Ниже приведены шаги, которым необходимо следовать.
Для коммитов, которые еще не были отправлены на удаленный сервер:
- Убедитесь, что вы зафиксировали или сохранили все текущие изменения (т.е.таким образом, на вкладке "Состояние файла" нет файлов) - иначе это не сработает.
- На вкладке "Журнал / История" щелкните правой кнопкой мыши на записи с прилегающей линией на графике один ниже фиксации, которые вы хотите отредактировать, и выберите "Перебазировать дочерние элементы <commit ref=""> в интерактивном режиме..."
- Выберите всю строку для сообщения о фиксации, которое вы хотите изменить (т. е.нажмите на колонку "Сообщение".).
- Нажмите кнопку "Отредактировать сообщение".
- Отредактируйте сообщение по своему усмотрению в появившемся диалоговом окне и затем нажмите кнопку ОК.
- Повторите шаги 3-4, если есть другие сообщения о фиксации, которые необходимо изменить.
- Нажмите кнопку ОК:Начнется перебазирование.Если все в порядке, вывод завершится "Успешно завершен". ПРИМЕЧАНИЕ: Недавно я видел, как это не сработало с
Unable to create 'project_path/.git/index.lock': File exists.
при попытке изменить несколько сообщений о фиксации одновременно.Не уверен точно, в чем проблема и будет ли она исправлена в будущей версии SourceTree, но если это произойдет, я бы рекомендовал перебазировать их по одному (медленнее, но кажется более надежным).
...Или...для коммитов, которые уже были отправлены:
Выполните действия, описанные в этот ответ, которые аналогичны приведенным выше, но требуют выполнения дополнительной команды из командной строки для принудительного запуска ветки - прочитайте все это и соблюдайте необходимую осторожность!
Если вы просто хотите отредактировать последнюю фиксацию, используйте:
git commit --amend
или
git commit --amend -m 'one line message'
Но если вы хотите отредактировать несколько коммитов подряд, вам следует вместо этого использовать перебазирование:
git rebase -i <hash of one commit before the wrong commit>
В файле, подобном приведенному выше, напишите edit/e или один из других вариантов и нажмите save и exit.
Теперь вы столкнетесь с первой неправильной фиксацией.Внесите изменения в файлы, и они будут автоматически подготовлены для вас.Тип
git commit --amend
сохраните, выйдите из него и введите
git rebase --continue
перейти к следующему выделению до тех пор, пока не будут завершены все выбранные вами элементы.
Обратите внимание, что эти вещи изменяют все ваши хэши SHA после этой конкретной фиксации.
Если вы хотите изменить только ваше последнее сообщение, вы должны использовать флаг --only
или его ярлык -o
с commit --amend
:
git commit --amend -o -m "New commit message"
Это гарантирует, что вы случайно не улучшите свой коммит с помощью инсценировки. Конечно, лучше иметь правильную $EDITOR
конфигурацию. Затем вы можете опустить опцию -m
, и git предварительно заполнит сообщение коммита старым. Таким образом, это может быть легко отредактировано.
Обновите ваше последнее сообщение о неверной фиксации новым сообщением о фиксации в одной строке:
git commit --amend -m "your new commit message"
Или попробуйте git reset, как показано ниже:
# You can reset your head to n number of commit
# NOT a good idea for changing last commit message
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^
# it will reset you last commit. Now, you
# can re-commit it with new commit message.
Использование reset для разделения коммитов на коммиты меньшего размера
git reset
может помочь вам разбить один коммит на несколько коммитов:
# reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (you can reset multiple commit by doing HEAD~2(no. of commits)
# Now, reset your head for splitting it to multiple commits
git reset HEAD
# add and commit your files seperately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"
git add config/
git commit -m "add all files in config directory"
Здесь вы успешно разбили свой последний коммит на два.
На этот вопрос есть много ответов, но ни один из них не объясняет сверхдетально, как изменить старые сообщения о фиксации с помощью VIM.Я застрял, пытаясь сделать это сам, поэтому здесь я подробно опишу, как я это сделал, специально для людей, у которых нет опыта работы с VIM!
Я хотел изменить свои пять последних коммитов, которые я уже отправил на сервер.Это довольно "опасно", потому что, если кто-то другой уже воспользовался этим, вы можете все испортить, изменив сообщения о фиксации.Однако, когда вы работаете над своей собственной маленькой веткой и уверены, что ее никто не потянул, вы можете изменить ее следующим образом:
Допустим, вы хотите изменить свои пять последних коммитов, затем вы вводите это в терминале:
git rebase -i HEAD~5
* Где 5 - количество сообщений о фиксации, которые вы хотите изменить.(итак, если вы хотите изменить 10-й коммит на последний, вы вводите 10)
Эта команда приведет вас в VIM, где вы сможете ‘отредактировать’ историю своих коммитов.Вы увидите свои последние 5 коммитов вверху следующим образом:
pick <commit hash> commit message
Вместо того, чтобы pick
вам нужно написать reword
.Вы можете сделать это в VIM, набрав i
, это заставляет вас перейти в режим ВСТАВКИ.(Вы видите, что находитесь в режиме вставки, по слову ВСТАВИТЬ внизу) Для коммитов, которые вы хотите изменить, введите reword
вместо того, чтобы pick
Затем вам нужно сохранить и закрыть этот экран, вы делаете это, сначала перейдя в ‘командный режим’, нажав кнопку esc.(вы можете проверить, что вы находитесь в командном режиме, если слово ВСТАВИТЬ внизу исчезло) Затем вы можете ввести команду, набрав :
, команда для сохранения и выхода - это wq
.Итак, если вы введете :wq
ты на правильном пути.
Затем VIM просмотрит каждое сообщение о фиксации, которое вы хотите переписать, здесь вы действительно можете изменить сообщения о фиксации.Вы сделаете это, перейдя в режим ВСТАВКИ, изменив сообщение о фиксации, перейдя в командный режим, сохранив и завершив работу.Проделайте это 5 раз, и у вас закончится VIM!
Затем, если вы уже отправили свои неправильные коммиты, вам нужно git push --force
чтобы перезаписать их.Помни об этом git push --force
это довольно опасная вещь, поэтому убедитесь, что никто не удалялся с сервера с тех пор, как вы отправили свои неправильные коммиты!
Теперь вы изменили свои сообщения о фиксации!
(Как вы видите, я не настолько опытен в VIM, поэтому, если я использовал неправильный "жаргон", чтобы объяснить, что происходит, не стесняйтесь поправлять меня!)
Я добавил псевдоним reci
, recm
для recommit (amend)
, теперь я могу сделать это с помощью git recm
или git recm -m
.
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
Вы можете использовать git-перебазирование-перефразирование
Он предназначен для редактирования любого коммита (не только последнего) таким же образом, как commit --amend
$ git rebase-reword <commit-or-refname>
Он назван в честь действия в rebase interactive по изменению фиксации:"перефразируй".Видишь этот пост и человек -интерактивный режим раздела-
Примеры:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
Я понял, что вставил коммит с опечаткой. Чтобы отменить, я сделал следующее:
git commit --amend -m "T-1000, advanced prototype"
git push --force
Предупреждение: принудительное нажатие на ваши изменения перезапишет удаленную ветку вашей локальной. Убедитесь, что вы не собираетесь перезаписывать то, что хотите сохранить. Также будьте осторожны с принудительным нажатием измененного (переписанного) коммита, если кто-то еще поделится с вами веткой, потому что им нужно будет переписать свою собственную историю, если у них будет старая копия коммита, которую вы только что переписали.
Мне нравится использовать следующее:
<Ол> <Литий>git status
<Литий> git add --all
<Литий> git commit -am "message goes here about the change"
<Литий> git pull <origin master>
<Литий> git push <origin master>
Ол> Если вы не отправили код в удаленную ветку ( GitHub / Bitbucket ) вы можете изменить сообщение коммита в командной строке, как показано ниже.
git commit --amend -m "Your new message"
Если вы работаете над определенной веткой, сделайте это:
git commit --amend -m "BRANCH-NAME: new message"
Если вы уже нажали код с неправильным сообщением, и вам нужно быть осторожным при изменении сообщения. То есть, после того, как вы измените сообщение коммита и попытаетесь нажать его снова, у вас возникнут проблемы. Чтобы сделать это гладко, выполните следующие действия.
Пожалуйста, прочитайте весь мой ответ, прежде чем делать это.
git commit --amend -m "BRANCH-NAME : your new message"
git push -f origin BRANCH-NAME # Not a best practice. Read below why?
Важное примечание. При непосредственном использовании принудительного нажатия вы можете столкнуться с проблемами кода, которые другие разработчики работают в той же ветке. Поэтому, чтобы избежать этих конфликтов, вам нужно извлечь код из своей ветки, прежде чем делать принудительное нажатие :
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
Это лучший метод при изменении сообщения о коммите, если оно уже было отправлено.