Git/recommit: различия между версиями
PhpCoder (обсуждение | вклад) (Import from freesource.info) |
|||
(не показано 7 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE:git/recommit}} | |||
{{ | |||
== | == Правка последнего коммита == | ||
Для ''последнего'' коммита достаточно <tt>git commit --amend</tt>, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения | Для правки ''последнего'' коммита достаточно <tt>git commit --amend</tt>, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения «заодно». | ||
== Правка коммитов в общем случае == | |||
[ | В общем случае для редактирования коммитов удобно применять <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<ref>Основано на письме Alexey Tourbin в [http://lists.altlinux.org/pipermail/devel/2006-December/039344.html devel@]</ref> == | ||
не хочется оформлять отдельно. | |||
пред-предпоследний коммит. | Иногда не хочется делать новые коммиты, которые являются мелкими исправлениями к предыдущим коммитам. Поэтому я предлагаю такое правило для использования git push --force: нельзя заменять коммиты дальше последнего публичного тага, или же дальше коммита, отправленного на сборку (без специальных усилий изменение такого коммита приведёт к тому, что следующая сборка будет отвергнута). | ||
Допустим, что эти условия выполнены, а исправления мелких/глупых ошибок не хочется оформлять отдельно. Для примера объясню, как поправить пред-предпоследний коммит. | |||
Сначала нужно сохранить текущую работу во временный бранч: | Сначала нужно сохранить текущую работу во временный бранч: | ||
Строка 34: | Строка 45: | ||
После этого уже можно сделать | После этого уже можно сделать | ||
<pre>$ git push --force git.alt</pre> | <pre>$ git push --force git.alt</pre> | ||
== Ссылки == | |||
<references/> | |||
{{Category navigation|title=git|category=git|sortkey={{SUBPAGENAME}}}} |
Текущая версия от 02:01, 13 марта 2010
Правка последнего коммита
Для правки последнего коммита достаточно git commit --amend, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения «заодно».
Правка коммитов в общем случае
В общем случае для редактирования коммитов удобно применять 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[1]
Иногда не хочется делать новые коммиты, которые являются мелкими исправлениями к предыдущим коммитам. Поэтому я предлагаю такое правило для использования git push --force: нельзя заменять коммиты дальше последнего публичного тага, или же дальше коммита, отправленного на сборку (без специальных усилий изменение такого коммита приведёт к тому, что следующая сборка будет отвергнута).
Допустим, что эти условия выполнены, а исправления мелких/глупых ошибок не хочется оформлять отдельно. Для примера объясню, как поправить пред-предпоследний коммит.
Сначала нужно сохранить текущую работу во временный бранч:
$ 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