У меня есть 2 коммита, А затем Б, готовые к толканию. Я понимаю, что забыл добавить что-то в А.
Как я могу добавить это изменение в A с помощью Magit? Я даже не знаю, какую часть документации Git мне следует посмотреть.
У меня есть 2 коммита, А затем Б, готовые к толканию. Я понимаю, что забыл добавить что-то в А.
Как я могу добавить это изменение в A с помощью Magit? Я даже не знаю, какую часть документации Git мне следует посмотреть.
Ответы:
Давайте на мгновение представим, что вы хотите добавить что-то к HEAD
коммиту, например, «второй коммит B» в вашем примере.
Во всплывающем окне коммитов cесть привязка « aAmend». Нажатие этой клавиши «исправит» поэтапные изменения в HEAD
коммите. Поскольку коммиты не изменяемы в Git, это фактически заменит старый коммит новым коммитом. Появится буфер со старым сообщением о фиксации, так что вы можете изменить его, если добавленное изменение также требует настройки сообщения. Как всегда, нажмите, C-c C-cкогда закончите редактирование сообщения. Это эквивалентно запуску git commit --amend
в командной строке.
HEAD
и отредактировать сообщение о коммите.Поскольку часто бывает так, что вам нужно только изменить изменение или сообщение, Magit предлагает два дополнительных варианта:
HEAD
не редактируя сообщение фиксацииHEAD
не добавляя в него поэтапные измененияЕсли вы хотите отредактировать коммит, которого нет HEAD
, вышеприведенное не сработает. Эти команды всегда «изменяют» (то есть заменяют) HEAD
коммит. Git не предоставляет ни одной команды для изменения коммита, кроме HEAD
того, что это немного сложнее.
Magit ли обеспечить такую команду, а потому , что есть ситуации , в которых желательно делать это в несколько этапов, мы обсудим , что первый.
Изменение коммита, отличного от, HEAD
можно разбить на три этапа:
A
) HEAD
.HEAD
(как описано выше), в результате чего получите коммит A'
.A
, но сверху A'
.Это можно сделать с помощью интерактивной перебазировки. Введите, rчтобы показать всплывающее окно rebase. Затем напечатайте, mчтобы вызвать вариант rebase «edit a commit». Появляется буфер с последними коммитами. Перейдите к коммиту, который вы хотите изменить, и введите его, C-c C-cчтобы выбрать. Затем Git перематывает историю на этот коммит и показывает информацию о текущей перебазировке в буфере состояния.
Изменить, HEAD
как описано выше. Затем скажите Git, что вы сделали, набрав r r. Если A'
и B
конфликт, то перебазирование остановится на B
и вам придется разрешить конфликт. После этого нажмите, r rчтобы продолжить.
Если вы знаете, что ваши изменения A
могут привести к конфликтам B
, выполните действия, описанные выше, в противном случае используйте следующий подход.
Git позволяет создавать "фиксации фикса" используя git commit --fixup A
. Это создает новый коммит, в котором записываются изменения, которые «должны были быть сделаны в другом коммите». Этот коммит становится новым HEAD
. Там также существует --squash
вариант. Для получения информации о различиях см. git-commit
Справочную страницу.
Чтобы на самом деле объединить A
коммит и новый коммит, A'
а затем снова применить B
его, вы должны использовать rebase. Magit предоставляет удобную команду для этого r f.
Основное отличие от вышеуказанного подхода заключается в том, что здесь мы сначала создаем новый коммит, а затем перезагружаем его, чтобы объединить его с «целью» и повторно применить B
. Выше мы начали с перебазирования вместо совершения.
В Magit --fixup
и --squash
варианты, и варианты доступны во всплывающем окне фиксации, на fи s. Но Magit также предоставляет «мгновенные» варианты команд fixup и squash on Fи S. Эти варианты создают новый коммит, такой как «не мгновенные» варианты, но затем они мгновенно комбинируют фиксацию фиксации с целевым коммитом, используя rebase, без необходимости вызывать другую команду.
«Мгновенное исправление» ( c F) по сути то же самое, что и «extension HEAD
» ( c e), за исключением того, что оно работает для любого коммита, а не только HEAD
.
Дальнейшее чтение:
git-commit(1)
git-rebase(1)
git-commit
Страница man перенаправляет на git-rebase(1)
эти строки: предлагаемое сообщение о коммите для свернутого коммита - это конкатенация сообщений коммита первого коммита и сообщений с командой «squash», но пропускает сообщения коммитов коммитов с «fixup» команда. IOW, используйте fixup, если вы просто хотите исправить код в предыдущем коммите, используйте squash, если вы также хотите исправить сообщение фиксации.
git commit --amend –C HEAD
это команда Git, которую вы хотите искать, и с помощью которой вы можете вносить исправления в Magit C-c C-a
.
C-c C-a
от более старой версии (я думаю). Кроме того, я не вижу никаких следов "исправления" в буфере помощи ( ?
).
Итак, один рабочий процесс:
затем
Autosquash автоматически переместит все коммиты! Fixup в нужное место и установит их для подавления при повторном основании.
i
дает мне Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.
. За исключением того, что у меня нет никаких незафиксированных изменений. : /
Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort
. Это пытается сказать мне, что мое исправление может покарать предстоящее слияние?
merge in rebase
см. Ошибки под git help rebase
. Я предлагаю сделать исправление, прежде чем тянуть вверх по течению.
Для внесения изменений в последний коммит это "c a". Исправление для исправления некоторых старых коммитов.