Как изменить существующие, не очищенные коммиты?


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

Как я могу изменить сообщение коммита/файлы? Фиксация еще не была нажата.

27   7678   2008-10-07 19:44:47

27 ответов:

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

git commit --amend

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

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

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

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

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

если вы уже нажали вашу фиксацию до вашего удаленного филиала, то вы будете нужно заставить нажать фиксацию С:

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

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

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


использовать интерактивные перебазирования

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

для того, чтобы сделать ГИТ сквош, выполните следующие шаги:

// 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 commits и если было слияние где-то между этим диапазоном, вы увидите все коммиты, так что результат будет будь х+.

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

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


горячий кончик

git commit amend in one go

вы также можете написать небольшую функцию bash, чтобы просто изменить последнее сообщение git commit и нажать его на пульт дистанционного управления. Помогает мне все время. Это место функция, поместите его в свой .bashrc или подобное .zshrc файл и перезагрузить терминал.

# USAGE: gamend "Your New Commit Msg"
function gamend() {
    git commit --amend -m "$@"
    git push --force
}

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

git commit --amend -m "your new message"

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

  1. git rebase --interactive $parent_of_flawed_commit

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

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

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

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

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

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


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

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

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, есть кнопка с именем amend last commit. Нажмите на эту кнопку, а затем он отобразит ваши последние файлы фиксации и сообщение. Просто отредактируйте это сообщение, и вы можете зафиксировать его с помощью нового сообщения фиксации.

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

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

можно использовать ГИТ перебазирования. Например, если вы хотите изменить back для фиксации bbc643cd, запустите

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

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

$ git commit --amend

изменить фиксацию, а после этого

$ git rebase --continue

чтобы вернуться к предыдущей фиксации головы.

  1. если вы хотите изменить только ваше последнее сообщение фиксации, то сделайте:

    git commit --amend
    

    это приведет вас в ваш текстовый exitor и позволит вам изменить последнее сообщение фиксации.

  2. если вы хотите изменить последние 3 сообщения, или какие-либо сообщения до ссылки, предложения HEAD~3 до :

    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

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

интерактивная rebase

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

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 interactive rebase:

git rebase -i @~9   # Show the last 9 commits in a text editor

найти фиксацию вы хотите, изменить pick до r (reword), а также сохранить и закрыть файл. Готово!



миниатюрный Vim учебник (или, как перебазировать только с 8 нажатий клавиш 3jcwr EscZZ):

  • выполнить vimtutor если у вас есть время
  • hjkl соответствуют клавишам перемещения
  • все команды могут иметь префикс "range", например 3j перемещается вниз на 3 строки
  • i чтобы войти в режим вставки - текст, который вы вводите, появится в файле
  • Esc или Ctrlc для выхода из режима вставки и возврата в "нормальный" режим
  • u to отменить
  • Ctrlr повторить
  • dd,dw,dl чтобы удалить строку, слово или букву, соответственно
  • cc,cw,cl чтобы изменить строку, слово или букву, соответственно (то же самое, что ddi)
  • yy, yw,yl копировать ("дергать") строку, слово или букву соответственно
  • p или P вставить после или до текущей позиции, соответственно
  • :wвведите для сохранения (записи) файла
  • :q!введите бросить курить без сохранение
  • :wqвведите или ZZ сохранить и выйти

если вы много редактируете текст, то переключитесь на раскладку клавиатуры Dvorak, научитесь печатать на ощупь и изучите vim. стоит ли это усилий? да.



ProTip™: не бойтесь экспериментировать с "опасными" командами, которые переписывают историю* - Git не удаляет ваши коммиты в течение 90 дней по умолчанию; вы можете найти их в reflog:

$ 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 GUI столько, сколько я могу, и это дает вам возможность изменить последнюю фиксацию:

Tick that box

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

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

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

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

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

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

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

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 или один из других вариантов и нажмите save и exit.

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

git commit --amend

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

git rebase --continue 

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

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

для тех, кто ищет Windows и Mac GUI, чтобы помочь с редактированием старых сообщений (т. е. не только последнее сообщение), Я бы рекомендовал SourceTree. Ниже приведены шаги, которые необходимо выполнить.

SourceTree interactive rebase

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

  1. убедитесь, что вы зафиксировали или спрятали все текущие изменения (т. е. нет файлов, перечисленных на вкладке "Состояние файла") - это не будет работать иначе.
  2. на вкладке" Журнал / История " щелкните правой кнопкой мыши на записи с прилегающей линией на графике ниже фиксация (ы), которую вы хотите отредактировать и выбрать "Rebase children of интерактивно..."
  3. выберите всю строку для сообщения фиксации, которое вы хотите изменить (т. е. нажмите на "сообщение" колонки).
  4. Нажмите кнопку" Изменить сообщение".
  5. редактировать сообщения в появится диалоговое окно, а затем нажмите кнопку ОК.
  6. повторите шаги 3-4, если есть другие сообщения, чтобы изменить.
  7. Нажмите кнопку ОК: начнется перебазирование. Если все хорошо, то выход закончится "успешно завершен".

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

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

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

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

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

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

git commit --amend -m "your new commit message"

или попробуйте сбросить Git, как показано ниже:

# 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 внизу) для коммитов, которые вы хотите изменить, введите reword вместо pick

затем вам нужно сохранить и выйти из этого экрана, вы делаете это, сначала перейдя в "командный режим", нажав esc кнопка. (вы можете проверить, что вы находитесь в командном режиме, если слово INSERT внизу исчезло), то вы можете ввести команду, введя :, команда для сохранения и выхода 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-rebase-reword

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

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

Он назван в честь действия на rebase interactive для изменения фиксации: "reword". Смотрите этот пост и человек -раздел интерактивный режим-

примеры:

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

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

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

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

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

  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>

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

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