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

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

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

27 ответов


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

git commit --amend

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

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

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

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

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

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

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

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

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


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

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

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

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

Если вам нужно сделать это для более чем одной ветви, и вы можете столкнуться с конфликтами при изменении содержимого, настройте 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 "[email protected]"
    git push --force
}

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


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

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

  1. git rebase --interactive $parent_of_flawed_commit

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

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

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

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

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

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


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


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

git commit --amend

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

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

git commit --amend -C HEAD

чтобы исправить предыдущее зафиксируйте, полностью удалив его, run

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 убедитесь, что все отделения и теги переопределяются.

из-за резервного копирования ваших старых ссылок вы можете легко вернуться в состояние перед выполнением команды.

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

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 to r (reword), а также сохранить и закрыть файл. Готово!



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

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


Я использую 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'

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

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. нажмите OK: начнется перебазирование. Если все хорошо, то выход закончится "успешно завершен".

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

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


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

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

это гарантирует, что вы случайно не улучшите свою фиксацию с помощью поэтапного материала. Конечно, лучше иметь правильный $EDITOR конфигурации. Тогда вы можете оставить -m опция out, и 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, это заставляет вас перейти в режим вставки. (Вы видите, что находитесь в режиме вставки словом INSERT внизу) для коммитов, которые вы хотите изменить, введите reword вместо pick

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

затем VIM Wil перейдет к каждому сообщению фиксации, которое вы хотите перефразировать, здесь вы можете фактически изменить сообщения фиксации. Вы сделаете это, перейдя в режим вставки, изменив сообщение фиксации, перейдя в командный режим и сохраните и закройте. Сделайте это 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?

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

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

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