it-roy-ru.com

Как изменить существующие сообщения без фиксации?

Я написал неправильную вещь в сообщении фиксации.

Как я могу изменить сообщение? Коммит еще не был передан.

7672
Laurie Young

Изменение самого последнего сообщения о коммите

git commit --amend

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

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

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

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

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

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

git Push <remote> <branch> --force
# Or
git Push <remote> <branch> -f

Предупреждение: принудительное нажатие перезапишет удаленную ветвь с состоянием вашей локальной ветки . Если в удаленной ветке есть коммиты, которых нет в вашей локальной ветке, вы will потеряете эти коммиты.

Предупреждение: будьте осторожны при внесении изменений в коммиты, которыми вы уже поделились с другими людьми. Внесение изменений в коммиты по существу переписывает чтобы они были разными - 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 для редактирования сообщения

enter image description here

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

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

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

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


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

15348
EfForEffort
git commit --amend -m "your new message"
2460
lfx_cool

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

  1. git rebase --interactive $parent_of_flawed_commit

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

  2. Появится редактор со списком всех коммитов, начиная с того, который вы дали.

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

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

    1. Измените коммит любым удобным вам способом.
    2. git commit --amend
    3. git rebase --continue

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


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

2334
Aristotle Pagaltzis

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

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

762
Fatih

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

git commit -a --amend -m "My new commit message"
392
John

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

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

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

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

352
Mark

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

git commit --amend -c <commit ID>

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

311
krevedko

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

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

git commit -a --amend -m "My new commit message"
310
Akhilraj N S

Вы можете использовать Git rebasing . Например, если вы хотите изменить обратно, чтобы зафиксировать bbc643cd, запустите

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

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

$ git commit --amend

изменить коммит, и после этого

$ git rebase --continue

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

283
Shoaib Ud-Din
  1. Если вы хотите изменить только последнее сообщение о коммите, то выполните:

    git commit --amend
    

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

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

    git rebase -i HEAD~3
    
276
Heena Hussain

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

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
259
sebers

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

git commit --amend

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

223
skin

Правка

У вас есть несколько вариантов здесь. Ты можешь сделать

git commit --amend

пока это ваш последний коммит.

Интерактивная перебазировка

В противном случае, если это не ваш последний коммит, вы можете сделать интерактивный ребаз,

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

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

195
wallerjake

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

Commit/Amend Last Commit
183
gulchrider

Если это ваш последний коммит, просто измените коммит:

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 нажатиями клавиш 3jcwrEscZZ):

  • Запустите vimtutor, если у вас есть время
  • hjkl соответствуют клавишам движения 
  • Все команды могут иметь префикс "диапазон", например 3j движется вниз на 3 строки
  • i для входа в режим вставки - введенный вами текст появится в файле
  • Esc или же Ctrlc выйти из режима вставки и вернуться в "нормальный" режим
  • u отменить
  • Ctrlr переделать
  • dddwdl удалить строку, слово или букву соответственно
  • cccwcl изменить строку, слово или букву соответственно (так же, как ddi)
  • yyywyl скопировать ("yank") строку, слово или букву соответственно
  • p или же P вставить после или до текущей позиции, соответственно
  • :wEnter сохранить (записать) файл
  • :q!Enter выйти без сохранения
  • :wqEnter или же ZZ сохранить и выйти

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

172
Zaz

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

Tick that box

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

165
Havard Graff

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

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

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

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

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

135
Radu Murzea

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

SourceTree interactive rebase

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

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

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

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

126
Steve Chambers

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

git commit --amend

или же

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

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

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

git rebase editing

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

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

git commit --amend

сохранить и выйти и введите

git rebase --continue 

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

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

124
Shubham Chaudhary

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

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

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

123
David Ongaro

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

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"

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

99
przbadu

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

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

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

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

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

pick <commit hash> commit message

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

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

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

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

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

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

82
Marijn

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

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

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

Он назван в честь действия по перебазированию в интерактивном режиме для изменения коммита: "reword". Смотрите этот пост и man -раздел интерактивного режима-

Примеры:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^
76
albfan

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

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
76
Chu-Siang Lai

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

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

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

54
neoneye

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

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <Origin master>
  5. git Push <Origin master>
49
Kedar Adhikari

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

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

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull Origin BRANCH-NAME
 git Push -f Origin BRANCH-NAME

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

43
Prabhakar