Git/recommit
Материал из ALT Linux Wiki
PhpCoder (обсуждение | вклад) (Import from freesource.info) |
(Написал про git-rebase --interactive.) |
||
Строка 2: | Строка 2: | ||
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/git/recommit}} | {{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/git/recommit}} | ||
- | + | = Как поправить commit = | |
Для ''последнего'' коммита достаточно <tt>git commit --amend</tt>, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения "заодно". | Для ''последнего'' коммита достаточно <tt>git commit --amend</tt>, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения "заодно". | ||
+ | == git-rebase --interactive == | ||
+ | В общем случае для редактирования коммитов удобно применять <code>git rebase --interactive</code>. Это выглядит примерно так: | ||
+ | $ git rebase -i коммит^ | ||
+ | [ Нам показывают в редакторе список коммитов. Перед тем, который хотим исправить, меняем pick на edit. Сохраняем и выходим. ] | ||
+ | You can amend the commit now, with | ||
+ | |||
+ | git commit --amend | ||
+ | |||
+ | Once you are satisfied with your changes, run | ||
+ | |||
+ | git rebase --continue | ||
+ | |||
+ | [ Теперь текущим стал тот коммит, который мы хотим исправить. ] | ||
+ | $ vim нужный/файл # исправляем всё, что хотим | ||
+ | $ git commit --am нужный/файл | ||
+ | $ git rebase --continue | ||
+ | |||
+ | То же самое можно сделать и вручную. | ||
+ | |||
+ | == "Я сам себе git-rebase" == | ||
''ниже -- фрагмент письма Alexey Tourbin в [http://lists.altlinux.org/pipermail/devel/2006-December/039344.html devel@]'' | ''ниже -- фрагмент письма Alexey Tourbin в [http://lists.altlinux.org/pipermail/devel/2006-December/039344.html devel@]'' | ||
[...] | [...] |
Версия 12:12, 30 июля 2008
Как поправить commit
Для последнего коммита достаточно git commit --amend, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения "заодно".
git-rebase --interactive
В общем случае для редактирования коммитов удобно применять git rebase --interactive
. Это выглядит примерно так:
$ git rebase -i коммит^ [ Нам показывают в редакторе список коммитов. Перед тем, который хотим исправить, меняем pick на edit. Сохраняем и выходим. ] You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue [ Теперь текущим стал тот коммит, который мы хотим исправить. ] $ vim нужный/файл # исправляем всё, что хотим $ git commit --am нужный/файл $ git rebase --continue
То же самое можно сделать и вручную.
"Я сам себе git-rebase"
ниже -- фрагмент письма Alexey Tourbin в devel@ [...]
То есть по сути иногда не хочется делать новые коммиты, которые являются мелкими исправлениями к предыдущим коммитам. Поэтому я предлагаю такое правило для использования git push --force: нельзя заменять коммиты дальше последнего публичного тага, или же дальше коммита, отправленного на сборку в incominger.
Допустим, что эти условия выполнены, а исправления мелких/глупых ошибок не хочется оформлять отдельно. Для примера объясню, как поправить пред-предпоследний коммит.
Сначала нужно сохранить текущую работу во временный бранч:
$ git branch save
Потом нужно откатить работу до пред-предпоследнего коммита:
$ git reset --hard HEAD^^
Теперь нужно поправить пред-предпоследний коммит, который стал текущим:
$ vim ... $ git commit -a --am
Затем поверх пред-предпоследнего коммита нужно накатить предпоследний и последний коммиты из сохраненного бранча:
$ git cherry-pick -r save^ $ git cherry-pick -r save
Осталось только удалить временный бранч:
$ git branch -D save
После этого уже можно сделать
$ git push --force git.alt
(Последнее означает, что содержимое .git/remotes/git.alt может выглядеть как URL: git.alt:/people/$USER/packages/%name.git)