Как изменить существующие, непущенные коммиты?
Я написал неправильную вещь в сообщении фиксации. Кроме того, я забыл добавить некоторые файлы.
Как я могу изменить сообщение коммита/файлы? Обязательство еще не было выдвинуто.
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
для редактирования сообщения
важное замечание об интерактивной ребазе
при использовании git rebase -i HEAD~X
здесь можно больше чем X
commits. Git будет "собирать" все коммиты в последнем X
commits и если было слияние где-то между этим диапазоном, вы увидите все коммиты, поэтому результат будет быть X+.
хороший совет:
Если вам нужно сделать это для более чем одной ветви, и вы можете столкнуться с конфликтами при изменении содержимого, настройте git rerere
и пусть git решает эти конфликты автоматически для вас.
горячий кончик
вы также можете написать небольшую функцию bash, чтобы просто изменить последнее сообщение git commit и нажать его на пульт. Помогает мне все время. Это место функция, поместите ее в свой .bashrc
или подобное .zshrc
файл и перезагрузить терминал.
# USAGE: gamend "Your New Commit Msg"
function gamend() {
git commit --amend -m "$@"
git push --force
}
документация
при фиксации, которую вы хотите исправить, не самая последняя:
-
git rebase --interactive $parent_of_flawed_commit
если вы хотите исправить несколько ошибочных коммитов, передайте родителю самого старого из них.
-
появится редактор со списком всех коммитов, начиная с того, который вы дали.
- изменить
pick
toreword
(или в старых версиях Git, toedit
) перед любыми фиксациями, которые вы хотите исправить. - после сохранения, Git будет воспроизводить перечисленные коммиты.
- изменить
-
для каждого коммита, который вы хотите изменить, Git вернет вас в ваш редактор. Для каждой фиксации вы хотите редактировать, Git бросает вас в раковину. Если вы находитесь в оболочке:
- измените фиксацию любым удобным вам способом.
git commit --amend
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
чтобы вернуться к предыдущей фиксации головы.
-
если вы хотите изменить только последнее сообщение фиксации, выполните:
git commit --amend
это приведет вас в текстовый exitor и позволит вам изменить последнее сообщение фиксации.
-
если вы хотите изменить последние 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 нажатий клавиш 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
копировать ("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 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 столько, сколько я могу, и это дает вам возможность изменить последнюю фиксацию:
и 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>
в файле, подобном приведенному выше, напишите edit / e или один из других вариантов и нажмите save и exit.
теперь вы будете на первом неправильном фиксации. Внесите изменения в файлы, и они будут автоматически организованы для вас. Тип
git commit --amend
сохранить и выйти из него и введите
git rebase --continue
чтобы перейти к следующему выбору до завершения всех ваших выборов.
обратите внимание, что эти вещи меняют все ваши хеши SHA после этого конкретного фиксации.
для тех, кто ищет Windows и Mac GUI, чтобы помочь с редактированием старых сообщений (т. е. не только последнее сообщение), Я бы рекомендовал SourceTree. Шаги, чтобы следовать ниже.
для коммитов, которые еще не были нажаты на пульт дистанционного управления:
- убедитесь, что вы зафиксировали или скрыли все текущие изменения (т. е. нет файлов, перечисленных на вкладке "Статус файла") - это не будет работать иначе.
- на вкладке "Журнал / История" щелкните правой кнопкой мыши на записи с прилегающей линией на графике ниже фиксация (ы), которую вы хотите отредактировать, и выберите "Rebase children of интерактивно..."
- выберите всю строку для сообщения фиксации, которое вы хотите изменить (т. е. нажмите на "сообщение" колонки).
- Нажмите кнопку" Изменить сообщение".
- редактировать сообщения в появится диалоговое окно, а затем нажмите кнопку ОК.
- повторите шаги 3-4, если есть другие сообщения, чтобы изменить.
- нажмите 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
предупреждение: принудительное нажатие ваших изменений перезапишет удаленную ветку с вашей локальной. Убедитесь, что вы не собираетесь переписывать все, что хотите сохранить. Также будьте осторожны с принудительным нажатием исправленной (переписанной) фиксации, если кто-то еще разделяет ветку с вами, потому что им нужно будет переписать свою собственную историю, если у них есть старая копия фиксации, которую вы только что переписали.
мне нравится использовать следующее:
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 push напрямую вы можете столкнуться с проблемами кода, которые другие разработчики работают в той же ветви. Поэтому, чтобы избежать этих конфликтов, вам нужно вытащить код из своей ветви, прежде чем делать усилие нажима:
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
Это лучшая практика при изменении зафиксируйте сообщение, если оно уже было нажато.